3 # Copyright 2005 by Rob Landley <rob@landley.net>
4 # Licensed under GPLv2, see file LICENSE in this source tree.
10 # testing "test name" "commands" "expected result" "file input" "stdin"
11 # file input will be file called "input"
12 # test can create a file "actual" instead of writing to stdout
16 testing "grep (exit with error)" "grep nonexistent 2> /dev/null ; echo \$?" \
18 testing "grep (exit success)" "grep grep '$0' > /dev/null 2>&1 ; echo \$?" "0\n" \
20 # Test various data sources and destinations
22 testing "grep (default to stdin)" "grep two" "two\n" "" \
23 "one\ntwo\nthree\nthree\nthree\n"
24 testing "grep - (specify stdin)" "grep two -" "two\n" "" \
25 "one\ntwo\nthree\nthree\nthree\n"
26 testing "grep input (specify file)" "grep two input" "two\n" \
27 "one\ntwo\nthree\nthree\nthree\n" ""
29 # GNU grep 2.5.3 outputs a new line character after the located string
30 # even if there is no new line character in the input
31 testing "grep (no newline at EOL)" "grep bug input" "bug\n" "bug" ""
34 testing "grep two files" "grep two input empty 2>/dev/null" \
35 "input:two\n" "one\ntwo\nthree\nthree\nthree\n" ""
38 testing "grep - infile (specify stdin and file)" "grep two - input" \
39 "(standard input):two\ninput:two\n" "one\ntwo\nthree\n" \
40 "one\ntwo\ntoo\nthree\nthree\n"
42 # Check if we see the correct return value if both stdin and non-existing file
44 testing "grep - nofile (specify stdin and nonexisting file)" \
45 "grep two - nonexistent 2> /dev/null ; echo \$?" \
46 "(standard input):two\n(standard input):two\n2\n" \
47 "" "one\ntwo\ntwo\nthree\nthree\nthree\n"
48 testing "grep -q - nofile (specify stdin and nonexisting file, no match)" \
49 "grep -q nomatch - nonexistent 2> /dev/null ; echo \$?" \
50 "2\n" "" "one\ntwo\ntwo\nthree\nthree\nthree\n"
51 # SUSv3: If the -q option is specified, the exit status shall be zero
52 # if an input line is selected, even if an error was detected.
53 testing "grep -q - nofile (specify stdin and nonexisting file, match)" \
54 "grep -q two - nonexistent ; echo \$?" \
55 "0\n" "" "one\ntwo\ntwo\nthree\nthree\nthree\n"
57 # Test various command line options
58 # -s no error messages
59 testing "grep -s nofile (nonexisting file, no match)" \
60 "grep -s nomatch nonexistent ; echo \$?" "2\n" "" ""
61 testing "grep -s nofile - (stdin and nonexisting file, match)" \
62 "grep -s domatch nonexistent - ; echo \$?" \
63 "(standard input):domatch\n2\n" "" "nomatch\ndomatch\nend\n"
66 testing "grep handles NUL in files" "grep -a foo input" "\0foo\n" "\0foo\n\n" ""
67 testing "grep handles NUL on stdin" "grep -a foo" "\0foo\n" "" "\0foo\n\n"
69 testing "grep matches NUL" "grep . input > /dev/null 2>&1 ; echo \$?" \
74 testing "grep handles multiple regexps" "grep -e one -e two input ; echo \$?" \
75 "one\ntwo\n0\n" "one\ntwo\n" ""
76 testing "grep -F handles multiple expessions" "grep -F -e one -e two input ; echo \$?" \
77 "one\ntwo\n0\n" "one\ntwo\n" ""
78 testing "grep -F handles -i" "grep -F -i foo input ; echo \$?" \
82 testing "grep can read regexps from stdin" "grep -f - input ; echo \$?" \
83 "two\nthree\n0\n" "tw\ntwo\nthree\n" "tw.\nthr\n"
85 # -x (whole line match)
86 testing "grep -x (full match)" "grep -x foo input ; echo \$?" \
88 testing "grep -x (partial match 1)" "grep -x foo input ; echo \$?" \
90 testing "grep -x (partial match 2)" "grep -x foo input ; echo \$?" \
92 testing "grep -x -F (full match)" "grep -x -F foo input ; echo \$?" \
94 testing "grep -x -F (partial match 1)" "grep -x -F foo input ; echo \$?" \
96 testing "grep -x -F (partial match 2)" "grep -x -F foo input ; echo \$?" \
100 testing "grep -E supports extended regexps" "grep -E fo+" "foo\n" "" \
102 testing "grep is also egrep" "egrep foo" "foo\n" "" "foo\nbar\n"
103 testing "egrep is not case insensitive" \
104 "egrep foo ; [ \$? -ne 0 ] && echo yes" "yes\n" "" "FOO\n"
105 testing "grep -E -o prints all matches" \
106 "grep -E -o '([[:xdigit:]]{2}[:-]){5}[[:xdigit:]]{2}'" \
107 "00:19:3E:00:AA:5E\n00:1D:60:3D:3A:FB\n00:22:43:49:FB:AA\n" \
108 "" "00:19:3E:00:AA:5E 00:1D:60:3D:3A:FB 00:22:43:49:FB:AA\n"
111 testing "grep -o does not loop forever" \
115 testing "grep -o does not loop forever on zero-length match" \
116 'grep -o "" | head -n1' \
120 testing "grep -f EMPTY_FILE" \
126 testing "grep -v -f EMPTY_FILE" \
132 testing "grep -Fw matches only words" \
133 "grep -Fw foo input" \
138 testing "grep -Fw doesn't stop on 1st mismatch" \
139 "grep -Fw foo input" \
144 testing "grep -w doesn't stop on 1st mismatch" \
145 "grep -w foo input" \
150 testing "grep -w ^str doesn't match str not at the beginning" \
151 "grep -w ^str input" \
156 testing "grep -w ^ doesn't hang" \
162 testing "grep -w word doesn't match wordword" \
163 "grep -w word input" \
168 testing "grep -F -w w doesn't match ww" \
169 "grep -F -w w input" \
174 testing "grep -w word match second word" \
175 "grep -w word input" \
176 "bword,word\n""wordb,word\n""bwordb,word\n" \
177 "bword,word\n""wordb,word\n""bwordb,word\n" \
180 # -r on symlink to dir should recurse into dir
181 mkdir -p grep.testdir/foo
182 echo bar > grep.testdir/foo/file
183 ln -s foo grep.testdir/symfoo
184 testing "grep -r on symlink to dir" \
185 "grep -r . grep.testdir/symfoo" \
186 "grep.testdir/symfoo/file:bar\n" \
190 # But -r on dir/symlink_to_dir should not recurse into symlink_to_dir
191 mkdir -p grep.testdir/foo
192 echo bar > grep.testdir/foo/file
193 ln -s foo grep.testdir/symfoo
194 testing "grep -r on dir/symlink to dir" \
195 "grep -r . grep.testdir" \
196 "grep.testdir/foo/file:bar\n" \
200 # testing "test name" "commands" "expected result" "file input" "stdin"
201 # file input will be file called "input"
202 # test can create a file "actual" instead of writing to stdout