#!/bin/bash # Author: Iain Douglas # Tests for diff # Basic Tests ExitFail() { t_Log "FAIL" exit $FAIL } t_Log "Running $0 - diff tests" diff -v &>/dev/null t_CheckExitStatus $? F1=/var/tmp/testf1.txt F2=/var/tmp/testf2.txt # Most of the following tests are taken from the examples in the info # documentation for diffutils. # # Create a couple of files to work with. We'll use sed to make changes as we # go. TEXT="Here lyeth muche rychnesse in lytell space. -- John Heywood" echo $TEXT >$F1 cp $F1 $F2 # Start by checking the options that determine how whitespace and case are # handled -E -b -w -B -i -I -q and their long form variants # Baseline check to ensure diff sees the files are the same. echo "Check files are the same" diff $F1 $F2 t_CheckExitStatus $? # Convert a to in F2 then check that diff sees the change # as it should. sed -i 's/ / \t/' $F2 echo "Check different files" diff $F1 $F2 &>/dev/null && ExitFail t_Log "PASS" # Convert the first space in $F1 to 4 spaces and check that -E and # --ignore-tab-expansion works and sees no difference between the # two files. echo "Check diff -E" sed -i 's/ / /' $F1 diff -E $F1 $F2 t_CheckExitStatus $? echo "Check diff --ignore-tab-expansion" diff --ignore-tab-expansion $F1 $F2 t_CheckExitStatus $? # reduce the 4 spaces to 3 and check diff -E sees a difference echo "Check diff -E sees a difference in whitespace" sed -i 's/ / /' $F1 diff -E $F1 $F2 &>/dev/null && ExitFail t_Log "PASS" # Check -b --ignore-space-change add some spaces to the end of the line # to make sure. sed -i 's/$/ /' $F1 echo "Check diff -b" diff -b $F1 $F2 t_CheckExitStatus $? echo "Check diff --ignore-space-change" diff --ignore-space-change $F1 $F2 t_CheckExitStatus $? # The -b option ignotes difference in whitespace where it already exists. # Check that whitespace added in $F1 where non exists in $F2 is caught by # -b echo "Check diff -b sees whitespace where non exists" sed -i 's/ss/s s/' $F1 diff -b $F1 $F2 &>/dev/null && ExitFail t_Log "PASS" # Check -w --ignore-all-space echo "Check diff -w" diff -w $F1 $F2 t_CheckExitStatus $? echo "Check diff --ignore-all-space" diff --ignore-all-space $F1 $F2 t_CheckExitStatus $? # Check -B --ignore blank lines, create some new files to work with first. echo $TEXT>$F1 echo $TEXT>>$F1 echo $TEXT>$F2 echo "" >>$F2 echo $TEXT>>$F2 # Check that diff sees the new test files are different. echo "-B --ignore blank lines, pre check files are different" diff $F1 $F2 &>/dev/null && ExitFail t_Log "PASS" echo "Check diff -B" diff -B $F1 $F2 t_CheckExitStatus $? echo "Check diff --ignore-blank-lines" diff --ignore-blank-lines $F1 $F2 t_CheckExitStatus $? # Check -i --ignore-case, first ensure that diff sees a difference in case, # as we're using the files from the earlier test we need to use the -B option # too. echo "Check test file is different" sed -i 's/l/L/g' $F1 diff -B $F1 $F2 &>/dev/null && ExitFail t_Log "PASS" # Check that -i causes diff to ignore the difference in case. echo "Check diff -i" diff -B -i $F1 $F2 t_CheckExitStatus $? echo "Check diff --ignore-case" diff -B --ignore-case $F1 $F2 t_CheckExitStatus $? # Check -I --ignore-matching-lines=regexp echo $TEXT >$F1 echo "1"$TEXT"1" >>$F1 echo "1"$TEXT >$F2 echo $TEXT >>$F2 echo "Check test files are different" diff $F1 $F2 &>/dev/null && ExitFail t_Log "PASS" echo "Check -I" diff -I '^[[:digit:]]' $F1 $F2 t_CheckExitStatus $? echo "Check --ignore-matching-lines=regexp" diff --ignore-matching-lines='^[[:digit:]]' $F1 $F2 t_CheckExitStatus $? # Check -q --brief echo "Check diff -q" diff -q $F1 $F2 | grep -q "Files /var/tmp/testf1.txt and /var/tmp/testf2.txt differ" t_CheckExitStatus $? echo "diff --brief" diff --brief $F1 $F2 | grep -q "Files /var/tmp/testf1.txt and /var/tmp/testf2.txt differ" t_CheckExitStatus $? # Check output formats are correct, again the examples from the info docs are # used in the tests as are the lao and tzu texts. As we've previously testes # cmp it should be safe to use to compare the generated output against known # correct output. # # start with normal format echo "Check diff output formats" DIR=./tests/p_diffutils FILES="$DIR"/files echo "Check normal output format" diff "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/normal_format - t_CheckExitStatus $? # Check contxt format - note that this outputs time information that we will # ignore by skipping the first 3 lines echo Check default context format -c diff -c "$FILES"/lao "$FILES"/tzu | tail -n +3 | cmp "$FILES"/context_format - t_CheckExitStatus $? # Check contect format with only 1 line echo "Check context format with Less Context -C 1" diff -C 1 "$FILES"/lao "$FILES"/tzu | tail -n +3 | cmp "$FILES"/context_format-1 - t_CheckExitStatus $? # Check unified format again there are timestams which we will ignore echo "Check unified format " diff -u "$FILES"/lao "$FILES"/tzu | tail -n +3 | cmp "$FILES"/unified_format - t_CheckExitStatus $? # Check unified shortend format -U lines and the long form option # --unified=lines, in both cases we'll use 1 for lines. echo "Check unified output with less context -U 1" diff -U 1 "$FILES"/lao "$FILES"/tzu | tail -n +3 | cmp "$FILES"/unified_format-1 - t_CheckExitStatus $? echo "Check unified output with less context --unified=1" diff --unified=1 "$FILES"/lao "$FILES"/tzu | tail -n +3 | cmp "$FILES"/unified_format-1 - t_CheckExitStatus $? # Check we can change the labels echo "Check the --label option" diff -C 2 --label=original --label=modified "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/label-change t_CheckExitStatus $? # Check side-by-side output width = 72 echo "Check side-by-side" output -y -W 72 diff -t -y -W 72 "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/side-by-side-W72 - t_CheckExitStatus $? # Check side-by-side with left column suppression echo "Check left column suppression in side-by-side output" diff --width=72 -y --left-column "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/left_column t_CheckExitStatus $? # Check side-by-side with common line suppression echo "Check left column suppression in side-by-side output" diff --width=72 -y --suppress-common-lines "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/supress_common_lines - t_CheckExitStatus $? # Check an ed script is correctly generated echo "Check an ed script is correctly generated diff -e" diff -e "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/ed_script - t_CheckExitStatus $? # Check diff -f --forward-ed works echo "Check that a forward ed script is generated -f " diff -f "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/ed_script-f - t_CheckExitStatus $? echo "Check that a forward ed script is generated --forward-ed " diff --forward-ed "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/ed_script-f - t_CheckExitStatus $? # Check RCS script generation -n --rcs echo "Check RCS scripts are generated -n" diff -n "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/rcs_script - t_CheckExitStatus $? echo "Check RCS scripts are generated --rcs" diff --rcs "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/rcs_script - t_CheckExitStatus $? # Check if-then-else output diff -D --ifdef echo "Check -D output" diff -DTWO "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/if_then_else - t_CheckExitStatus $? echo "Check --ifdef output" diff --ifdef=TWO "$FILES"/lao "$FILES"/tzu | cmp "$FILES"/if_then_else - t_CheckExitStatus $? # Check Incomplete last line (no \n) echo "Checking incomplete last line - normal" diff "$FILES"/F "$FILES"/G | cmp "$FILES"/F-G - t_CheckExitStatus $? echo "Checking incomplete last line -n" diff -n "$FILES"/F "$FILES"/G | cmp "$FILES"/n_F-G - t_CheckExitStatus $? echo "Checking incomplete last line -e" diff -e "$FILES"/F "$FILES"/G 2>&1 | cmp "$FILES"/e_F-G t_CheckExitStatus $? # Check diff output to -l --paginate, the header is variable so skip over it echo "Check diff output to pager -l" diff -l "$FILES"/lao "$FILES"/tzu |tail -n +4 | cmp "$FILES"/paginate - t_CheckExitStatus $? echo "Check diff output to pager -l" diff -l "$FILES"/lao "$FILES"/tzu | tail -n +4 | cmp "$FILES"/paginate - t_CheckExitStatus $? # Directories tested from here down # Setup a directory structure and populate it with files to work with # DIRTEST=/var/tmp/difftest [[ -d "$DIRTEST" ]] && rm -r "$DIRTEST" mkdir "$DIRTEST" mkdir -p "$DIRTEST"/a/1 mkdir -p "$DIRTEST"/b/1 cp "$FILES"/lao "$DIRTEST"/a cp "$FILES"/lao "$DIRTEST"/b cp "$FILES"/tzu "$DIRTEST"/a cp "$FILES"/tao "$DIRTEST"/a/1 # Check plain diff of 2 directories echo "Check basic directory comparison" diff "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir - t_CheckExitStatus $? # Check -s --report-identical-files echo "Check identical files reported -s" diff -s "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_s - t_CheckExitStatus $? echo "Check identical files reported --report-identical-files" diff --report-identical-files "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_s - t_CheckExitStatus $? # Check recursive directory diff echo "Check recursive directory diff -r" diff -sr "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_r - t_CheckExitStatus $? echo "Check recursive directory diff --recursive" diff -s --recursive "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_r - t_CheckExitStatus $? # Check -N --new-file output echo "Check directory diff -N" diff -Nsr "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_N - t_CheckExitStatus $? echo "Check directory diff --new-file" diff --new-file -sr "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_new_file - t_CheckExitStatus $? # Check diff --unidirectional-new-file. Swap the command line arguments # around to make this work echo "Check directory diff --unidirectional-new-file" diff --unidirectional-new-file "$DIRTEST"/b "$DIRTEST"/a | cmp "$FILES"/dir_unidirectional - t_CheckExitStatus $? # Check we can ignore patterns with diff in directory mode -x echo "Check diff -x excludes file patterns" diff -x tz* "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_x - t_CheckExitStatus $? # Check we can ignore patterns read from a file with diff in directory mode # -X --exclude-from= echo "Check diff -X excludes file patterns" diff -X "$FILES"/exclude "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_x - t_CheckExitStatus $? echo "Check diff --exclude-from excludes file patterns" diff --exclude-from="$FILES"/exclude "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_x - t_CheckExitStatus $? # Check we can exclude differences based on file name case # https://bugzilla.redhat.com/show_bug.cgi?id=719001 # mv "$DIRTEST"/a/lao "$DIRTEST"/a/LAO echo "Checking --ignore-file-name-case" echo "see https://bugzilla.redhat.com/show_bug.cgi?id=719001" echo "If this fails then the bug has been fixed" if [ "$centos_ver" -ge 7 ];then echo SKIP else diff --ignore-file-name-case "$DIRTEST"/a "$DIRTEST"/b | cmp "$FILES"/dir_case t_CheckExitStatus $? fi # Check the --to-file option echo "Checking the --to-file option against a file" diff --to-file $FILES/lao $DIRTEST/a/LAO t_CheckExitStatus $? echo "Checking the --to-file option against a directory" diff --to-file $FILES/lao $DIRTEST/b t_CheckExitStatus $? rm -f "$F1" rm -f "$F2" rm -r "$DIRTEST"