]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.bin/xinstall/tests/install_test.sh
THIS BRANCH IS OBSOLETE, PLEASE READ:
[FreeBSD/FreeBSD.git] / usr.bin / xinstall / tests / install_test.sh
1 #
2 # Copyright (c) 2016 Jilles Tjoelker
3 # All rights reserved.
4 #
5 # Redistribution and use in source and binary forms, with or without
6 # modification, are permitted provided that the following conditions
7 # are met:
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.
13 #
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
24 # SUCH DAMAGE.
25 #
26 # $FreeBSD$
27 #
28
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"
35 }
36
37 atf_test_case copy_to_nonexistent
38 copy_to_nonexistent_body() {
39         copy_to_nonexistent_with_opts
40 }
41
42 atf_test_case copy_to_nonexistent_safe
43 copy_to_nonexistent_safe_body() {
44         copy_to_nonexistent_with_opts -S
45 }
46
47 atf_test_case copy_to_nonexistent_comparing
48 copy_to_nonexistent_comparing_body() {
49         copy_to_nonexistent_with_opts -C
50 }
51
52 atf_test_case copy_to_nonexistent_safe_comparing
53 copy_to_nonexistent_safe_comparing_body() {
54         copy_to_nonexistent_with_opts -S -C
55 }
56
57 atf_test_case copy_to_nonexistent_backup
58 copy_to_nonexistent_backup_body() {
59         copy_to_nonexistent_with_opts -b -B.bak
60 }
61
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
65 }
66
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"
71 }
72
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"
78 }
79
80 atf_test_case copy_self
81 copy_self_body() {
82         copy_self_with_opts
83 }
84
85 atf_test_case copy_self_safe
86 copy_self_safe_body() {
87         copy_self_with_opts -S
88 }
89
90 atf_test_case copy_self_comparing
91 copy_self_comparing_body() {
92         copy_self_with_opts -C
93 }
94
95 atf_test_case copy_self_safe_comparing
96 copy_self_safe_comparing_body() {
97         copy_self_with_opts -S -C
98 }
99
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"
106 }
107
108 atf_test_case overwrite
109 overwrite_body() {
110         overwrite_with_opts
111 }
112
113 atf_test_case overwrite_safe
114 overwrite_safe_body() {
115         overwrite_with_opts -S
116 }
117
118 atf_test_case overwrite_comparing
119 overwrite_comparing_body() {
120         overwrite_with_opts -C
121 }
122
123 atf_test_case overwrite_safe_comparing
124 overwrite_safe_comparing_body() {
125         overwrite_with_opts -S -C
126 }
127
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"
134 }
135
136 atf_test_case overwrite_eq
137 overwrite_eq_body() {
138         overwrite_eq_with_opts
139 }
140
141 atf_test_case overwrite_eq_safe
142 overwrite_eq_safe_body() {
143         overwrite_eq_with_opts -S
144 }
145
146 atf_test_case overwrite_eq_comparing
147 overwrite_eq_comparing_body() {
148         overwrite_eq_with_opts -C
149 }
150
151 atf_test_case overwrite_eq_safe_comparing
152 overwrite_eq_safe_comparing_body() {
153         overwrite_eq_with_opts -S -C
154 }
155
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"
164 }
165
166 atf_test_case overwrite_backup
167 overwrite_backup_body() {
168         overwrite_backup_with_opts
169 }
170
171 atf_test_case overwrite_backup_safe
172 overwrite_backup_safe_body() {
173         overwrite_backup_with_opts -S
174 }
175
176 atf_test_case overwrite_backup_comparing
177 overwrite_backup_comparing_body() {
178         overwrite_backup_with_opts -C
179 }
180
181 atf_test_case overwrite_backup_safe_comparing
182 overwrite_backup_safe_comparing_body() {
183         overwrite_backup_with_opts -S -C
184 }
185
186 setup_stripbin() {
187         cat <<\STRIPBIN >stripbin
188 #!/bin/sh
189 [ "$1" = "-o" ] && dst="$2" && shift 2
190 [ "$1" = "--" ] && shift
191 [ -z "$dst" ] && dst="$1"
192 STRIPBIN
193         [ "$1" = "true" ] && cmd="cat" || cmd="tr z @"
194         echo $cmd '<"$1" >"$1.new" && mv -- "$1.new" "$dst"' >>stripbin
195         chmod 755 stripbin
196         export STRIPBIN="$PWD/stripbin"
197 }
198
199 strip_changing_with_opts() {
200         setup_stripbin
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"
206 }
207
208 atf_test_case strip_changing
209 strip_changing_body() {
210         strip_changing_with_opts
211 }
212
213 atf_test_case strip_changing_comparing
214 strip_changing_comparing_body() {
215         strip_changing_with_opts -C
216 }
217
218 strip_changing_overwrite_with_opts() {
219         setup_stripbin
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"
226 }
227
228 atf_test_case strip_changing_overwrite
229 strip_changing_overwrite_body() {
230         strip_changing_overwrite_with_opts
231 }
232
233 atf_test_case strip_changing_overwrite_comparing
234 strip_changing_overwrite_comparing_body() {
235         strip_changing_overwrite_with_opts -C
236 }
237
238 strip_changing_overwrite_eq_with_opts() {
239         setup_stripbin
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"
246 }
247
248 atf_test_case strip_changing_overwrite_eq
249 strip_changing_overwrite_eq_body() {
250         strip_changing_overwrite_eq_with_opts
251 }
252
253 atf_test_case strip_changing_overwrite_eq_comparing
254 strip_changing_overwrite_eq_comparing_body() {
255         strip_changing_overwrite_eq_with_opts -C
256 }
257
258 atf_test_case strip_noop
259 strip_noop_body() {
260         setup_stripbin true
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"
266 }
267
268 atf_test_case hard_link
269 hard_link_body() {
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"
274 }
275
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"
282 }
283
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')"
294         fi
295 }
296
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)
304         testf_path="testf"
305         if [ "$copyf_path" != "$testf_path" ]; then
306                 atf_fail "unexpected symlink contents ('$copyf_path' != '$testf_path')"
307         fi
308 }
309
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)"
313 }
314 symbolic_link_relative_absolute_source_and_dest1_body() {
315         src_path=a/b/c/testf
316         src_path_prefixed=$PWD/$src_path
317         dest_path=$PWD/copyf
318
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')"
328         fi
329 }
330
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"
334 }
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
338         dest_path=$PWD/copyf
339
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')"
349         fi
350 }
351
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)"
355 }
356 symbolic_link_relative_absolute_source_and_dest2_body() {
357         src_path=testf
358         src_path_prefixed=$PWD/$src_path
359         dest_path=$PWD/a/b/c/copyf
360
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')"
370         fi
371 }
372
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
382 }
383
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"
387 }
388 symbolic_link_relative_absolute_common_body() {
389         filename=foo.so
390         src_path=lib
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
395
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
399
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')"
404         fi
405 }
406
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
447 }