diff --git a/tests/Squashfs-compression-test.sh b/tests/Squashfs-compression-test.sh new file mode 100755 index 0000000..64322f9 --- /dev/null +++ b/tests/Squashfs-compression-test.sh @@ -0,0 +1,123 @@ +#!/bin/bash + +# We need rpmdev-vercmp +dnf install -y rpmdevtools +rpm -q rpmdevtools > /dev/null 2>&1 || (echo 'rpmdev-vercmp from rpmdevtools is needed to run this script, aborting (failed).'; exit 1) + +# Define block sizes +blocks=(4K 1M) + +# Define fill files +fill=(/dev/zero /dev/urandom) + +# Define number of iterations +iter=5 + +# Define fragment sizes +frags=(0 1 2047 4095) + +# Define test directory +testdir=/tmp/test-squashfs + +# Define mount point +mp=${testdir}/mnt + +# Define data directory +datadir=${testdir}/data + +# Check for squashfs-tools version and set compression types to test +sqfsver=`rpm -q --qf '%{EVR}' squashfs-tools` +if rpmdev-vercmp 4.1 ${sqfsver} > /dev/null; [ $? == '11' ]; then + ucomp=('gzip') +elif rpmdev-vercmp 4.2 ${sqfsver} > /dev/null; [ $? == '11' ]; then + ucomp=(gzip lzo lzma) +elif rpmdev-vercmp 4.3-1 ${sqfsver} > /dev/null; [ $? == '11' ]; then + ucomp=(gzip lzo lzma xz) +elif rpmdev-vercmp 4.3-21 ${sqfsver} > /dev/null; [ $? == '11' ]; then + ucomp=(gzip lzo lzma xz lz4) +else + ucomp=(gzip lzo lzma xz lz4 zstd) +fi + +# Check for kernel verion and set mount test compression types +kernel=`uname -r` +if rpmdev-vercmp 2.6.36 ${kernel} > /dev/null; [ $? == '11' ]; then + mcomp=('gzip') +elif rpmdev-vercmp 2.6.38 ${kernel} > /dev/null; [ $? == '11' ]; then + mcomp=(gzip lzo) +elif rpmdev-vercmp 3.19 ${kernel} > /dev/null; [ $? == '11' ]; then + mcomp=(gzip lzo xz) +elif rpmdev-vercmp 4.14 ${kernel} > /dev/null; [ $? == '11' ]; then + mcomp=(gzip lzo xz lz4) +else + mcomp=(gzip lzo xz lz4 zstd) +fi + +# Check for uid 0 and print a warning if not +[ ${UID} -ne 0 ] && echo 'Mount tests will not be performed when not running as root' + +# Check if test directory exists and make if not +[ -d ${testdir} ] || mkdir ${testdir} +[ -d ${testdir} ] || (echo "Unable to make '${testdir}', aborting (failed)."; exit 1) + +# Check if mount point directory exists and make if not +[ -d ${mp} ] || mkdir ${mp} +[ -d ${mp} ] || (echo "Unable to make '${mp}', aborting (failed)."; exit 1) + +# Check if data directory exists and make if not +if [ -d ${datadir} ]; then + echo "Using existing data directory." +else + echo "Building data directory." + mkdir ${datadir} + [ -d ${datadir} ] || (echo "Unable to make '${datadir}', aborting (failed)."; exit 1) + for size in ${frags[*]}; do + for file in ${fill[*]}; do + dd if=${file} of=${datadir}/frag-`basename ${file}`-${size} bs=1 count=${size} > /dev/null 2>&1 + done + done + for size in ${blocks[*]}; do + for ((count=1;${count}<=${iter};count++)); do + for file in ${fill[*]}; do + dd if=${file} of=${datadir}/file-`basename ${file}`-${size}-${count} bs=${size} count=${count} > /dev/null 2>&1 + done + done + done + for size1 in ${frags[*]}; do + for file1 in ${fill[*]}; do + for size2 in ${blocks[*]}; do + for ((count=1;${count}<=${iter};count++)); do + for file2 in ${fill[*]}; do + cat ${datadir}/file-`basename ${file2}`-${size2}-${count} ${datadir}/frag-`basename ${file1}`-${size1} > ${datadir}/combined-`basename ${file2}`-${size2}-${count}-`basename ${file1}`-${size1} + done + done + done + done + done +fi + +# Run unmounted tests +for comp in ${ucomp[*]}; do + echo "Building squashfs image using ${comp} compression." + if [ "${comp}" == gzip ]; then + mksquashfs ${datadir} ${testdir}/sq.img || (echo "mksquashfs failed for ${comp} compression."; continue) + else + mksquashfs ${datadir} ${testdir}/sq.img -comp ${comp} || (echo "mksquashfs failed for ${comp} compression."; continue) + fi + echo "Testing unmounted extract using ${comp} compression." + unsquashfs -d ${testdir}/sq ${testdir}/sq.img || echo "unsquashfs failed for ${comp} compression." + diff -r -q ${testdir}/sq ${datadir} || (echo "Extract test failed for ${comp} compression."; exit) + rm -rf ${testdir}/sq + if [ ${UID} == 0 ]; then + for kern in ${mcomp[*]}; do + if [ ${kern} == ${comp} ]; then + echo "Testing mounted image using ${comp} compression." + mount -r -o loop ${testdir}/sq.img ${mp} || echo "Mount failed."; + diff -r -q ${mp} ${datadir} || echo "Mounted test failed for ${comp} compression." + umount ${mp} + break + fi + done + fi + rm -f ${testdir}/sq ${testdir}/sq.img +done diff --git a/tests/test_working.yml b/tests/test_working.yml new file mode 100644 index 0000000..c542b61 --- /dev/null +++ b/tests/test_working.yml @@ -0,0 +1,27 @@ +--- +- hosts: localhost + vars: + - artifacts: ./artifacts + tags: + - classic + remote_user: root + tasks: + - name: Install the test files + copy: src={{ item.file }} dest=/usr/local/bin/{{ item.dest }} mode=0755 + with_items: + - {file: Squashfs-compression-test.sh, dest: Squashfs-compression-test.sh } + - name: Test block + block: + - name: Execute the tests + shell: | + /usr/local/bin/Squashfs-compression-test.sh &> /tmp/test.log; grep -iq failed /tmp/test.log && result=fail || result=pass + echo -e "results:\n- {result: $result, test: working}" > /tmp/results.yml + always: + - name: Pull out the logs + fetch: + dest: "{{ artifacts }}/" + src: "{{ item }}" + flat: yes + with_items: + - /tmp/test.log + - /tmp/results.yml diff --git a/tests/tests.yml b/tests/tests.yml new file mode 100644 index 0000000..ce4a407 --- /dev/null +++ b/tests/tests.yml @@ -0,0 +1 @@ +- import_playbook: test_working.yml