]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - bin/ln/tests/ln_test.sh
MFC r319854:
[FreeBSD/stable/10.git] / bin / ln / tests / ln_test.sh
1 #
2 # Copyright 2017 Shivansh Rai
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 set_umask()
30 {
31         if ! umask 022; then
32                 atf_fail "setting umask failed"
33         fi
34 }
35
36 atf_test_case L_flag
37 L_flag_head()
38 {
39         atf_set "descr" "Verify that when creating a hard link to a " \
40                         "symbolic link, '-L' option creates a hard" \
41                         "link to the target of the symbolic link"
42 }
43
44 L_flag_body()
45 {
46         set_umask
47         atf_check touch A
48         atf_check ln -s A B
49         atf_check ln -L B C
50         stat_A=$(stat -f %i A)
51         stat_C=$(stat -f %i C)
52         atf_check_equal "$stat_A" "$stat_C"
53         atf_check -o inline:'B: symbolic link to A\n' file B
54 }
55
56 atf_test_case P_flag
57 P_flag_head()
58 {
59         atf_set "descr" "Verify that when creating a hard link to a " \
60                         "symbolic link, '-P' option creates a hard " \
61                         "link to the symbolic link itself"
62 }
63
64 P_flag_body()
65 {
66         set_umask
67         atf_check touch A
68         atf_check ln -s A B
69         atf_check ln -P B C
70         stat_B=$(stat -f %i B)
71         stat_C=$(stat -f %i C)
72         atf_check_equal "$stat_B" "$stat_C"
73 }
74
75 atf_test_case f_flag
76 f_flag_head()
77 {
78         atf_set "descr" "Verify that if the target file already exists, " \
79                         "'-f' option unlinks it so that link may occur"
80 }
81
82 f_flag_body()
83 {
84         set_umask
85         atf_check touch A B
86         atf_check ln -f A B
87         stat_A=$(stat -f %i A)
88         stat_B=$(stat -f %i B)
89         atf_check_equal "$stat_A" "$stat_B"
90 }
91
92 atf_test_case target_exists_hard
93 target_exists_hard_head()
94 {
95         atf_set "descr" "Verify whether creating a hard link fails if the " \
96                         "target file already exists"
97 }
98
99 target_exists_hard_body()
100 {
101         set_umask
102         atf_check touch A B
103         atf_check -s exit:1 -e inline:'ln: B: File exists\n' \
104                 ln A B
105 }
106
107 atf_test_case target_exists_symbolic
108 target_exists_symbolic_head()
109 {
110         atf_set "descr" "Verify whether creating a symbolic link fails if " \
111                         "the target file already exists"
112 }
113
114 target_exists_symbolic_body()
115 {
116         set_umask
117         atf_check touch A B
118         atf_check -s exit:1 -e inline:'ln: B: File exists\n' \
119                 ln -s A B
120 }
121
122 atf_test_case shf_flag_dir
123 shf_flag_dir_head() {
124         atf_set "descr" "Verify that if the target directory is a symbolic " \
125                         "link, '-shf' option prevents following the link"
126 }
127
128 shf_flag_dir_body()
129 {
130         atf_check mkdir -m 0777 A B
131         atf_check ln -s A C
132         atf_check ln -shf B C
133         atf_check -o inline:'C: symbolic link to B\n' file C
134 }
135
136 atf_test_case snf_flag_dir
137 snf_flag_dir_head() {
138         atf_set "descr" "Verify that if the target directory is a symbolic " \
139                         "link, '-snf' option prevents following the link"
140 }
141
142 snf_flag_dir_body()
143 {
144         atf_check mkdir -m 0777 A B
145         atf_check ln -s A C
146         atf_check ln -snf B C
147         atf_check -o inline:'C: symbolic link to B\n' file C
148 }
149
150 atf_test_case sF_flag
151 sF_flag_head()
152 {
153         atf_set "descr" "Verify that if the target file already exists " \
154                         "and is a directory, then '-sF' option removes " \
155                         "it so that the link may occur"
156 }
157
158 sF_flag_body()
159 {
160         atf_check mkdir A B
161         atf_check ln -sF A B
162         atf_check -o inline:'Symbolic Link\n' stat -f %SHT B
163         atf_check -o inline:'A\n' readlink B
164 }
165
166 atf_test_case sf_flag
167 sf_flag_head()
168 {
169         atf_set "descr" "Verify that if the target file already exists, " \
170                         "'-sf' option unlinks it and creates a symbolic link " \
171                         "to the source file"
172 }
173
174 sf_flag_body()
175 {
176         set_umask
177         atf_check touch A B
178         atf_check ln -sf A B
179         atf_check -o inline:'B: symbolic link to A\n' file B
180 }
181
182 atf_test_case s_flag
183 s_flag_head()
184 {
185         atf_set "descr" "Verify that '-s' option creates a symbolic link"
186 }
187
188 s_flag_body()
189 {
190         set_umask
191         atf_check touch A
192         atf_check ln -s A B
193         atf_check -o inline:'B: symbolic link to A\n' file B
194 }
195
196 atf_test_case s_flag_broken
197 s_flag_broken_head()
198 {
199         atf_set "descr" "Verify that if the source file does not exists, '-s' " \
200                         "option creates a broken symbolic link to the source file"
201 }
202
203 s_flag_broken_body()
204 {
205         atf_check ln -s A B
206         atf_check -o inline:'B: broken symbolic link to A\n' file B
207 }
208
209 atf_test_case sw_flag
210 sw_flag_head()
211 {
212         atf_set "descr" "Verify that '-sw' option produces a warning if the " \
213                         "source of a symbolic link does not currently exist"
214 }
215
216 sw_flag_body()
217 {
218         atf_check -s exit:0 -e inline:'ln: warning: A: No such file or directory\n' \
219                 ln -sw A B
220         atf_check -o inline:'B: broken symbolic link to A\n' file B
221 }
222
223 atf_init_test_cases()
224 {
225         atf_add_test_case L_flag
226         atf_add_test_case P_flag
227         atf_add_test_case f_flag
228         atf_add_test_case target_exists_hard
229         atf_add_test_case target_exists_symbolic
230         atf_add_test_case shf_flag_dir
231         atf_add_test_case snf_flag_dir
232         atf_add_test_case sF_flag
233         atf_add_test_case sf_flag
234         atf_add_test_case s_flag
235         atf_add_test_case s_flag_broken
236         atf_add_test_case sw_flag
237 }