xref: /sqlite-3.40.0/test/zipfile.test (revision 26333ee3)
1# 2017 December 9
2#
3# The author disclaims copyright to this source code.  In place of
4# a legal notice, here is a blessing:
5#
6#    May you do good and not evil.
7#    May you find forgiveness for yourself and forgive others.
8#    May you share freely, never taking more than you give.
9#
10#***********************************************************************
11#
12
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15set testprefix zipfile
16
17ifcapable !vtab {
18  finish_test; return
19}
20if {[catch {load_static_extension db zipfile} error]} {
21  puts "Skipping zipfile tests, hit load error: $error"
22  finish_test; return
23}
24
25proc do_zipfile_blob_test {tn file} {
26  set res1 [
27    db eval { SELECT name,mode,mtime,method,quote(data) FROM zipfile($file) }
28  ]
29
30  set fd [open $file]
31  fconfigure $fd -translation binary -encoding binary
32  set data [read $fd]
33  close $fd
34
35  set res2 [db eval {
36    SELECT name,mode,mtime,method,quote(data) FROM zipfile($data)
37  }]
38
39  uplevel [list do_test $tn.1 [list set {} $res2] $res1]
40
41  set T "$file.test_zip"
42  set fd [open $T w]
43  fconfigure $fd -translation binary -encoding binary
44  puts -nonewline $fd $data
45  close $fd
46
47  set res3 [
48    db eval { SELECT name,mode,mtime,method,quote(data) FROM zipfile($T) }
49  ]
50
51  uplevel [list do_test $tn.2 [list set {} $res3] $res1]
52}
53
54forcedelete test.zip
55do_execsql_test 1.0 {
56  CREATE VIRTUAL TABLE temp.zz USING zipfile('test.zip');
57  PRAGMA table_info(zz);
58} {
59  0 name {} 1 {} 1
60  1 mode {} 0 {} 0
61  2 mtime {} 0 {} 0
62  3 sz {} 0 {} 0
63  4 rawdata {} 0 {} 0
64  5 data {} 0 {} 0
65  6 method {} 0 {} 0
66}
67
68do_catchsql_test 1.1.0.1 {
69  INSERT INTO zz(name, mode, mtime, sz, rawdata, method)
70  VALUES('f.txt', '-rw-r--r--', 1000000000, 5, 'abcde', 0);
71} {1 {constraint failed}}
72do_catchsql_test 1.1.0.1 {
73  INSERT INTO zz(name, mtime, sz, rawdata, method)
74  VALUES('g.txt', 1000000002, 5, '12345', 0);
75} {1 {constraint failed}}
76
77do_execsql_test 1.1.1 {
78  INSERT INTO zz(name, mode, mtime, data, method)
79  VALUES('f.txt', '-rw-r--r--', 1000000000, 'abcde', 0);
80}
81do_execsql_test 1.1.2 {
82  INSERT INTO zz(name, mode, mtime, data, method)
83  VALUES('g.txt', NULL, 1000000002, '12345', 0);
84}
85
86do_execsql_test 1.2 {
87  SELECT name, mtime, data FROM zipfile('test.zip')
88} {
89  f.txt 1000000000 abcde
90  g.txt 1000000002 12345
91}
92do_zipfile_blob_test 1.2.1 test.zip
93
94do_execsql_test 1.3 {
95  INSERT INTO zz(name, mode, mtime, data) VALUES('h.txt',
96    '-rw-r--r--', 1000000004, 'aaaaaaaaaabbbbbbbbbb'
97  );
98}
99do_zipfile_blob_test 1.3.1 test.zip
100
101do_execsql_test 1.4 {
102  SELECT name, mtime, data, method FROM zipfile('test.zip');
103} {
104  f.txt 1000000000 abcde 0
105  g.txt 1000000002 12345 0
106  h.txt 1000000004 aaaaaaaaaabbbbbbbbbb 8
107}
108
109ifcapable json1 {
110  do_execsql_test 1.4.1 {
111    SELECT name, json_extract( zipfile_cds(z) , '$.crc32')!=0
112    FROM zipfile('test.zip');
113  } {
114    f.txt 1
115    g.txt 1
116    h.txt 1
117  }
118}
119
120do_execsql_test 1.5.1 {
121  BEGIN;
122    INSERT INTO zz(name, mode, mtime, data, method)
123    VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0);
124    SELECT name FROM zz;
125  COMMIT;
126} {f.txt g.txt h.txt i.txt}
127do_execsql_test 1.5.2 {
128  SELECT name FROM zz;
129} {f.txt g.txt h.txt i.txt}
130do_execsql_test 1.5.3 {
131  SELECT data FROM zz WHERE name='i.txt';
132} {zxcvb}
133
134do_execsql_test 1.6.0 {
135  DELETE FROM zz WHERE name='g.txt';
136  SELECT name FROM zz;
137} {f.txt h.txt i.txt}
138
139do_execsql_test 1.6.1 {
140  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
141} {
142  f.txt 33188 1000000000 abcde 0
143  h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8
144  i.txt 33188 1000000006 zxcvb 0
145}
146do_zipfile_blob_test 1.6.1a test.zip
147
148do_execsql_test 1.6.2 {
149  UPDATE zz SET mtime=4 WHERE name='i.txt';
150  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
151} {
152  f.txt 33188 1000000000 abcde 0
153  h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8
154  i.txt 33188 4 zxcvb 0
155}
156
157do_execsql_test 1.6.3 {
158  UPDATE zz SET mode='-rw-r--r-x' WHERE name='h.txt';
159  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
160} {
161  f.txt 33188 1000000000 abcde 0
162  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
163  i.txt 33188 4 zxcvb 0
164}
165do_zipfile_blob_test 1.6.3a test.zip
166
167do_execsql_test 1.6.4 {
168  UPDATE zz SET name = 'blue.txt' WHERE name='f.txt';
169  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
170} {
171  blue.txt 33188 1000000000 abcde 0
172  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
173  i.txt 33188 4 zxcvb 0
174}
175do_zipfile_blob_test 1.6.4a test.zip
176
177do_execsql_test 1.6.5 {
178  UPDATE zz SET data = 'edcba' WHERE name='blue.txt';
179  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
180} {
181  blue.txt 33188 1000000000 edcba 0
182  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
183  i.txt 33188 4 zxcvb 0
184}
185
186do_execsql_test 1.6.6 {
187  UPDATE zz SET mode=NULL, data = NULL WHERE name='blue.txt';
188  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
189} {
190  blue.txt/ 16877 1000000000 {} 0
191  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
192  i.txt 33188 4 zxcvb 0
193}
194
195do_catchsql_test 1.6.7 {
196  UPDATE zz SET data=NULL WHERE name='i.txt'
197} {1 {constraint failed}}
198do_execsql_test 1.6.8 {
199  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
200} {
201  blue.txt/ 16877 1000000000 {} 0
202  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
203  i.txt 33188 4 zxcvb 0
204}
205
206#-------------------------------------------------------------------------
207db close
208forcedelete test.zip
209reset_db
210load_static_extension db zipfile
211do_execsql_test 2.1 {
212  CREATE VIRTUAL TABLE zzz USING zipfile('test.zip');
213  INSERT INTO zzz(name, mode) VALUES('dirname', 'drwxr-xr-x');
214  SELECT name, mode, data FROM zzz;
215} {dirname/ 16877 {}}
216do_execsql_test 2.2 {
217  INSERT INTO zzz(name, data) VALUES('dirname2', NULL);
218  INSERT INTO zzz(name, data) VALUES('dirname2/file1.txt', 'abcdefghijklmnop');
219  SELECT name, mode, data FROM zzz;
220} {
221  dirname/ 16877 {}
222  dirname2/ 16877 {}
223  dirname2/file1.txt 33188 abcdefghijklmnop
224}
225
226do_catchsql_test 2.3 {
227  UPDATE zzz SET name = 'dirname3' WHERE name = 'dirname/';
228} {0 {}}
229do_execsql_test 2.4 {
230  SELECT name, mode, data FROM zzz;
231} {
232  dirname3/ 16877 {}
233  dirname2/ 16877 {}
234  dirname2/file1.txt 33188 abcdefghijklmnop
235}
236do_zipfile_blob_test 2.4.1 test.zip
237
238# If on unix, check that the [unzip] utility can unpack our archive.
239#
240if {$::tcl_platform(platform)=="unix"} {
241  do_test 2.5.1 {
242    forcedelete dirname
243    forcedelete dirname2
244    set rc [catch { exec unzip test.zip > /dev/null } msg]
245    list $rc $msg
246  } {0 {}}
247  do_test 2.5.2 { file isdir dirname3 } 1
248  do_test 2.5.3 { file isdir dirname2 } 1
249  do_test 2.5.4 { file isdir dirname2/file1.txt } 0
250  do_test 2.5.5 {
251    set fd [open dirname2/file1.txt]
252    set data [read $fd]
253    close $fd
254    set data
255  } {abcdefghijklmnop}
256}
257
258#-------------------------------------------------------------------------
259reset_db
260forcedelete test.zip
261load_static_extension db zipfile
262
263do_execsql_test 3.0 {
264  CREATE VIRTUAL TABLE temp.x1 USING zipfile('test.zip');
265  INSERT INTO x1(name, data) VALUES('dir1/', NULL);
266  INSERT INTO x1(name, data) VALUES('file1', '1234');
267  INSERT INTO x1(name, data) VALUES('dir1/file2', '5678');
268}
269foreach {tn fname} {
270  1 dir1
271  2 file1
272  3 dir1/file2
273} {
274  do_catchsql_test 3.1.$tn.0 {
275    INSERT INTO x1(name, data) VALUES($fname, NULL);
276  } {1 {constraint failed}}
277  do_catchsql_test 3.1.$tn.1 {
278    INSERT INTO x1(name, data) VALUES($fname || '/', NULL);
279  } {1 {constraint failed}}
280  do_catchsql_test 3.1.$tn.2 {
281    INSERT INTO x1(name, data) VALUES($fname, 'abcd');
282  } {1 {constraint failed}}
283}
284
285do_catchsql_test 3.2 {
286  SELECT rowid FROM x1
287} {1 {no such column: rowid}}
288
289#-------------------------------------------------------------------------
290reset_db
291forcedelete test.zip
292load_static_extension db zipfile
293
294do_execsql_test 4.0 {
295  CREATE VIRTUAL TABLE x2 USING zipfile();
296  INSERT INTO x2(name, data) VALUES('dir1/', NULL);
297  INSERT INTO x2(name, data) VALUES('file1', '1234');
298  INSERT INTO x2(name, data) VALUES('dir1/file2', '5678');
299  SELECT name, data FROM x2
300} {
301  dir1/ {} file1 1234 dir1/file2 5678
302}
303
304do_test 4.1 {
305  set data [db one {SELECT zipfile_blob(z) FROM x2 LIMIT 1}]
306  db eval { SELECT name, data FROM zipfile($data) }
307} {dir1/ {} file1 1234 dir1/file2 5678}
308
309
310
311finish_test
312
313