1299244Sjilles#
2299244Sjilles# Copyright (c) 2016 Jilles Tjoelker
3299244Sjilles# All rights reserved.
4299244Sjilles#
5299244Sjilles# Redistribution and use in source and binary forms, with or without
6299244Sjilles# modification, are permitted provided that the following conditions
7299244Sjilles# are met:
8299244Sjilles# 1. Redistributions of source code must retain the above copyright
9299244Sjilles#    notice, this list of conditions and the following disclaimer.
10299244Sjilles# 2. Redistributions in binary form must reproduce the above copyright
11299244Sjilles#    notice, this list of conditions and the following disclaimer in the
12299244Sjilles#    documentation and/or other materials provided with the distribution.
13299244Sjilles#
14299244Sjilles# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15299244Sjilles# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16299244Sjilles# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17299244Sjilles# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18299244Sjilles# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19299244Sjilles# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20299244Sjilles# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21299244Sjilles# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22299244Sjilles# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23299244Sjilles# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24299244Sjilles# SUCH DAMAGE.
25299244Sjilles#
26299244Sjilles# $FreeBSD: releng/11.0/usr.bin/xinstall/tests/install_test.sh 301765 2016-06-09 21:59:35Z jilles $
27299244Sjilles#
28299244Sjilles
29299244Sjillescopy_to_nonexistent_with_opts() {
30299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
31299244Sjilles	atf_check install "$@" testf copyf
32299244Sjilles	cmp testf copyf || atf_fail "bad copy"
33299244Sjilles	[ ! testf -nt copyf ] || atf_fail "bad timestamp"
34299244Sjilles	[ ! -e copyf.bak ] || atf_fail "no backup expected"
35299244Sjilles}
36299244Sjilles
37299244Sjillesatf_test_case copy_to_nonexistent
38299244Sjillescopy_to_nonexistent_body() {
39299244Sjilles	copy_to_nonexistent_with_opts
40299244Sjilles}
41299244Sjilles
42299244Sjillesatf_test_case copy_to_nonexistent_safe
43299244Sjillescopy_to_nonexistent_safe_body() {
44299244Sjilles	copy_to_nonexistent_with_opts -S
45299244Sjilles}
46299244Sjilles
47299244Sjillesatf_test_case copy_to_nonexistent_comparing
48299244Sjillescopy_to_nonexistent_comparing_body() {
49299244Sjilles	copy_to_nonexistent_with_opts -C
50299244Sjilles}
51299244Sjilles
52299244Sjillesatf_test_case copy_to_nonexistent_safe_comparing
53299244Sjillescopy_to_nonexistent_safe_comparing_body() {
54299244Sjilles	copy_to_nonexistent_with_opts -S -C
55299244Sjilles}
56299244Sjilles
57299244Sjillesatf_test_case copy_to_nonexistent_backup
58299244Sjillescopy_to_nonexistent_backup_body() {
59299244Sjilles	copy_to_nonexistent_with_opts -b -B.bak
60299244Sjilles}
61299244Sjilles
62299244Sjillesatf_test_case copy_to_nonexistent_backup_safe
63299244Sjillescopy_to_nonexistent_backup_safe_body() {
64299244Sjilles	copy_to_nonexistent_with_opts -b -B.bak -S
65299244Sjilles}
66299244Sjilles
67301765Sjillesatf_test_case copy_to_nonexistent_preserving
68301765Sjillescopy_to_nonexistent_preserving_body() {
69301765Sjilles	copy_to_nonexistent_with_opts -p
70301765Sjilles	[ ! testf -ot copyf ] || atf_fail "bad timestamp 2"
71301765Sjilles}
72301765Sjilles
73299244Sjillescopy_self_with_opts() {
74299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
75299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf2
76299244Sjilles	atf_check -s not-exit:0 -o empty -e match:. install "$@" testf testf
77299244Sjilles	cmp testf testf2 || atf_fail "file changed after self-copy attempt"
78299244Sjilles}
79299244Sjilles
80299244Sjillesatf_test_case copy_self
81299244Sjillescopy_self_body() {
82299244Sjilles	copy_self_with_opts
83299244Sjilles}
84299244Sjilles
85299244Sjillesatf_test_case copy_self_safe
86299244Sjillescopy_self_safe_body() {
87299244Sjilles	copy_self_with_opts -S
88299244Sjilles}
89299244Sjilles
90299244Sjillesatf_test_case copy_self_comparing
91299244Sjillescopy_self_comparing_body() {
92299244Sjilles	copy_self_with_opts -C
93299244Sjilles}
94299244Sjilles
95299244Sjillesatf_test_case copy_self_safe_comparing
96299244Sjillescopy_self_safe_comparing_body() {
97299244Sjilles	copy_self_with_opts -S -C
98299244Sjilles}
99299244Sjilles
100299244Sjillesoverwrite_with_opts() {
101299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
102299244Sjilles	printf 'test\n123\r456\r\n789\0w' >otherf
103299244Sjilles	atf_check install "$@" testf otherf
104299244Sjilles	cmp testf otherf || atf_fail "bad overwrite"
105299244Sjilles	[ ! testf -nt otherf ] || atf_fail "bad timestamp"
106299244Sjilles}
107299244Sjilles
108299244Sjillesatf_test_case overwrite
109299244Sjillesoverwrite_body() {
110299244Sjilles	overwrite_with_opts
111299244Sjilles}
112299244Sjilles
113299244Sjillesatf_test_case overwrite_safe
114299244Sjillesoverwrite_safe_body() {
115299244Sjilles	overwrite_with_opts -S
116299244Sjilles}
117299244Sjilles
118299244Sjillesatf_test_case overwrite_comparing
119299244Sjillesoverwrite_comparing_body() {
120299244Sjilles	overwrite_with_opts -C
121299244Sjilles}
122299244Sjilles
123299244Sjillesatf_test_case overwrite_safe_comparing
124299244Sjillesoverwrite_safe_comparing_body() {
125299244Sjilles	overwrite_with_opts -S -C
126299244Sjilles}
127299244Sjilles
128299244Sjillesoverwrite_eq_with_opts() {
129299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
130299244Sjilles	printf 'test\n123\r456\r\n789\0z' >otherf
131299244Sjilles	atf_check install "$@" testf otherf
132299244Sjilles	cmp testf otherf || atf_fail "bad overwrite"
133299244Sjilles	[ ! testf -nt otherf ] || atf_fail "bad timestamp"
134299244Sjilles}
135299244Sjilles
136299244Sjillesatf_test_case overwrite_eq
137299244Sjillesoverwrite_eq_body() {
138299244Sjilles	overwrite_eq_with_opts
139299244Sjilles}
140299244Sjilles
141299244Sjillesatf_test_case overwrite_eq_safe
142299244Sjillesoverwrite_eq_safe_body() {
143299244Sjilles	overwrite_eq_with_opts -S
144299244Sjilles}
145299244Sjilles
146299244Sjillesatf_test_case overwrite_eq_comparing
147299244Sjillesoverwrite_eq_comparing_body() {
148299244Sjilles	overwrite_eq_with_opts -C
149299244Sjilles}
150299244Sjilles
151299244Sjillesatf_test_case overwrite_eq_safe_comparing
152299244Sjillesoverwrite_eq_safe_comparing_body() {
153299244Sjilles	overwrite_eq_with_opts -S -C
154299244Sjilles}
155299244Sjilles
156299244Sjillesoverwrite_backup_with_opts() {
157299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
158299244Sjilles	printf 'test\n123\r456\r\n789\0w' >otherf
159299244Sjilles	printf 'test\n123\r456\r\n789\0w' >otherf2
160299244Sjilles	atf_check install -b -B.bak "$@" testf otherf
161299244Sjilles	cmp testf otherf || atf_fail "bad overwrite"
162299244Sjilles	[ ! testf -nt otherf ] || atf_fail "bad timestamp"
163299244Sjilles	cmp otherf.bak otherf2 || atf_fail "bad backup"
164299244Sjilles}
165299244Sjilles
166299244Sjillesatf_test_case overwrite_backup
167299244Sjillesoverwrite_backup_body() {
168299244Sjilles	overwrite_backup_with_opts
169299244Sjilles}
170299244Sjilles
171299244Sjillesatf_test_case overwrite_backup_safe
172299244Sjillesoverwrite_backup_safe_body() {
173299244Sjilles	overwrite_backup_with_opts -S
174299244Sjilles}
175299244Sjilles
176299244Sjillesatf_test_case overwrite_backup_comparing
177299244Sjillesoverwrite_backup_comparing_body() {
178299244Sjilles	overwrite_backup_with_opts -C
179299244Sjilles}
180299244Sjilles
181299244Sjillesatf_test_case overwrite_backup_safe_comparing
182299244Sjillesoverwrite_backup_safe_comparing_body() {
183299244Sjilles	overwrite_backup_with_opts -S -C
184299244Sjilles}
185299244Sjilles
186299244Sjillessetup_stripbin() {
187299244Sjilles	cat <<\STRIPBIN >stripbin
188299244Sjilles#!/bin/sh
189299244Sjillestr z @ <"$1" >"$1.new" && mv -- "$1.new" "$1"
190299244SjillesSTRIPBIN
191299244Sjilles	chmod 755 stripbin
192299244Sjilles	export STRIPBIN="$PWD/stripbin"
193299244Sjilles}
194299244Sjilles
195299244Sjillesstrip_changing_with_opts() {
196299244Sjilles	setup_stripbin
197299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
198299244Sjilles	atf_check install -s "$@" testf copyf
199299244Sjilles	[ ! testf -nt copyf ] || atf_fail "bad timestamp"
200299244Sjilles	printf 'test\n123\r456\r\n789\0@' >otherf
201299244Sjilles	cmp otherf copyf || atf_fail "bad stripped copy"
202299244Sjilles}
203299244Sjilles
204299244Sjillesatf_test_case strip_changing
205299244Sjillesstrip_changing_body() {
206299244Sjilles	strip_changing_with_opts
207299244Sjilles}
208299244Sjilles
209299244Sjillesatf_test_case strip_changing_comparing
210299244Sjillesstrip_changing_comparing_body() {
211299244Sjilles	strip_changing_with_opts -C
212299244Sjilles}
213299244Sjilles
214299244Sjillesstrip_changing_overwrite_with_opts() {
215299244Sjilles	setup_stripbin
216299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
217299244Sjilles	printf 'test\n123\r456\r\n789\0w' >copyf
218299244Sjilles	atf_check install -s "$@" testf copyf
219299244Sjilles	[ ! testf -nt copyf ] || atf_fail "bad timestamp"
220299244Sjilles	printf 'test\n123\r456\r\n789\0@' >otherf
221299244Sjilles	cmp otherf copyf || atf_fail "bad stripped copy"
222299244Sjilles}
223299244Sjilles
224299244Sjillesatf_test_case strip_changing_overwrite
225299244Sjillesstrip_changing_overwrite_body() {
226299244Sjilles	strip_changing_overwrite_with_opts
227299244Sjilles}
228299244Sjilles
229299244Sjillesatf_test_case strip_changing_overwrite_comparing
230299244Sjillesstrip_changing_overwrite_comparing_body() {
231299244Sjilles	strip_changing_overwrite_with_opts -C
232299244Sjilles}
233299244Sjilles
234299244Sjillesstrip_changing_overwrite_eq_with_opts() {
235299244Sjilles	setup_stripbin
236299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
237299244Sjilles	printf 'test\n123\r456\r\n789\0@' >copyf
238299244Sjilles	atf_check install -s "$@" testf copyf
239299244Sjilles	[ ! testf -nt copyf ] || atf_fail "bad timestamp"
240299244Sjilles	printf 'test\n123\r456\r\n789\0@' >otherf
241299244Sjilles	cmp otherf copyf || atf_fail "bad stripped copy"
242299244Sjilles}
243299244Sjilles
244299244Sjillesatf_test_case strip_changing_overwrite_eq
245299244Sjillesstrip_changing_overwrite_eq_body() {
246299244Sjilles	strip_changing_overwrite_eq_with_opts
247299244Sjilles}
248299244Sjilles
249299244Sjillesatf_test_case strip_changing_overwrite_eq_comparing
250299244Sjillesstrip_changing_overwrite_eq_comparing_body() {
251299244Sjilles	strip_changing_overwrite_eq_with_opts -C
252299244Sjilles}
253299244Sjilles
254299244Sjillesatf_test_case strip_noop
255299244Sjillesstrip_noop_body() {
256299244Sjilles	export STRIPBIN=true
257299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
258299244Sjilles	atf_check install -s testf copyf
259299244Sjilles	[ ! testf -nt copyf ] || atf_fail "bad timestamp"
260299244Sjilles	printf 'test\n123\r456\r\n789\0z' >otherf
261299244Sjilles	cmp otherf copyf || atf_fail "bad stripped copy"
262299244Sjilles}
263299244Sjilles
264299244Sjillesatf_test_case hard_link
265299244Sjilleshard_link_body() {
266299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
267299244Sjilles	atf_check install -l h testf copyf
268299244Sjilles	[ testf -ef copyf ] || atf_fail "not same file"
269299244Sjilles	[ ! -L copyf ] || atf_fail "copy is symlink"
270299244Sjilles}
271299244Sjilles
272299244Sjillesatf_test_case symbolic_link
273299244Sjillessymbolic_link_body() {
274299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
275299244Sjilles	atf_check install -l s testf copyf
276299244Sjilles	[ testf -ef copyf ] || atf_fail "not same file"
277299244Sjilles	[ -L copyf ] || atf_fail "copy is not symlink"
278299244Sjilles}
279299244Sjilles
280299244Sjillesatf_test_case symbolic_link_absolute
281299244Sjillessymbolic_link_absolute_body() {
282299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
283299244Sjilles	atf_check install -l sa testf copyf
284299244Sjilles	[ testf -ef copyf ] || atf_fail "not same file"
285299244Sjilles	[ -L copyf ] || atf_fail "copy is not symlink"
286299244Sjilles	[ "$(readlink copyf)" = "$(pwd -P)/testf" ] || atf_fail "unexpected symlink contents"
287299244Sjilles}
288299244Sjilles
289299244Sjillesatf_test_case symbolic_link_relative
290299244Sjillessymbolic_link_relative_body() {
291299244Sjilles	printf 'test\n123\r456\r\n789\0z' >testf
292299244Sjilles	atf_check install -l sr testf copyf
293299244Sjilles	[ testf -ef copyf ] || atf_fail "not same file"
294299244Sjilles	[ -L copyf ] || atf_fail "copy is not symlink"
295299244Sjilles	[ "$(readlink copyf)" = "testf" ] || atf_fail "unexpected symlink contents"
296299244Sjilles}
297299244Sjilles
298299244Sjillesatf_test_case mkdir_simple
299299244Sjillesmkdir_simple_body() {
300299244Sjilles	atf_check install -d dir1/dir2
301299244Sjilles	[ -d dir1 ] || atf_fail "dir1 missing"
302299244Sjilles	[ -d dir1/dir2 ] || atf_fail "dir2 missing"
303299244Sjilles	atf_check install -d dir1/dir2/dir3
304299244Sjilles	[ -d dir1/dir2/dir3 ] || atf_fail "dir3 missing"
305299244Sjilles	atf_check install -d dir1
306299244Sjilles	atf_check install -d dir1/dir2/dir3
307299244Sjilles}
308299244Sjilles
309299244Sjillesatf_init_test_cases() {
310299244Sjilles	atf_add_test_case copy_to_nonexistent
311299244Sjilles	atf_add_test_case copy_to_nonexistent_safe
312299244Sjilles	atf_add_test_case copy_to_nonexistent_comparing
313299244Sjilles	atf_add_test_case copy_to_nonexistent_safe_comparing
314299244Sjilles	atf_add_test_case copy_to_nonexistent_backup
315299244Sjilles	atf_add_test_case copy_to_nonexistent_backup_safe
316301765Sjilles	atf_add_test_case copy_to_nonexistent_preserving
317299244Sjilles	atf_add_test_case copy_self
318299244Sjilles	atf_add_test_case copy_self_safe
319299244Sjilles	atf_add_test_case copy_self_comparing
320299244Sjilles	atf_add_test_case copy_self_safe_comparing
321299244Sjilles	atf_add_test_case overwrite
322299244Sjilles	atf_add_test_case overwrite_safe
323299244Sjilles	atf_add_test_case overwrite_comparing
324299244Sjilles	atf_add_test_case overwrite_safe_comparing
325299244Sjilles	atf_add_test_case overwrite_eq
326299244Sjilles	atf_add_test_case overwrite_eq_safe
327299244Sjilles	atf_add_test_case overwrite_eq_comparing
328299244Sjilles	atf_add_test_case overwrite_eq_safe_comparing
329299244Sjilles	atf_add_test_case overwrite_backup
330299244Sjilles	atf_add_test_case overwrite_backup_safe
331299244Sjilles	atf_add_test_case overwrite_backup_comparing
332299244Sjilles	atf_add_test_case overwrite_backup_safe_comparing
333299244Sjilles	atf_add_test_case strip_changing
334299244Sjilles	atf_add_test_case strip_changing_comparing
335299244Sjilles	atf_add_test_case strip_changing_overwrite
336299244Sjilles	atf_add_test_case strip_changing_overwrite_comparing
337299244Sjilles	atf_add_test_case strip_changing_overwrite_eq
338299244Sjilles	atf_add_test_case strip_changing_overwrite_eq_comparing
339299244Sjilles	atf_add_test_case strip_noop
340299244Sjilles	atf_add_test_case hard_link
341299244Sjilles	atf_add_test_case symbolic_link
342299244Sjilles	atf_add_test_case symbolic_link_absolute
343299244Sjilles	atf_add_test_case symbolic_link_relative
344299244Sjilles	atf_add_test_case mkdir_simple
345299244Sjilles}
346