xref: /sqlite-3.40.0/test/zipfile.test (revision 2879952f)
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
25forcedelete test.zip
26do_execsql_test 1.0 {
27  CREATE VIRTUAL TABLE temp.zz USING zipfile('test.zip');
28  PRAGMA table_info(zz);
29} {
30  0 name {} 1 {} 1
31  1 mode {} 0 {} 0
32  2 mtime {} 0 {} 0
33  3 sz {} 0 {} 0
34  4 rawdata {} 0 {} 0
35  5 data {} 0 {} 0
36  6 method {} 0 {} 0
37}
38
39do_catchsql_test 1.1.0.1 {
40  INSERT INTO zz(name, mode, mtime, sz, rawdata, method)
41  VALUES('f.txt', '-rw-r--r--', 1000000000, 5, 'abcde', 0);
42} {1 {constraint failed}}
43do_catchsql_test 1.1.0.1 {
44  INSERT INTO zz(name, mtime, sz, rawdata, method)
45  VALUES('g.txt', 1000000002, 5, '12345', 0);
46} {1 {constraint failed}}
47
48do_execsql_test 1.1.1 {
49  INSERT INTO zz(name, mode, mtime, data, method)
50  VALUES('f.txt', '-rw-r--r--', 1000000000, 'abcde', 0);
51}
52do_execsql_test 1.1.2 {
53  INSERT INTO zz(name, mode, mtime, data, method)
54  VALUES('g.txt', NULL, 1000000002, '12345', 0);
55}
56
57do_execsql_test 1.2 {
58  SELECT name, mtime, data FROM zipfile('test.zip')
59} {
60  f.txt 1000000000 abcde
61  g.txt 1000000002 12345
62}
63
64do_execsql_test 1.3 {
65  INSERT INTO zz(name, mode, mtime, data) VALUES('h.txt',
66    '-rw-r--r--', 1000000004, 'aaaaaaaaaabbbbbbbbbb'
67  );
68}
69
70do_execsql_test 1.4 {
71  SELECT name, mtime, data, method FROM zipfile('test.zip');
72} {
73  f.txt 1000000000 abcde 0
74  g.txt 1000000002 12345 0
75  h.txt 1000000004 aaaaaaaaaabbbbbbbbbb 8
76}
77
78do_execsql_test 1.4.1 {
79  SELECT name, json_extract( zipfile_cds(z) , '$.crc32')!=0
80  FROM zipfile('test.zip');
81} {
82  f.txt 1
83  g.txt 1
84  h.txt 1
85}
86
87do_execsql_test 1.5.1 {
88  BEGIN;
89    INSERT INTO zz(name, mode, mtime, data, method)
90    VALUES('i.txt', '-rw-r--r--', 1000000006, 'zxcvb', 0);
91    SELECT name FROM zz;
92  COMMIT;
93} {f.txt g.txt h.txt i.txt}
94do_execsql_test 1.5.2 {
95  SELECT name FROM zz;
96} {f.txt g.txt h.txt i.txt}
97do_execsql_test 1.5.3 {
98  SELECT data FROM zz WHERE name='i.txt';
99} {zxcvb}
100
101do_execsql_test 1.6.0 {
102  DELETE FROM zz WHERE name='g.txt';
103  SELECT name FROM zz;
104} {f.txt h.txt i.txt}
105
106do_execsql_test 1.6.1 {
107  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
108} {
109  f.txt 33188 1000000000 abcde 0
110  h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8
111  i.txt 33188 1000000006 zxcvb 0
112}
113
114do_execsql_test 1.6.2 {
115  UPDATE zz SET mtime=4 WHERE name='i.txt';
116  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
117} {
118  f.txt 33188 1000000000 abcde 0
119  h.txt 33188 1000000004 aaaaaaaaaabbbbbbbbbb 8
120  i.txt 33188 4 zxcvb 0
121}
122
123do_execsql_test 1.6.3 {
124  UPDATE zz SET mode='-rw-r--r-x' WHERE name='h.txt';
125  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
126} {
127  f.txt 33188 1000000000 abcde 0
128  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
129  i.txt 33188 4 zxcvb 0
130}
131
132do_execsql_test 1.6.4 {
133  UPDATE zz SET name = 'blue.txt' WHERE name='f.txt';
134  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
135} {
136  blue.txt 33188 1000000000 abcde 0
137  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
138  i.txt 33188 4 zxcvb 0
139}
140
141do_execsql_test 1.6.5 {
142  UPDATE zz SET data = 'edcba' WHERE name='blue.txt';
143  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
144} {
145  blue.txt 33188 1000000000 edcba 0
146  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
147  i.txt 33188 4 zxcvb 0
148}
149
150do_execsql_test 1.6.6 {
151  UPDATE zz SET mode=NULL, data = NULL WHERE name='blue.txt';
152  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
153} {
154  blue.txt/ 16877 1000000000 {} 0
155  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
156  i.txt 33188 4 zxcvb 0
157}
158
159do_catchsql_test 1.6.7 {
160  UPDATE zz SET data=NULL WHERE name='i.txt'
161} {1 {constraint failed}}
162do_execsql_test 1.6.8 {
163  SELECT name, mode, mtime, data, method FROM zipfile('test.zip');
164} {
165  blue.txt/ 16877 1000000000 {} 0
166  h.txt 33189 1000000004 aaaaaaaaaabbbbbbbbbb 8
167  i.txt 33188 4 zxcvb 0
168}
169
170#-------------------------------------------------------------------------
171db close
172forcedelete test.zip
173reset_db
174load_static_extension db zipfile
175do_execsql_test 2.1 {
176  CREATE VIRTUAL TABLE zzz USING zipfile('test.zip');
177  INSERT INTO zzz(name, mode) VALUES('dirname', 'drwxr-xr-x');
178  SELECT name, mode, data FROM zzz;
179} {dirname/ 16877 {}}
180do_execsql_test 2.2 {
181  INSERT INTO zzz(name, data) VALUES('dirname2', NULL);
182  INSERT INTO zzz(name, data) VALUES('dirname2/file1.txt', 'abcdefghijklmnop');
183  SELECT name, mode, data FROM zzz;
184} {
185  dirname/ 16877 {}
186  dirname2/ 16877 {}
187  dirname2/file1.txt 33188 abcdefghijklmnop
188}
189
190do_catchsql_test 2.3 {
191  UPDATE zzz SET name = 'dirname3' WHERE name = 'dirname/';
192} {0 {}}
193do_execsql_test 2.4 {
194  SELECT name, mode, data FROM zzz;
195} {
196  dirname3/ 16877 {}
197  dirname2/ 16877 {}
198  dirname2/file1.txt 33188 abcdefghijklmnop
199}
200
201# If on unix, check that the [unzip] utility can unpack our archive.
202#
203if {$::tcl_platform(platform)=="unix"} {
204  do_test 2.5.1 {
205    forcedelete dirname
206    forcedelete dirname2
207    set rc [catch { exec unzip test.zip > /dev/null } msg]
208    list $rc $msg
209  } {0 {}}
210  do_test 2.5.2 { file isdir dirname3 } 1
211  do_test 2.5.3 { file isdir dirname2 } 1
212  do_test 2.5.4 { file isdir dirname2/file1.txt } 0
213  do_test 2.5.5 {
214    set fd [open dirname2/file1.txt]
215    set data [read $fd]
216    close $fd
217    set data
218  } {abcdefghijklmnop}
219}
220
221#-------------------------------------------------------------------------
222reset_db
223forcedelete test.zip
224load_static_extension db zipfile
225
226do_execsql_test 3.0 {
227  CREATE VIRTUAL TABLE temp.x1 USING zipfile('test.zip');
228  INSERT INTO x1(name, data) VALUES('dir1/', NULL);
229  INSERT INTO x1(name, data) VALUES('file1', '1234');
230  INSERT INTO x1(name, data) VALUES('dir1/file2', '5678');
231}
232foreach {tn fname} {
233  1 dir1
234  2 file1
235  3 dir1/file2
236} {
237  do_catchsql_test 3.1.$tn.0 {
238    INSERT INTO x1(name, data) VALUES($fname, NULL);
239  } {1 {constraint failed}}
240  do_catchsql_test 3.1.$tn.1 {
241    INSERT INTO x1(name, data) VALUES($fname || '/', NULL);
242  } {1 {constraint failed}}
243  do_catchsql_test 3.1.$tn.2 {
244    INSERT INTO x1(name, data) VALUES($fname, 'abcd');
245  } {1 {constraint failed}}
246}
247
248do_catchsql_test 3.2 {
249  SELECT rowid FROM x1
250} {1 {no such column: rowid}}
251
252
253finish_test
254
255