2 # Copyright (c) 2016 Jilles Tjoelker
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
8 # 1. Redistributions of source code must retain the above copyright
9 # notice, this list of conditions and the following disclaimer.
10 # 2. Redistributions in binary form must reproduce the above copyright
11 # notice, this list of conditions and the following disclaimer in the
12 # documentation and/or other materials provided with the distribution.
14 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 # ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 copy_to_nonexistent_with_opts() {
30 printf 'test\n123\r456\r\n789\0z' >testf
31 atf_check install "$@" testf copyf
32 cmp testf copyf || atf_fail "bad copy"
33 [ ! testf -nt copyf ] || atf_fail "bad timestamp"
34 [ ! -e copyf.bak ] || atf_fail "no backup expected"
37 atf_test_case copy_to_nonexistent
38 copy_to_nonexistent_body() {
39 copy_to_nonexistent_with_opts
42 atf_test_case copy_to_nonexistent_safe
43 copy_to_nonexistent_safe_body() {
44 copy_to_nonexistent_with_opts -S
47 atf_test_case copy_to_nonexistent_comparing
48 copy_to_nonexistent_comparing_body() {
49 copy_to_nonexistent_with_opts -C
52 atf_test_case copy_to_nonexistent_safe_comparing
53 copy_to_nonexistent_safe_comparing_body() {
54 copy_to_nonexistent_with_opts -S -C
57 atf_test_case copy_to_nonexistent_backup
58 copy_to_nonexistent_backup_body() {
59 copy_to_nonexistent_with_opts -b -B.bak
62 atf_test_case copy_to_nonexistent_backup_safe
63 copy_to_nonexistent_backup_safe_body() {
64 copy_to_nonexistent_with_opts -b -B.bak -S
67 atf_test_case copy_to_nonexistent_preserving
68 copy_to_nonexistent_preserving_body() {
69 copy_to_nonexistent_with_opts -p
70 [ ! testf -ot copyf ] || atf_fail "bad timestamp 2"
73 copy_self_with_opts() {
74 printf 'test\n123\r456\r\n789\0z' >testf
75 printf 'test\n123\r456\r\n789\0z' >testf2
76 atf_check -s not-exit:0 -o empty -e match:. install "$@" testf testf
77 cmp testf testf2 || atf_fail "file changed after self-copy attempt"
80 atf_test_case copy_self
85 atf_test_case copy_self_safe
86 copy_self_safe_body() {
87 copy_self_with_opts -S
90 atf_test_case copy_self_comparing
91 copy_self_comparing_body() {
92 copy_self_with_opts -C
95 atf_test_case copy_self_safe_comparing
96 copy_self_safe_comparing_body() {
97 copy_self_with_opts -S -C
100 overwrite_with_opts() {
101 printf 'test\n123\r456\r\n789\0z' >testf
102 printf 'test\n123\r456\r\n789\0w' >otherf
103 atf_check install "$@" testf otherf
104 cmp testf otherf || atf_fail "bad overwrite"
105 [ ! testf -nt otherf ] || atf_fail "bad timestamp"
108 atf_test_case overwrite
113 atf_test_case overwrite_safe
114 overwrite_safe_body() {
115 overwrite_with_opts -S
118 atf_test_case overwrite_comparing
119 overwrite_comparing_body() {
120 overwrite_with_opts -C
123 atf_test_case overwrite_safe_comparing
124 overwrite_safe_comparing_body() {
125 overwrite_with_opts -S -C
128 overwrite_eq_with_opts() {
129 printf 'test\n123\r456\r\n789\0z' >testf
130 printf 'test\n123\r456\r\n789\0z' >otherf
131 atf_check install "$@" testf otherf
132 cmp testf otherf || atf_fail "bad overwrite"
133 [ ! testf -nt otherf ] || atf_fail "bad timestamp"
136 atf_test_case overwrite_eq
137 overwrite_eq_body() {
138 overwrite_eq_with_opts
141 atf_test_case overwrite_eq_safe
142 overwrite_eq_safe_body() {
143 overwrite_eq_with_opts -S
146 atf_test_case overwrite_eq_comparing
147 overwrite_eq_comparing_body() {
148 overwrite_eq_with_opts -C
151 atf_test_case overwrite_eq_safe_comparing
152 overwrite_eq_safe_comparing_body() {
153 overwrite_eq_with_opts -S -C
156 overwrite_backup_with_opts() {
157 printf 'test\n123\r456\r\n789\0z' >testf
158 printf 'test\n123\r456\r\n789\0w' >otherf
159 printf 'test\n123\r456\r\n789\0w' >otherf2
160 atf_check install -b -B.bak "$@" testf otherf
161 cmp testf otherf || atf_fail "bad overwrite"
162 [ ! testf -nt otherf ] || atf_fail "bad timestamp"
163 cmp otherf.bak otherf2 || atf_fail "bad backup"
166 atf_test_case overwrite_backup
167 overwrite_backup_body() {
168 overwrite_backup_with_opts
171 atf_test_case overwrite_backup_safe
172 overwrite_backup_safe_body() {
173 overwrite_backup_with_opts -S
176 atf_test_case overwrite_backup_comparing
177 overwrite_backup_comparing_body() {
178 overwrite_backup_with_opts -C
181 atf_test_case overwrite_backup_safe_comparing
182 overwrite_backup_safe_comparing_body() {
183 overwrite_backup_with_opts -S -C
187 cat <<\STRIPBIN >stripbin
189 [ "$1" = "-o" ] && dst="$2" && shift 2
190 [ "$1" = "--" ] && shift
191 [ -z "$dst" ] && dst="$1"
193 [ "$1" = "true" ] && cmd="cat" || cmd="tr z @"
194 echo $cmd '<"$1" >"$1.new" && mv -- "$1.new" "$dst"' >>stripbin
196 export STRIPBIN="$PWD/stripbin"
199 strip_changing_with_opts() {
201 printf 'test\n123\r456\r\n789\0z' >testf
202 atf_check install -s "$@" testf copyf
203 [ ! testf -nt copyf ] || atf_fail "bad timestamp"
204 printf 'test\n123\r456\r\n789\0@' >otherf
205 cmp otherf copyf || atf_fail "bad stripped copy"
208 atf_test_case strip_changing
209 strip_changing_body() {
210 strip_changing_with_opts
213 atf_test_case strip_changing_comparing
214 strip_changing_comparing_body() {
215 strip_changing_with_opts -C
218 strip_changing_overwrite_with_opts() {
220 printf 'test\n123\r456\r\n789\0z' >testf
221 printf 'test\n123\r456\r\n789\0w' >copyf
222 atf_check install -s "$@" testf copyf
223 [ ! testf -nt copyf ] || atf_fail "bad timestamp"
224 printf 'test\n123\r456\r\n789\0@' >otherf
225 cmp otherf copyf || atf_fail "bad stripped copy"
228 atf_test_case strip_changing_overwrite
229 strip_changing_overwrite_body() {
230 strip_changing_overwrite_with_opts
233 atf_test_case strip_changing_overwrite_comparing
234 strip_changing_overwrite_comparing_body() {
235 strip_changing_overwrite_with_opts -C
238 strip_changing_overwrite_eq_with_opts() {
240 printf 'test\n123\r456\r\n789\0z' >testf
241 printf 'test\n123\r456\r\n789\0@' >copyf
242 atf_check install -s "$@" testf copyf
243 [ ! testf -nt copyf ] || atf_fail "bad timestamp"
244 printf 'test\n123\r456\r\n789\0@' >otherf
245 cmp otherf copyf || atf_fail "bad stripped copy"
248 atf_test_case strip_changing_overwrite_eq
249 strip_changing_overwrite_eq_body() {
250 strip_changing_overwrite_eq_with_opts
253 atf_test_case strip_changing_overwrite_eq_comparing
254 strip_changing_overwrite_eq_comparing_body() {
255 strip_changing_overwrite_eq_with_opts -C
258 atf_test_case strip_noop
261 printf 'test\n123\r456\r\n789\0z' >testf
262 atf_check install -s testf copyf
263 [ ! testf -nt copyf ] || atf_fail "bad timestamp"
264 printf 'test\n123\r456\r\n789\0z' >otherf
265 cmp otherf copyf || atf_fail "bad stripped copy"
268 atf_test_case hard_link
270 printf 'test\n123\r456\r\n789\0z' >testf
271 atf_check install -l h testf copyf
272 [ testf -ef copyf ] || atf_fail "not same file"
273 [ ! -L copyf ] || atf_fail "copy is symlink"
276 atf_test_case symbolic_link
277 symbolic_link_body() {
278 printf 'test\n123\r456\r\n789\0z' >testf
279 atf_check install -l s testf copyf
280 [ testf -ef copyf ] || atf_fail "not same file"
281 [ -L copyf ] || atf_fail "copy is not symlink"
284 atf_test_case symbolic_link_absolute
285 symbolic_link_absolute_body() {
286 printf 'test\n123\r456\r\n789\0z' >testf
287 atf_check install -l sa testf copyf
288 [ testf -ef copyf ] || atf_fail "not same file"
289 [ -L copyf ] || atf_fail "copy is not symlink"
290 copyf_path=$(readlink copyf)
291 testf_path="$(pwd -P)/testf"
292 if [ "$copyf_path" != "$testf_path" ]; then
293 atf_fail "unexpected symlink contents ('$copyf_path' != '$testf_path')"
297 atf_test_case symbolic_link_relative
298 symbolic_link_relative_body() {
299 printf 'test\n123\r456\r\n789\0z' >testf
300 atf_check install -l sr testf copyf
301 [ testf -ef copyf ] || atf_fail "not same file"
302 [ -L copyf ] || atf_fail "copy is not symlink"
303 copyf_path=$(readlink copyf)
305 if [ "$copyf_path" != "$testf_path" ]; then
306 atf_fail "unexpected symlink contents ('$copyf_path' != '$testf_path')"
310 atf_test_case symbolic_link_relative_absolute_source_and_dest1
311 symbolic_link_relative_absolute_source_and_dest1_head() {
312 atf_set "descr" "Verify -l rs with absolute paths (.../copyf -> .../a/b/c/testf)"
314 symbolic_link_relative_absolute_source_and_dest1_body() {
316 src_path_prefixed=$PWD/$src_path
319 atf_check mkdir -p a/b/c
320 atf_check touch $src_path
321 atf_check install -l sr $src_path_prefixed $dest_path
322 [ $src_path_prefixed -ef $dest_path ] || atf_fail "not same file"
323 [ -L $dest_path ] || atf_fail "copy is not symlink"
324 dest_path_relative=$(readlink $dest_path)
325 src_path_relative="$src_path"
326 if [ "$src_path_relative" != "$dest_path_relative" ]; then
327 atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')"
331 atf_test_case symbolic_link_relative_absolute_source_and_dest1_double_slash
332 symbolic_link_relative_absolute_source_and_dest1_double_slash_head() {
333 atf_set "descr" "Verify -l rs with absolute paths (.../copyf -> .../a/b/c/testf), using double-slashes"
335 symbolic_link_relative_absolute_source_and_dest1_double_slash_body() {
336 src_path=a//b//c//testf
337 src_path_prefixed=$PWD/$src_path
340 atf_check mkdir -p a/b/c
341 atf_check touch $src_path
342 atf_check install -l sr $src_path_prefixed $dest_path
343 [ $src_path_prefixed -ef $dest_path ] || atf_fail "not same file"
344 [ -L $dest_path ] || atf_fail "copy is not symlink"
345 dest_path_relative=$(readlink $dest_path)
346 src_path_relative="$(echo $src_path | sed -e 's,//,/,g')"
347 if [ "$src_path_relative" != "$dest_path_relative" ]; then
348 atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')"
352 atf_test_case symbolic_link_relative_absolute_source_and_dest2
353 symbolic_link_relative_absolute_source_and_dest2_head() {
354 atf_set "descr" "Verify -l rs with absolute paths (.../a/b/c/copyf -> .../testf)"
356 symbolic_link_relative_absolute_source_and_dest2_body() {
358 src_path_prefixed=$PWD/$src_path
359 dest_path=$PWD/a/b/c/copyf
361 atf_check mkdir -p a/b/c
362 atf_check touch $src_path
363 atf_check install -l sr $src_path_prefixed $dest_path
364 [ $src_path_prefixed -ef $dest_path ] || atf_fail "not same file"
365 [ -L $dest_path ] || atf_fail "copy is not symlink"
366 dest_path_relative=$(readlink $dest_path)
367 src_path_relative="../../../$src_path"
368 if [ "$src_path_relative" != "$dest_path_relative" ]; then
369 atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')"
373 atf_test_case mkdir_simple
374 mkdir_simple_body() {
375 atf_check install -d dir1/dir2
376 [ -d dir1 ] || atf_fail "dir1 missing"
377 [ -d dir1/dir2 ] || atf_fail "dir2 missing"
378 atf_check install -d dir1/dir2/dir3
379 [ -d dir1/dir2/dir3 ] || atf_fail "dir3 missing"
380 atf_check install -d dir1
381 atf_check install -d dir1/dir2/dir3
384 atf_test_case symbolic_link_relative_absolute_common
385 symbolic_link_relative_absolute_common_head() {
386 atf_set "descr" "Verify -l rs with absolute paths having common components"
388 symbolic_link_relative_absolute_common_body() {
391 src_path_prefixed=$PWD/$src_path
392 dest_path=$PWD/libexec/
393 src_file=$src_path_prefixed/$filename
394 dest_file=$dest_path/$filename
396 atf_check mkdir $src_path_prefixed $dest_path
397 atf_check touch $src_file
398 atf_check install -l sr $src_file $dest_path
400 dest_path_relative=$(readlink $dest_file)
401 src_path_relative="../lib/$filename"
402 if [ "$src_path_relative" != "$dest_path_relative" ]; then
403 atf_fail "unexpected symlink contents ('$src_path_relative' != '$dest_path_relative')"
407 atf_init_test_cases() {
408 atf_add_test_case copy_to_nonexistent
409 atf_add_test_case copy_to_nonexistent_safe
410 atf_add_test_case copy_to_nonexistent_comparing
411 atf_add_test_case copy_to_nonexistent_safe_comparing
412 atf_add_test_case copy_to_nonexistent_backup
413 atf_add_test_case copy_to_nonexistent_backup_safe
414 atf_add_test_case copy_to_nonexistent_preserving
415 atf_add_test_case copy_self
416 atf_add_test_case copy_self_safe
417 atf_add_test_case copy_self_comparing
418 atf_add_test_case copy_self_safe_comparing
419 atf_add_test_case overwrite
420 atf_add_test_case overwrite_safe
421 atf_add_test_case overwrite_comparing
422 atf_add_test_case overwrite_safe_comparing
423 atf_add_test_case overwrite_eq
424 atf_add_test_case overwrite_eq_safe
425 atf_add_test_case overwrite_eq_comparing
426 atf_add_test_case overwrite_eq_safe_comparing
427 atf_add_test_case overwrite_backup
428 atf_add_test_case overwrite_backup_safe
429 atf_add_test_case overwrite_backup_comparing
430 atf_add_test_case overwrite_backup_safe_comparing
431 atf_add_test_case strip_changing
432 atf_add_test_case strip_changing_comparing
433 atf_add_test_case strip_changing_overwrite
434 atf_add_test_case strip_changing_overwrite_comparing
435 atf_add_test_case strip_changing_overwrite_eq
436 atf_add_test_case strip_changing_overwrite_eq_comparing
437 atf_add_test_case strip_noop
438 atf_add_test_case hard_link
439 atf_add_test_case symbolic_link
440 atf_add_test_case symbolic_link_absolute
441 atf_add_test_case symbolic_link_relative
442 atf_add_test_case symbolic_link_relative_absolute_source_and_dest1
443 atf_add_test_case symbolic_link_relative_absolute_source_and_dest1_double_slash
444 atf_add_test_case symbolic_link_relative_absolute_source_and_dest2
445 atf_add_test_case symbolic_link_relative_absolute_common
446 atf_add_test_case mkdir_simple