isa-l/programs/igzip_cli_check.sh

262 lines
6.9 KiB
Bash
Raw Normal View History

#! /bin/bash
set -o pipefail
CWD=$PWD
SRC_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null && pwd )"
IGZIP="$SRC_DIR/igzip $@"
TEST_DIR="/tmp/igzip_cli_test_$$/"
TEST_FILE=$SRC_DIR/igzip
DIFF="diff -q"
mkdir -p $TEST_DIR
cd $TEST_DIR
cleanup ()
{
cd $CWD
rm -rf $TEST_DIR
exit $1
}
clear_dir ()
{
cd /tmp/
rm -rf $TEST_DIR
mkdir -p $TEST_DIR
cd $TEST_DIR
}
pass_check()
{
if [ $1 -eq 0 ]; then
echo -e "\e[1;32mPass\e[0;39m: " $2
else
echo -e "\e[1;31mFail\e[0;39m: " $2
cleanup 1
fi
}
fail_check()
{
if [ $1 -ne 0 ]; then
echo -e "\e[1;32mPass\e[0;39m: " $2
else
echo -e "\e[1;31mFail\e[0;39m: " $2
cleanup 1
fi
}
file1=tmp
file2=jnk
file3=blah
bad_file=not_a_file
dir=this_is_a_directory
default_suffix=".gz"
ds=$default_suffix
gzip_standard_suffixes=(".gz" ".z")
bad_suffix=".bad"
custom_suffix=".custom"
# Test basic compression and decompression
ret=0
cp $TEST_FILE $file1
$IGZIP $file1 && rm $file1 || ret=1
for suffix in ${gzip_standard_suffixes[@]}; do
if [ "$ds" != "$suffix" ]; then
cp -u $file1$ds $file1$suffix
fi
$IGZIP -d $file1$suffix && $DIFF $file1 $TEST_FILE || ret=1
rm $file1
done
pass_check $ret "Basic compression and decompression"
clear_dir
# Test piping
cat $TEST_FILE | $IGZIP | $IGZIP -d | $DIFF $TEST_FILE - || ret=1
cat $TEST_FILE | $IGZIP - | $IGZIP -d - | $DIFF $TEST_FILE - || ret=1
pass_check $ret "Piping compression and decompression"
# Test multiple concatenated gzip files
ret=0
(for i in `seq 3`; do $IGZIP -c $TEST_FILE ; done) | $IGZIP -t || ret=1
pass_check $ret "Multiple gzip concatenated files"
if command -V md5sum >/dev/null 2>&1; then
sum1=$((for i in `seq 15`; do $IGZIP -c $TEST_FILE; done) | $IGZIP -cd | md5sum)
sum2=$((for i in `seq 15`; do cat $TEST_FILE; done) | md5sum)
[[ "$sum1" == "$sum2" ]] && ret=0 || ret=1
pass_check $ret "Multiple large gzip concat test"
clear_dir
else
echo "Skip: Multiple large gzip concat test"
fi
#Test outifle options
$IGZIP $TEST_FILE -o $file2$ds && $IGZIP $file2$ds -d -o $file1 && \
test -f $file2$ds && test -f $file1 && $DIFF $TEST_FILE $file1
pass_check $? "Setting outfile name"
clear_dir
# Not a file test
ret=0
$IGZIP $bad_file &> /dev/null && ret=1
test -f $bad_file$ds && ret=1
pass_check $ret "Bad file"
clear_dir
# Multiple files
cp $TEST_FILE $file1 && cp $TEST_FILE $file2 && cp $TEST_FILE $file3 && \
$IGZIP $file1 $file2 $file3 && rm $file1 && rm $file2 && rm $file3 && \
$IGZIP -d $file1$ds $file2$ds $file3$ds && \
$DIFF $TEST_FILE $file1 && $DIFF $TEST_FILE $file2 && $DIFF $TEST_FILE $file3
pass_check $? "Multiple files compression and decompression"
clear_dir
# Multiple files, one doesn't exist
ret=0
cp $TEST_FILE $file1 && cp $TEST_FILE $file2 || ret=1
$IGZIP $file1 $bad_file $file2 &> /dev/null && ret=1
rm $file1 && rm $file2 || ret=1
$IGZIP -d $file1$ds $bad_file$ds $file2$ds &> /dev/null && ret=1
$DIFF $TEST_FILE $file1 && $DIFF $TEST_FILE $file2 || ret=1
pass_check $ret "Multiple files with a bad file"
clear_dir
# Custom suffix test
cp $TEST_FILE $file1 && $IGZIP -S $custom_suffix $file1 && rm $file1 && \
$IGZIP -d -S $custom_suffix $file1$custom_suffix && $DIFF $TEST_FILE $file1
pass_check $? "Custom suffix"
# Bad suffix test
ret=0
cp $TEST_FILE $file1 && $IGZIP -S $bad_suffix $file1 && rm $file1 || ret=1
$IGZIP -d $file1$custom_suffix &> /dev/null && ret=1
pass_check $ret "Bad suffix"
clear_dir
# Remove file test
ret=0
cp $TEST_FILE $file1 && $IGZIP --rm $file1 || ret=1
test -f $file1 && ret=1
$IGZIP --rm -d $file1$ds || ret=1
test -f $file1$ds && ret=1
pass_check $ret "Remove file"
clear_dir
# Pass a directory negative test
ret=0
mkdir -p $dir || ret=0
$IGZIP $dir &> /dev/null && ret=1
clear_dir
mkdir -p $dir$ds || ret=1
$IGZIP -d $dir &> /dev/null && ret=1
pass_check $ret "Compress/Decompress Directory without -r"
clear_dir
# Write permissions test
cp $TEST_FILE $file1
chmod 400 $file1
chmod 500 $TEST_DIR
$IGZIP $file1 &> /dev/null
fail_check $? "don't have write permissions"
chmod -R 700 $TEST_DIR
clear_dir
# Read permissions test
cp $TEST_FILE $file1
chmod 000 $file1
$IGZIP $file1 &> /dev/null
fail_check $? "don't have read permissions"
clear_dir
# File overwrite test -f
ret=0
cp $TEST_FILE $file1 && touch $file1$ds || ret=1
yes | $IGZIP $file1 &> /dev/null && ret=1
$IGZIP -f $file1 &> /dev/null && cp $file1$ds $file1 || ret=1
yes | $IGZIP -d $file1 &> /dev/null && ret=1
$IGZIP -df $file1$ds &> /dev/null && $DIFF $TEST_FILE $file1 || ret=1
pass_check $ret "Existing file overwrite only with force"
clear_dir
# Quiet suppresses interactivity
ret=0
cp $TEST_FILE $file1 && touch $file1$ds || ret=1
$IGZIP -q $file1 &> /dev/null && ret=1
$IGZIP -dq $file1 &> /dev/null && ret=1
pass_check $ret "Quiet will not overwrite"
clear_dir
# Input file and output file cannot be the same
ret=0
cp $TEST_FILE $file1 && $IGZIP $file1 -o $file1 &> /dev/null && ret=1
$DIFF $TEST_FILE $file1 &> /dev/null || ret=1
pass_check $ret "No in place compression"
clear_dir
# Input file and output file cannot be the same
ret=0
cp $TEST_FILE $file1 && $IGZIP $file1 -o $file1$ds &> /dev/null || ret=1
$IGZIP -do $file1 $file1 &> /dev/null && ret=1
$DIFF $TEST_FILE $file1 &> /dev/null || ret=1
pass_check $ret "No in place decompression"
clear_dir
ret=0
$IGZIP -n $TEST_FILE -o $file1$ds && $IGZIP -Nd $file1$ds && $DIFF $file1 $TEST_FILE || ret=1
pass_check $ret "Decompress name with no-name info"
clear_dir
ret=0
cp -p $TEST_FILE $file1 && sleep 1 &&\
$IGZIP -N $file1 -o $file1$ds && $IGZIP -Nfqd $file1$ds || ret=1
TIME_ORIG=$(stat --printf=\("%Y\n"\) $TEST_FILE)
TIME_NEW=$(stat --printf=\("%Y\n"\) $file1)
if [ "$TIME_ORIG" != "$TIME_NEW" ] ; then
ret=1
fi
pass_check $ret "Decompress with name info"
clear_dir
ret=0
cp -p $TEST_FILE $file1 && touch $file2\\
$IGZIP $file1 -o $file1$ds || ret=1
$IGZIP -t $file1$ds || ret=1
$IGZIP -t $file2 &> /dev/null && ret=1
cp $file1$ds $file2 && $IGZIP -t $file1$ds || ret=1
truncate -s -1 $file1$ds
$IGZIP -t $file1$ds &> /dev/null && ret=1
pass_check $ret "Test test"
clear_dir
# Large stream test with threading if enabled
ret=0
(for i in `seq 100`; do cat $TEST_FILE ; done) | $IGZIP -c -T 4 | $IGZIP -t || ret=1
pass_check $ret "Large stream test"
# Large stream tests with decompression and threading if enabled
if command -V md5sum >/dev/null 2>&1 && command -V dd >/dev/null 2>&1; then
ret=0
dd if=<(for i in `seq 1000`; do cat $TEST_FILE; done) iflag=fullblock bs=1M count=201 2> out.stder | tee >(md5sum > out.sum1) \
| $IGZIP -c -T 4 | $IGZIP -d | md5sum > out.sum2 \
&& $DIFF out.sum1 out.sum2 || ret=1
pass_check $ret "Large stream compress test"
clear_dir
if test -e /dev/urandom; then
ret=0
dd if=/dev/urandom iflag=fullblock bs=1M count=200 2> out.stder | tee >(md5sum > out.sum3) \
| $IGZIP -c -T 2 | $IGZIP -d | md5sum > out.sum4 \
&& $DIFF out.sum3 out.sum4 || ret=1
pass_check $ret "Large stream random data test"
clear_dir
fi
fi
echo "Passed all cli checks"
cleanup 0