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