blob: 4929f4e499a851583db0af0f3aaf032e37270981
1 | #!/bin/sh |
2 | # Copyright 2009 by Denys Vlasenko |
3 | # Licensed under GPLv2, see file LICENSE in this source tree. |
4 | |
5 | . ./testing.sh |
6 | |
7 | unset LANG |
8 | unset LANGUAGE |
9 | unset LC_COLLATE |
10 | unset LC_ALL |
11 | umask 022 |
12 | |
13 | rm -rf tar.tempdir 2>/dev/null |
14 | mkdir tar.tempdir && cd tar.tempdir || exit 1 |
15 | |
16 | # testing "test name" "script" "expected result" "file input" "stdin" |
17 | |
18 | testing "Empty file is not a tarball" '\ |
19 | tar xvf - 2>&1; echo $? |
20 | ' "\ |
21 | tar: short read |
22 | 1 |
23 | " \ |
24 | "" "" |
25 | SKIP= |
26 | |
27 | optional FEATURE_SEAMLESS_GZ |
28 | # In NOMMU case, "invalid magic" message comes from gunzip child process. |
29 | # Otherwise, it comes from tar. |
30 | # Need to fix output up to avoid false positive. |
31 | testing "Empty file is not a tarball.tar.gz" '\ |
32 | { tar xvzf - 2>&1; echo $?; } | grep -Fv "invalid magic" |
33 | ' "\ |
34 | tar: short read |
35 | 1 |
36 | " \ |
37 | "" "" |
38 | SKIP= |
39 | |
40 | testing "Two zeroed blocks is a ('truncated') empty tarball" '\ |
41 | dd if=/dev/zero bs=512 count=2 2>/dev/null | tar xvf - 2>&1; echo $? |
42 | ' "\ |
43 | 0 |
44 | " \ |
45 | "" "" |
46 | SKIP= |
47 | |
48 | testing "Twenty zeroed blocks is an empty tarball" '\ |
49 | dd if=/dev/zero bs=512 count=20 2>/dev/null | tar xvf - 2>&1; echo $? |
50 | ' "\ |
51 | 0 |
52 | " \ |
53 | "" "" |
54 | SKIP= |
55 | |
56 | optional FEATURE_TAR_CREATE FEATURE_LS_SORTFILES |
57 | testing "tar hardlinks and repeated files" '\ |
58 | rm -rf input_* test.tar 2>/dev/null |
59 | >input_hard1 |
60 | ln input_hard1 input_hard2 |
61 | mkdir input_dir |
62 | >input_dir/file |
63 | chmod -R 644 * |
64 | chmod 755 input_dir |
65 | tar cf test.tar input input_dir/ input_hard1 input_hard2 input_hard1 input_dir/ input |
66 | tar tvf test.tar | sed "s/.*[0-9] input/input/" |
67 | tar xf test.tar 2>&1 |
68 | echo Ok: $? |
69 | ls -l . input_dir/* | grep input_ | sed "s/\\(^[^ ]*\\) .* input/\\1 input/" |
70 | ' "\ |
71 | input |
72 | input_dir/ |
73 | input_dir/file |
74 | input_hard1 |
75 | input_hard2 -> input_hard1 |
76 | input_hard1 -> input_hard1 |
77 | input_dir/ |
78 | input_dir/file |
79 | input |
80 | Ok: 0 |
81 | -rw-r--r-- input_dir/file |
82 | drwxr-xr-x input_dir |
83 | -rw-r--r-- input_hard1 |
84 | -rw-r--r-- input_hard2 |
85 | " \ |
86 | "" "" |
87 | SKIP= |
88 | |
89 | optional FEATURE_TAR_CREATE FEATURE_LS_SORTFILES |
90 | testing "tar hardlinks mode" '\ |
91 | rm -rf input_* test.tar 2>/dev/null |
92 | >input_hard1 |
93 | chmod 741 input_hard1 |
94 | ln input_hard1 input_hard2 |
95 | mkdir input_dir |
96 | ln input_hard1 input_dir |
97 | ln input_hard2 input_dir |
98 | chmod 550 input_dir |
99 | # On some filesystems, input_dir/input_hard2 is returned by readdir |
100 | # BEFORE input_dir/input_hard1! Thats why we cant just "tar cf ... input_*": |
101 | tar cf test.tar input_dir/input_hard* input_hard* |
102 | tar tvf test.tar | sed "s/.*[0-9] input/input/" |
103 | chmod 770 input_dir |
104 | rm -rf input_* |
105 | tar xf test.tar 2>&1 |
106 | echo Ok: $? |
107 | ls -l . input_dir/* | grep "input.*hard" | sed "s/\\(^[^ ]*\\) .* input/\\1 input/" |
108 | ' "\ |
109 | input_dir/input_hard1 |
110 | input_dir/input_hard2 -> input_dir/input_hard1 |
111 | input_hard1 -> input_dir/input_hard1 |
112 | input_hard2 -> input_dir/input_hard1 |
113 | Ok: 0 |
114 | -rwxr----x input_dir/input_hard1 |
115 | -rwxr----x input_dir/input_hard2 |
116 | -rwxr----x input_hard1 |
117 | -rwxr----x input_hard2 |
118 | " \ |
119 | "" "" |
120 | SKIP= |
121 | |
122 | optional FEATURE_TAR_CREATE FEATURE_LS_SORTFILES |
123 | testing "tar symlinks mode" '\ |
124 | rm -rf input_* test.tar 2>/dev/null |
125 | >input_file |
126 | chmod 741 input_file |
127 | ln -s input_file input_soft |
128 | mkdir input_dir |
129 | ln input_file input_dir |
130 | ln input_soft input_dir |
131 | chmod 550 input_dir |
132 | tar cf test.tar input_dir/* input_[fs]* |
133 | tar tvf test.tar | sed "s/.*[0-9] input/input/" | sort |
134 | chmod 770 input_dir |
135 | rm -rf input_* |
136 | tar xf test.tar 2>&1 |
137 | echo Ok: $? |
138 | ls -l . input_dir/* | grep "input_[fs]" | sed "s/\\(^[^ ]*\\) .* input/\\1 input/" |
139 | ' "\ |
140 | input_dir/input_file |
141 | input_dir/input_soft -> input_file |
142 | input_file -> input_dir/input_file |
143 | input_soft -> input_dir/input_soft |
144 | Ok: 0 |
145 | -rwxr----x input_dir/input_file |
146 | lrwxrwxrwx input_file |
147 | -rwxr----x input_file |
148 | lrwxrwxrwx input_file |
149 | " \ |
150 | "" "" |
151 | SKIP= |
152 | |
153 | optional FEATURE_TAR_CREATE FEATURE_TAR_LONG_OPTIONS |
154 | testing "tar --overwrite" "\ |
155 | rm -rf input_* test.tar 2>/dev/null |
156 | ln input input_hard |
157 | tar cf test.tar input_hard |
158 | echo WRONG >input |
159 | # --overwrite opens 'input_hard' without unlinking, |
160 | # thus 'input_hard' still linked to 'input' and we write 'Ok' into it |
161 | tar xf test.tar --overwrite 2>&1 && cat input |
162 | " "\ |
163 | Ok |
164 | " \ |
165 | "Ok\n" "" |
166 | SKIP= |
167 | |
168 | test x"$SKIP_KNOWN_BUGS" = x"" && { |
169 | # Needs to be run under non-root for meaningful test |
170 | optional FEATURE_TAR_CREATE |
171 | testing "tar writing into read-only dir" '\ |
172 | rm -rf input_* test.tar 2>/dev/null |
173 | mkdir input_dir |
174 | >input_dir/input_file |
175 | chmod 550 input_dir |
176 | tar cf test.tar input_dir |
177 | tar tvf test.tar | sed "s/.*[0-9] input/input/" |
178 | chmod 770 input_dir |
179 | rm -rf input_* |
180 | tar xf test.tar 2>&1 |
181 | echo Ok: $? |
182 | ls -l input_dir/* . | grep input_ | sed "s/\\(^[^ ]*\\) .* input/\\1 input/" |
183 | chmod 770 input_dir |
184 | ' "\ |
185 | input_dir/ |
186 | input_dir/input_file |
187 | Ok: 0 |
188 | -rw-r--r-- input_dir/input_file |
189 | dr-xr-x--- input_dir |
190 | " \ |
191 | "" "" |
192 | SKIP= |
193 | } |
194 | |
195 | # Had a bug where on extract autodetect first "switched off" -z |
196 | # and then failed to recognize .tgz extension |
197 | optional FEATURE_TAR_CREATE FEATURE_SEAMLESS_GZ |
198 | testing "tar extract tgz" "\ |
199 | dd count=1 bs=1M if=/dev/zero of=F0 2>/dev/null |
200 | tar -czf F0.tgz F0 |
201 | rm F0 |
202 | tar -xzvf F0.tgz && echo Ok |
203 | rm F0 || echo BAD |
204 | " "\ |
205 | F0 |
206 | Ok |
207 | " \ |
208 | "" "" |
209 | SKIP= |
210 | |
211 | # Do we detect XZ-compressed data (even w/o .tar.xz or txz extension)? |
212 | # (the uuencoded hello_world.txz contains one empty file named "hello_world") |
213 | optional UUDECODE FEATURE_TAR_AUTODETECT FEATURE_SEAMLESS_XZ |
214 | testing "tar extract txz" "\ |
215 | uudecode -o input && tar tf input && echo Ok |
216 | " "\ |
217 | hello_world |
218 | Ok |
219 | " \ |
220 | "" "\ |
221 | begin-base64 644 hello_world.txz |
222 | /Td6WFoAAATm1rRGAgAhARYAAAB0L+Wj4AX/AEldADQZSe6ODIZQ3rSQ8kAJ |
223 | SnMPTX+XWGKW3Yu/Rwqg4Ik5wqgQKgVH97J8yA8IvZ4ahaCQogUNHRkXibr2 |
224 | Q615wcb2G7fJU49AhWAAAAAAUA8gu9DyXfAAAWWADAAAAB5FXGCxxGf7AgAA |
225 | AAAEWVo= |
226 | ==== |
227 | " |
228 | SKIP= |
229 | |
230 | # On extract, everything up to and including last ".." component is stripped |
231 | optional FEATURE_TAR_CREATE |
232 | testing "tar strips /../ on extract" "\ |
233 | rm -rf input_* test.tar 2>/dev/null |
234 | mkdir input_dir |
235 | echo Ok >input_dir/file |
236 | tar cf test.tar ./../tar.tempdir/input_dir/../input_dir 2>&1 |
237 | rm -rf input_* 2>/dev/null |
238 | tar -vxf test.tar 2>&1 |
239 | cat input_dir/file 2>&1 |
240 | " "\ |
241 | tar: removing leading './../tar.tempdir/input_dir/../' from member names |
242 | input_dir/ |
243 | input_dir/file |
244 | Ok |
245 | " \ |
246 | "" "" |
247 | SKIP= |
248 | |
249 | |
250 | cd .. && rm -rf tar.tempdir || exit 1 |
251 | |
252 | exit $FAILCOUNT |
253 |