ln_test.sh revision 321819
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: stable/10/bin/ln/tests/ln_test.sh 321819 2017-07-31 21:42:18Z asomers $
27#
28
29set_umask()
30{
31        if ! umask 022; then
32                atf_fail "setting umask failed"
33        fi
34}
35
36atf_test_case L_flag
37L_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
44L_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
56atf_test_case P_flag
57P_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
64P_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
75atf_test_case f_flag
76f_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
82f_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
92atf_test_case target_exists_hard
93target_exists_hard_head()
94{
95        atf_set "descr" "Verify whether creating a hard link fails if the " \
96                        "target file already exists"
97}
98
99target_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
107atf_test_case target_exists_symbolic
108target_exists_symbolic_head()
109{
110        atf_set "descr" "Verify whether creating a symbolic link fails if " \
111                        "the target file already exists"
112}
113
114target_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
122atf_test_case shf_flag_dir
123shf_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
128shf_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
136atf_test_case snf_flag_dir
137snf_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
142snf_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
150atf_test_case sF_flag
151sF_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
158sF_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
166atf_test_case sf_flag
167sf_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
174sf_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
182atf_test_case s_flag
183s_flag_head()
184{
185        atf_set "descr" "Verify that '-s' option creates a symbolic link"
186}
187
188s_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
196atf_test_case s_flag_broken
197s_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
203s_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
209atf_test_case sw_flag
210sw_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
216sw_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
223atf_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}
238