aboutsummaryrefslogtreecommitdiff
path: root/tests/find.test
blob: 9129a605025f0cf71eba479870fc29f12ce960a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash

[ -f testing.sh ] && . testing.sh

mkdir dir
cd dir
touch file
mkfifo fifo
# fs timestamp granularity isn't always enough for -newer to tell, so wait
sleep .1
ln -s fifo link
cd ..
touch b

mkdir perm
touch perm/all-read-only
chmod a=r perm/all-read-only

#testing "name" "command" "result" "infile" "stdin"

# Testing operators

testing "-type l -a -type d -o -type p" \
	"find dir -type l -a -type d -o -type p" "dir/fifo\n" "" ""
testing "-type l -type d -o -type p" "find dir -type l -type d -o -type p" \
	"dir/fifo\n" "" ""
testing "-type l -o -type d -a -type p" \
	"find dir -type l -o -type d -a -type p" "dir/link\n" "" ""
testing "-type l -o -type d -type p" "find dir -type l -o -type d -type p" \
	"dir/link\n" "" ""
testing "-type l ( -type d -o -type l )" \
	"find dir -type l \( -type d -o -type l \)" "dir/link\n" "" ""
testing "extra parentheses" \
	"find dir \( \( -type l \) \( -type d -o \( \( -type l \) \) \) \)" \
	"dir/link\n" "" ""
testing "( -type p -o -type d ) -type p" \
	"find dir \( -type p -o -type d \) -type p" "dir/fifo\n" "" ""
testing "-type l -o -type d -type p -o -type f" \
	"find dir -type l -o -type d -type p -o -type f | sort" \
	"dir/file\ndir/link\n" "" ""

# Testing short-circuit evaluations

testing "-type f -a -print" \
	"find dir -type f -a -print" "dir/file\n" "" ""
testing "-print -o -print" \
	"find dir -type f -a \( -print -o -print \)" "dir/file\n" "" ""

# these were erroring or segfaulting:
# find -type f -user nobody -exec : \;
# find -type f -user nobody -exec : -exec : \;

# Testing previous failures

testing "-type f -user -exec" \
  "find dir -type f -user $USER -exec ls {} \\;" "dir/file\n" "" ""
testing "-type l -newer -exec" \
  "find dir -type l -newer dir/file -exec ls {} \\;" "dir/link\n" "" ""
testing "-exec true \\; -print" \
  "find dir/file -exec true \\; -print" "dir/file\n" "" ""
testing "-exec false \\; -print" \
  "find dir/file -exec false \\; -print" "" "" ""
testing "-perm (exact success)" \
  "find perm -type f -perm 0444" "perm/all-read-only\n" "" ""
testing "-perm (exact failure)" \
  "find perm -type f -perm 0400" "" "" ""
testing "-perm (min success)" \
  "find perm -type f -perm -0400" "perm/all-read-only\n" "" ""
testing "-perm (min failure)" \
  "find perm -type f -perm -0600" "" "" ""
testing "-perm (any success)" \
  "find perm -type f -perm -0444" "perm/all-read-only\n" "" ""
testing "-perm (any failure)" \
  "find perm -type f -perm -0222" "" "" ""

testing "unterminated -exec {}" \
  "find dir -type f -exec ls {} 2>/dev/null || echo bad" "bad\n" "" ""
testing "-exec {} +" \
  "find dir -type f -exec ls {} +" "dir/file\n" "" ""

# `find . -iname` was segfaulting
testing "-name file" "find dir -name file" "dir/file\n" "" ""
testing "-name FILE" "find dir -name FILE" "" "" ""

testing "-iname file" "find dir -iname FILE" "dir/file\n" "" ""
testing "-iname FILE" "find dir -iname FILE" "dir/file\n" "" ""


testing "-name (no arguments)" \
  "find dir -name 2>&1 | grep -o '[-]name'" "-name\n" "" ""
testing "-iname (no arguments)" \
  "find dir -iname 2>&1 | grep -o '[-]iname'" "-iname\n" "" ""

testing "" "find dir \( -iname file -o -iname missing \) -exec echo {} \;" \
  "dir/file\n" "" ""

testing "-path glob" "find dir -path 'dir*e'" "dir/file\n" "" ""
testing "-wholename glob" "find dir -wholename 'dir*e'" "dir/file\n" "" ""
testing "-ipath glob" "find dir -ipath 'dIr*E'" "dir/file\n" "" ""
testing "-iwholename glob" "find dir -iwholename 'dIr*E'" "dir/file\n" "" ""
testing "-printf" "find dir -name file -printf '%f %p %P %s'" \
  "file dir/file file 0" "" ""
testing "-printf .N" "find dir -name file -printf %.2f" "fi" "" ""
# findutils find supports C letter escapes and \0 octal, but not \x or \u.
testing "-printf escapes" \
  "find dir -name file -printf '\0 \007 \t \079' | xxd -p" \
  "0020072009200739\n" "" ""
# findutils find treats \c as "no more output from this -printf", not "no more
# output from find".
testing "-printf \\c escape" "find dir -name f* -printf 'x\cy'" "xx" "" ""

# No error message for a dangling link.
ln -s does-not-exist dir/dangler
testing "-L dangling symlink silent" \
  "LANG=C find -L dir -name file 2>&1" "dir/file\n" "" ""
rm -f dir/dangler

# An error for a symlink loop.
ln -s looper dir/looper
testing "-L symlink loop noisy" \
  "LANG=C find -L dir -name file 2>err ; grep -q dir/looper err || echo missing error" \
  "dir/file\n" "" ""
rm -f dir/looper err

testing "-false" "find dir -false" "" "" ""
testing "-true" "find dir/file -true" "dir/file\n" "" ""

testing "missing root error" \
  "LANG=C find -L dir/missing-root 2>err ; grep -q dir/missing-root err || echo missing error" \
  "" "" ""

testing "-path match root" "find dir/f* -path dir/file" "dir/file\n" "" ""
testing "-name match root" "find dir/f* -name file" "dir/file\n" "" ""

rm -rf dir