xref: /freebsd/bin/cp/tests/cp_test.sh (revision 00698711dee1d990d3db9c41bf58394e589eecfe)
1#
2# SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3#
4# Copyright (c) 2020 Kyle Evans <kevans@FreeBSD.org>
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26#
27# $FreeBSD$
28
29check_size()
30{
31	file=$1
32	sz=$2
33
34	atf_check -o inline:"$sz\n" stat -f '%z' $file
35}
36
37atf_test_case basic
38basic_body()
39{
40	echo "foo" > bar
41
42	atf_check cp bar baz
43	check_size baz 4
44}
45
46atf_test_case chrdev
47chrdev_body()
48{
49	echo "foo" > bar
50
51	check_size bar 4
52	atf_check cp /dev/null trunc
53	check_size trunc 0
54	atf_check cp bar trunc
55	check_size trunc 4
56	atf_check cp /dev/null trunc
57	check_size trunc 0
58}
59
60atf_test_case matching_srctgt
61matching_srctgt_body()
62{
63
64	# PR235438: `cp -R foo foo` would previously infinitely recurse and
65	# eventually error out.
66	mkdir foo
67	echo "qux" > foo/bar
68	cp foo/bar foo/zoo
69
70	atf_check cp -R foo foo
71	atf_check -o inline:"qux\n" cat foo/foo/bar
72	atf_check -o inline:"qux\n" cat foo/foo/zoo
73	atf_check -e not-empty -s not-exit:0 stat foo/foo/foo
74}
75
76atf_test_case matching_srctgt_contained
77matching_srctgt_contained_body()
78{
79
80	# Let's do the same thing, except we'll try to recursively copy foo into
81	# one of its subdirectories.
82	mkdir foo
83	echo "qux" > foo/bar
84	mkdir foo/loo
85	mkdir foo/moo
86	mkdir foo/roo
87	cp foo/bar foo/zoo
88
89	atf_check cp -R foo foo/moo
90	atf_check -o inline:"qux\n" cat foo/moo/foo/bar
91	atf_check -o inline:"qux\n" cat foo/moo/foo/zoo
92	atf_check -e not-empty -s not-exit:0 stat foo/moo/foo/moo
93}
94
95atf_test_case matching_srctgt_link
96matching_srctgt_link_body()
97{
98
99	mkdir foo
100	echo "qux" > foo/bar
101	cp foo/bar foo/zoo
102
103	atf_check ln -s foo roo
104	atf_check cp -RH roo foo
105	atf_check -o inline:"qux\n" cat foo/roo/bar
106	atf_check -o inline:"qux\n" cat foo/roo/zoo
107}
108
109atf_test_case matching_srctgt_nonexistent
110matching_srctgt_nonexistent_body()
111{
112
113	# We'll copy foo to a nonexistent subdirectory; ideally, we would
114	# skip just the directory and end up with a layout like;
115	#
116	# foo/
117	#     bar
118	#     dne/
119	#         bar
120	#         zoo
121	#     zoo
122	#
123	mkdir foo
124	echo "qux" > foo/bar
125	cp foo/bar foo/zoo
126
127	atf_check cp -R foo foo/dne
128	atf_check -o inline:"qux\n" cat foo/dne/bar
129	atf_check -o inline:"qux\n" cat foo/dne/zoo
130	atf_check -e not-empty -s not-exit:0 stat foo/dne/foo
131}
132
133atf_init_test_cases()
134{
135	atf_add_test_case basic
136	atf_add_test_case chrdev
137	atf_add_test_case matching_srctgt
138	atf_add_test_case matching_srctgt_contained
139	atf_add_test_case matching_srctgt_link
140	atf_add_test_case matching_srctgt_nonexistent
141}
142