1BEGIN { 2 if ($ENV{PERL_CORE}) { 3 chdir 't' if -d 't'; 4 @INC = ("../lib", "lib/compress"); 5 } 6} 7 8use lib qw(t t/compress); 9use strict; 10use warnings; 11use bytes; 12 13use Test::More ; 14use CompTestUtils; 15 16BEGIN { 17 # use Test::NoWarnings, if available 18 my $extra = 0 ; 19 $extra = 1 20 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 }; 21 22 plan tests => 101 + $extra ; 23 24 use_ok('IO::Compress::Zip', qw(:all)) ; 25 use_ok('IO::Uncompress::Unzip', qw(unzip $UnzipError)) ; 26 27 eval { 28 require IO::Compress::Bzip2 ; 29 import IO::Compress::Bzip2 2.010 ; 30 require IO::Uncompress::Bunzip2 ; 31 import IO::Uncompress::Bunzip2 2.010 ; 32 } ; 33 34} 35 36 37sub getContent 38{ 39 my $filename = shift; 40 41 my $u = new IO::Uncompress::Unzip $filename, Append => 1, @_ 42 or die "Cannot open $filename: $UnzipError"; 43 44 isa_ok $u, "IO::Uncompress::Unzip"; 45 46 my @content; 47 my $status ; 48 49 for ($status = 1; $status > 0 ; $status = $u->nextStream()) 50 { 51 my $name = $u->getHeaderInfo()->{Name}; 52 #warn "Processing member $name\n" ; 53 54 my $buff = ''; 55 1 while ($status = $u->read($buff)) ; 56 57 push @content, $buff; 58 last unless $status == 0; 59 } 60 61 die "Error processing $filename: $status $!\n" 62 if $status < 0 ; 63 64 return @content; 65} 66 67 68 69{ 70 title "Create a simple zip - All Deflate"; 71 72 my $lex = new LexFile my $file1; 73 74 my @content = ( 75 'hello', 76 '', 77 'goodbye ', 78 ); 79 80 my $zip = new IO::Compress::Zip $file1, 81 Name => "one", Method => ZIP_CM_DEFLATE, Stream => 0; 82 isa_ok $zip, "IO::Compress::Zip"; 83 84 is $zip->write($content[0]), length($content[0]), "write"; 85 $zip->newStream(Name=> "two", Method => ZIP_CM_DEFLATE); 86 is $zip->write($content[1]), length($content[1]), "write"; 87 $zip->newStream(Name=> "three", Method => ZIP_CM_DEFLATE); 88 is $zip->write($content[2]), length($content[2]), "write"; 89 ok $zip->close(), "closed"; 90 91 my @got = getContent($file1); 92 93 is $got[0], $content[0], "Got 1st entry"; 94 is $got[1], $content[1], "Got 2nd entry"; 95 is $got[2], $content[2], "Got 3nd entry"; 96} 97 98SKIP: 99{ 100 title "Create a simple zip - All Bzip2"; 101 102 skip "IO::Compress::Bzip2 not available", 9 103 unless defined $IO::Compress::Bzip2::VERSION; 104 105 my $lex = new LexFile my $file1; 106 107 my @content = ( 108 'hello', 109 '', 110 'goodbye ', 111 ); 112 113 my $zip = new IO::Compress::Zip $file1, 114 Name => "one", Method => ZIP_CM_BZIP2, Stream => 0; 115 isa_ok $zip, "IO::Compress::Zip"; 116 117 is $zip->write($content[0]), length($content[0]), "write"; 118 $zip->newStream(Name=> "two", Method => ZIP_CM_BZIP2); 119 is $zip->write($content[1]), length($content[1]), "write"; 120 $zip->newStream(Name=> "three", Method => ZIP_CM_BZIP2); 121 is $zip->write($content[2]), length($content[2]), "write"; 122 ok $zip->close(), "closed"; 123 124 my @got = getContent($file1); 125 126 is $got[0], $content[0], "Got 1st entry"; 127 is $got[1], $content[1], "Got 2nd entry"; 128 is $got[2], $content[2], "Got 3nd entry"; 129} 130 131SKIP: 132{ 133 title "Create a simple zip - Deflate + Bzip2"; 134 135 skip "IO::Compress::Bzip2 not available", 9 136 unless $IO::Compress::Bzip2::VERSION; 137 138 my $lex = new LexFile my $file1; 139 140 my @content = ( 141 'hello', 142 'and', 143 'goodbye ', 144 ); 145 146 my $zip = new IO::Compress::Zip $file1, 147 Name => "one", Method => ZIP_CM_DEFLATE, Stream => 0; 148 isa_ok $zip, "IO::Compress::Zip"; 149 150 is $zip->write($content[0]), length($content[0]), "write"; 151 $zip->newStream(Name=> "two", Method => ZIP_CM_BZIP2); 152 is $zip->write($content[1]), length($content[1]), "write"; 153 $zip->newStream(Name=> "three", Method => ZIP_CM_DEFLATE); 154 is $zip->write($content[2]), length($content[2]), "write"; 155 ok $zip->close(), "closed"; 156 157 my @got = getContent($file1); 158 159 is $got[0], $content[0], "Got 1st entry"; 160 is $got[1], $content[1], "Got 2nd entry"; 161 is $got[2], $content[2], "Got 3nd entry"; 162} 163 164{ 165 title "Create a simple zip - All STORE"; 166 167 my $lex = new LexFile my $file1; 168 169 my @content = ( 170 'hello', 171 '', 172 'goodbye ', 173 ); 174 175 my $zip = new IO::Compress::Zip $file1, 176 Name => "one", Method => ZIP_CM_STORE, Stream => 0; 177 isa_ok $zip, "IO::Compress::Zip"; 178 179 is $zip->write($content[0]), length($content[0]), "write"; 180 $zip->newStream(Name=> "two", Method => ZIP_CM_STORE); 181 is $zip->write($content[1]), length($content[1]), "write"; 182 $zip->newStream(Name=> "three", Method => ZIP_CM_STORE); 183 is $zip->write($content[2]), length($content[2]), "write"; 184 ok $zip->close(), "closed"; 185 186 my @got = getContent($file1); 187 188 is $got[0], $content[0], "Got 1st entry"; 189 is $got[1], $content[1], "Got 2nd entry"; 190 is $got[2], $content[2], "Got 3nd entry"; 191} 192 193{ 194 title "Create a simple zip - Deflate + STORE"; 195 196 my $lex = new LexFile my $file1; 197 198 my @content = qw( 199 hello 200 and 201 goodbye 202 ); 203 204 my $zip = new IO::Compress::Zip $file1, 205 Name => "one", Method => ZIP_CM_DEFLATE, Stream => 0; 206 isa_ok $zip, "IO::Compress::Zip"; 207 208 is $zip->write($content[0]), length($content[0]), "write"; 209 $zip->newStream(Name=> "two", Method => ZIP_CM_STORE); 210 is $zip->write($content[1]), length($content[1]), "write"; 211 $zip->newStream(Name=> "three", Method => ZIP_CM_DEFLATE); 212 is $zip->write($content[2]), length($content[2]), "write"; 213 ok $zip->close(), "closed"; 214 215 my @got = getContent($file1); 216 217 is $got[0], $content[0], "Got 1st entry"; 218 is $got[1], $content[1], "Got 2nd entry"; 219 is $got[2], $content[2], "Got 3nd entry"; 220} 221 222{ 223 title "Create a simple zip - Deflate + zero length STORE"; 224 225 my $lex = new LexFile my $file1; 226 227 my @content = ( 228 'hello ', 229 '', 230 'goodbye ', 231 ); 232 233 my $zip = new IO::Compress::Zip $file1, 234 Name => "one", Method => ZIP_CM_DEFLATE, Stream => 0; 235 isa_ok $zip, "IO::Compress::Zip"; 236 237 is $zip->write($content[0]), length($content[0]), "write"; 238 $zip->newStream(Name=> "two", Method => ZIP_CM_STORE); 239 is $zip->write($content[1]), length($content[1]), "write"; 240 $zip->newStream(Name=> "three", Method => ZIP_CM_DEFLATE); 241 is $zip->write($content[2]), length($content[2]), "write"; 242 ok $zip->close(), "closed"; 243 244 my @got = getContent($file1); 245 246 is $got[0], $content[0], "Got 1st entry"; 247 ok $got[1] eq $content[1], "Got 2nd entry"; 248 is $got[2], $content[2], "Got 3nd entry"; 249} 250 251{ 252 title "RT #72548"; 253 254 my $lex = new LexFile my $file1; 255 256 my $blockSize = 1024 * 16; 257 258 my @content = ( 259 'hello', 260 "x" x ($blockSize + 1) 261 ); 262 263 my $zip = new IO::Compress::Zip $file1, 264 Name => "one", Method => ZIP_CM_STORE, Stream => 0; 265 isa_ok $zip, "IO::Compress::Zip"; 266 267 is $zip->write($content[0]), length($content[0]), "write"; 268 269 $zip->newStream(Name=> "two", Method => ZIP_CM_STORE); 270 is $zip->write($content[1]), length($content[1]), "write"; 271 272 ok $zip->close(), "closed"; 273 274 my @got = getContent($file1, BlockSize => $blockSize); 275 276 is $got[0], $content[0], "Got 1st entry"; 277 is $got[1], $content[1], "Got 2nd entry"; 278} 279 280{ 281 title "Zip file with a single zero-length file"; 282 283 my $lex = new LexFile my $file1; 284 285 286 my $zip = new IO::Compress::Zip $file1, 287 Name => "one", Method => ZIP_CM_STORE, Stream => 0; 288 isa_ok $zip, "IO::Compress::Zip"; 289 290 $zip->newStream(Name=> "two", Method => ZIP_CM_STORE); 291 ok $zip->close(), "closed"; 292 293 my @got = getContent($file1); 294 295 is $got[0], "", "no content"; 296 is $got[1], "", "no content"; 297} 298 299SKIP: 300for my $method (ZIP_CM_DEFLATE, ZIP_CM_STORE, ZIP_CM_BZIP2) 301{ 302 title "Read a line from zip, Method $method"; 303 304 skip "IO::Compress::Bzip2 not available", 14 305 unless defined $IO::Compress::Bzip2::VERSION; 306 307 my $content = "a single line\n"; 308 my $zip ; 309 310 my $status = zip \$content => \$zip, 311 Method => $method, 312 Stream => 0, 313 Name => "123"; 314 is $status, 1, " Created a zip file"; 315 316 my $u = new IO::Uncompress::Unzip \$zip; 317 isa_ok $u, "IO::Uncompress::Unzip"; 318 319 is $u->getline, $content, " Read first line ok"; 320 ok ! $u->getline, " Second line doesn't exist"; 321 322 323} 324 325{ 326 title "isMethodAvailable" ; 327 328 ok IO::Compress::Zip::isMethodAvailable(ZIP_CM_STORE), "ZIP_CM_STORE available"; 329 ok IO::Compress::Zip::isMethodAvailable(ZIP_CM_DEFLATE), "ZIP_CM_DEFLATE available"; 330 #ok IO::Compress::Zip::isMethodAvailable(ZIP_CM_STORE), "ZIP_CM_STORE available"; 331 332 ok ! IO::Compress::Zip::isMethodAvailable(999), "999 not available"; 333} 334 335{ 336 title "Member & Comment 0"; 337 338 my $lex = new LexFile my $file1; 339 340 my $content = 'hello' ; 341 342 343 my $zip = new IO::Compress::Zip $file1, 344 Name => "0", Comment => "0" ; 345 isa_ok $zip, "IO::Compress::Zip"; 346 347 is $zip->write($content), length($content), "write"; 348 349 ok $zip->close(), "closed"; 350 351 352 353 my $u = new IO::Uncompress::Unzip $file1, Append => 1, @_ 354 or die "Cannot open $file1: $UnzipError"; 355 356 isa_ok $u, "IO::Uncompress::Unzip"; 357 358 my $name = $u->getHeaderInfo()->{Name}; 359 360 is $u->getHeaderInfo()->{Name}, "0", "Name is '0'"; 361} 362 363