You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
362 lines
11 KiB
362 lines
11 KiB
12 months ago
|
#!/bin/bash
|
||
|
# Author: Iain Douglas <centos@1n6.org.uk>
|
||
|
|
||
|
# 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 <space> to <space><tab> 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"
|