4 @INC = ("../lib", "lib/compress");
8 use lib qw(t t/compress);
18 # use Test::NoWarnings, if available
21 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
23 plan tests => 250 + $extra ;
25 use_ok('Compress::Zlib', 2) ;
26 use_ok('IO::Compress::Gzip::Constants') ;
35 my $len = length $hello ;
37 # Check zlib_version and ZLIB_VERSION are the same.
38 is Compress::Zlib::zlib_version, ZLIB_VERSION,
39 "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
44 my $name = "test.gz" ;
47 ok my $fil = gzopen($name, "wb") ;
49 is $gzerrno, 0, 'gzerrno is 0';
50 is $fil->gzerror(), 0, "gzerror() returned 0";
52 is $fil->gztell(), 0, "gztell returned 0";
53 is $gzerrno, 0, 'gzerrno is 0';
55 is $fil->gzwrite($hello), $len ;
56 is $gzerrno, 0, 'gzerrno is 0';
58 is $fil->gztell(), $len, "gztell returned $len";
59 is $gzerrno, 0, 'gzerrno is 0';
63 ok $fil = gzopen($name, "rb") ;
66 is $gzerrno, 0, 'gzerrno is 0';
69 is $fil->gzread($uncomp), $len;
71 is $fil->gztell(), $len;
74 # gzread after eof bahavior
77 is $fil->gzread($xyz), 0, "gzread returns 0 on eof" ;
78 is $xyz, "", "gzread on eof zaps the output buffer [Match 1,x behavior]" ;
84 1 while unlink $name ;
86 ok $hello eq $uncomp ;
88 # check that a number can be gzipped
92 ok $fil = gzopen($name, "wb") ;
96 is $fil->gzwrite($number), $num_len, "gzwrite returned $num_len" ;
97 is $gzerrno, 0, 'gzerrno is 0';
98 ok $fil->gzflush(Z_FINISH) ;
100 is $gzerrno, 0, 'gzerrno is 0';
104 cmp_ok $gzerrno, '==', 0;
106 ok $fil = gzopen($name, "rb") ;
108 ok (($x = $fil->gzread($uncomp)) == $num_len) ;
110 ok $fil->gzerror() == 0 || $fil->gzerror() == Z_STREAM_END;
111 ok $gzerrno == 0 || $gzerrno == Z_STREAM_END;
118 or print "# gzerrno is $gzerrno\n" ;
120 1 while unlink $name ;
122 ok $number == $uncomp ;
123 ok $number eq $uncomp ;
126 # now a bigger gzip test
129 my $file = "$text.gz" ;
131 ok my $f = gzopen($file, "wb") ;
133 # generate a long random string
136 { $contents .= chr int rand 256 }
138 $len = length $contents ;
140 ok $f->gzwrite($contents) == $len ;
144 ok $f = gzopen($file, "rb") ;
149 is $f->gzread($uncompressed, $len), $len ;
151 ok $contents eq $uncompressed
153 or print "# Length orig $len" .
154 ", Length uncompressed " . length($uncompressed) . "\n" ;
159 1 while unlink($file) ;
161 # gzip - readline tests
162 # ======================
164 # first create a small gzipped text file
166 my @text = (<<EOM, <<EOM, <<EOM, <<EOM) ;
171 the line after the previous line
176 $text = join("", @text) ;
178 ok $fil = gzopen($name, "wb") ;
179 ok $fil->gzwrite($text) == length $text ;
182 # now try to read it back in
183 ok $fil = gzopen($name, "rb") ;
186 for my $i (0 .. @text -2)
188 ok $fil->gzreadline($line) > 0;
189 is $line, $text[$i] ;
193 # now read the last line
194 ok $fil->gzreadline($line) > 0;
195 is $line, $text[-1] ;
199 is $fil->gzreadline($line), 0;
204 1 while unlink($name) ;
206 # a text file with a very long line (bigger than the internal buffer)
207 my $line1 = ("abcdefghijklmnopq" x 2000) . "\n" ;
208 my $line2 = "second line\n" ;
209 $text = $line1 . $line2 ;
210 ok $fil = gzopen($name, "wb") ;
211 ok $fil->gzwrite($text) == length $text ;
214 # now try to read it back in
215 ok $fil = gzopen($name, "rb") ;
219 while ($fil->gzreadline($line) > 0) {
231 1 while unlink $name ;
233 # a text file which is not termined by an EOL
235 $line1 = "hello hello, I'm back again\n" ;
236 $line2 = "there is no end in sight" ;
238 $text = $line1 . $line2 ;
239 ok $fil = gzopen($name, "wb") ;
240 ok $fil->gzwrite($text) == length $text ;
243 # now try to read it back in
244 ok $fil = gzopen($name, "rb") ;
246 while ($fil->gzreadline($line) > 0) {
257 1 while unlink $name ;
261 title 'mix gzread and gzreadline';
263 # case 1: read a line, then a block. The block is
264 # smaller than the internal block used by
266 my $lex = new LexFile my $name ;
267 $line1 = "hello hello, I'm back again\n" ;
268 $line2 = "abc" x 200 ;
269 my $line3 = "def" x 200 ;
271 $text = $line1 . $line2 . $line3 ;
273 ok $fil = gzopen($name, "wb"), ' gzopen for write ok' ;
274 is $fil->gzwrite($text), length $text, ' gzwrite ok' ;
275 is $fil->gztell(), length $text, ' gztell ok' ;
276 ok ! $fil->gzclose, ' gzclose ok' ;
278 # now try to read it back in
279 ok $fil = gzopen($name, "rb"), ' gzopen for read ok' ;
280 ok ! $fil->gzeof(), ' !gzeof' ;
281 cmp_ok $fil->gzreadline($line), '>', 0, ' gzreadline' ;
282 is $fil->gztell(), length $line1, ' gztell ok' ;
283 ok ! $fil->gzeof(), ' !gzeof' ;
284 is $line, $line1, ' got expected line' ;
285 cmp_ok $fil->gzread($line, length $line2), '>', 0, ' gzread ok' ;
286 is $fil->gztell(), length($line1)+length($line2), ' gztell ok' ;
287 ok ! $fil->gzeof(), ' !gzeof' ;
288 is $line, $line2, ' read expected block' ;
289 cmp_ok $fil->gzread($line, length $line3), '>', 0, ' gzread ok' ;
290 is $fil->gztell(), length($text), ' gztell ok' ;
291 ok $fil->gzeof(), ' !gzeof' ;
292 is $line, $line3, ' read expected block' ;
293 ok ! $fil->gzclose, ' gzclose' ;
297 title "Pass gzopen a filehandle - use IO::File" ;
299 my $lex = new LexFile my $name ;
301 my $hello = "hello" ;
302 my $len = length $hello ;
304 my $f = new IO::File ">$name" ;
308 ok $fil = gzopen($f, "wb") ;
310 ok $fil->gzwrite($hello) == $len ;
314 $f = new IO::File "<$name" ;
315 ok $fil = gzopen($name, "rb") ;
318 ok (($x = $fil->gzread($uncomp)) == $len)
319 or print "# length $x, expected $len\n" ;
325 is $uncomp, $hello, "got expected output" ;
330 title "Pass gzopen a filehandle - use open" ;
332 my $lex = new LexFile my $name ;
334 my $hello = "hello" ;
335 my $len = length $hello ;
340 ok $fil = gzopen(*F, "wb") ;
342 is $fil->gzwrite($hello), $len ;
347 ok $fil = gzopen(*F, "rb") ;
350 $x = $fil->gzread($uncomp);
362 foreach my $stdio ( ['-', '-'], [*STDIN, *STDOUT])
364 my $stdin = $stdio->[0];
365 my $stdout = $stdio->[1];
367 title "Pass gzopen a filehandle - use $stdin" ;
369 my $lex = new LexFile my $name ;
371 my $hello = "hello" ;
372 my $len = length $hello ;
374 ok open(SAVEOUT, ">&STDOUT"), " save STDOUT";
375 my $dummy = fileno SAVEOUT;
376 ok open(STDOUT, ">$name"), " redirect STDOUT" ;
380 my $fil = gzopen($stdout, "wb") ;
383 ($fil->gzwrite($hello) == $len) &&
384 ($fil->gzclose == 0) ;
386 open(STDOUT, ">&SAVEOUT");
388 ok $status, " wrote to stdout";
390 open(SAVEIN, "<&STDIN");
391 ok open(STDIN, "<$name"), " redirect STDIN";
392 $dummy = fileno SAVEIN;
394 ok $fil = gzopen($stdin, "rb") ;
397 ok (($x = $fil->gzread($uncomp)) == $len)
398 or print "# length $x, expected $len\n" ;
404 open(STDIN, "<&SAVEIN");
412 title 'test parameters for gzopen';
413 my $lex = new LexFile my $name ;
418 eval ' $fil = gzopen() ' ;
419 like $@, mkEvalErr('Not enough arguments for Compress::Zlib::gzopen'),
420 ' gzopen with missing mode fails' ;
423 $fil = gzopen($name, "xy") ;
424 ok ! defined $fil, ' gzopen with unknown mode fails' ;
426 $fil = gzopen($name, "ab") ;
427 ok $fil, ' gzopen with mode "ab" is ok' ;
429 $fil = gzopen($name, "wb6") ;
430 ok $fil, ' gzopen with mode "wb6" is ok' ;
432 $fil = gzopen($name, "wbf") ;
433 ok $fil, ' gzopen with mode "wbf" is ok' ;
435 $fil = gzopen($name, "wbh") ;
436 ok $fil, ' gzopen with mode "wbh" is ok' ;
440 title 'Read operations when opened for writing';
442 my $lex = new LexFile my $name ;
444 ok $fil = gzopen($name, "wb"), ' gzopen for writing' ;
445 ok !$fil->gzeof(), ' !eof'; ;
446 is $fil->gzread(), Z_STREAM_ERROR, " gzread returns Z_STREAM_ERROR" ;
447 ok ! $fil->gzclose, " gzclose ok" ;
451 title 'write operations when opened for reading';
453 my $lex = new LexFile my $name ;
456 ok $fil = gzopen($name, "wb"), " gzopen for writing" ;
457 is $fil->gzwrite($text), length $text, " gzwrite ok" ;
458 ok ! $fil->gzclose, " gzclose ok" ;
460 ok $fil = gzopen($name, "rb"), " gzopen for reading" ;
461 is $fil->gzwrite(), Z_STREAM_ERROR, " gzwrite returns Z_STREAM_ERROR" ;
465 title 'read/write a non-readable/writable file';
469 my $lex = new LexFile my $name ;
470 writeFile($name, "abc");
473 skip "Cannot create non-writable file", 3
476 ok ! -w $name, " input file not writable";
478 my $fil = gzopen($name, "wb") ;
479 ok !$fil, " gzopen returns undef" ;
480 ok $gzerrno, " gzerrno ok" or
481 diag " gzerrno $gzerrno\n";
488 my $lex = new LexFile my $name ;
489 skip "Cannot create non-readable file", 3
492 writeFile($name, "abc");
495 skip "Cannot create non-readable file", 3
498 ok ! -r $name, " input file not readable";
500 $fil = gzopen($name, "rb") ;
501 ok !$fil, " gzopen returns undef" ;
502 ok $gzerrno, " gzerrno ok";
512 my $lex = new LexFile my $name ;
514 my $first = "beginning" ;
515 my $last = "the end" ;
516 my $iow = gzopen($name, "w");
517 $iow->gzwrite($first) ;
518 ok $iow->gzseek(5, SEEK_CUR) ;
519 is $iow->gztell(), length($first)+5;
520 ok $iow->gzseek(0, SEEK_CUR) ;
521 is $iow->gztell(), length($first)+5;
522 ok $iow->gzseek(length($first)+10, SEEK_SET) ;
523 is $iow->gztell(), length($first)+10;
525 $iow->gzwrite($last) ;
528 ok GZreadFile($name) eq $first . "\x00" x 10 . $last ;
530 my $io = gzopen($name, "r");
531 ok $io->gzseek(length($first), SEEK_CUR) ;
533 is $io->gztell(), length($first);
535 ok $io->gzread($buff, 5) ;
536 is $buff, "\x00" x 5 ;
537 is $io->gztell(), length($first) + 5;
539 is $io->gzread($buff, 0), 0 ;
540 #is $buff, "\x00" x 5 ;
541 is $io->gztell(), length($first) + 5;
543 ok $io->gzseek(0, SEEK_CUR) ;
544 my $here = $io->gztell() ;
545 is $here, length($first)+5;
547 ok $io->gzseek($here+5, SEEK_SET) ;
548 is $io->gztell(), $here+5 ;
549 ok $io->gzread($buff, 100) ;
556 my $lex = new LexFile my $name ;
558 my $a = gzopen($name, "w");
561 or print "# gzerrno is $Compress::Zlib::gzerrno \n" ;
562 eval { $a->gzseek(-1, 10) ; };
563 like $@, mkErr("gzseek: unknown value, 10, for whence parameter");
565 eval { $a->gzseek(-1, SEEK_END) ; };
566 like $@, mkErr("gzseek: cannot seek backwards");
572 my $u = gzopen($name, "r");
574 eval { $u->gzseek(-1, 10) ; };
575 like $@, mkErr("gzseek: unknown value, 10, for whence parameter");
577 eval { $u->gzseek(-1, SEEK_END) ; };
578 like $@, mkErr("gzseek: SEEK_END not allowed");
580 eval { $u->gzseek(-1, SEEK_CUR) ; };
581 like $@, mkErr("gzseek: cannot seek backwards");
585 title "gzread ver 1.x compat -- the output buffer is always zapped.";
586 my $lex = new LexFile my $name ;
588 my $a = gzopen($name, "w");
592 my $u = gzopen($name, "r");
595 is $u->gzread($buf1, 0), 0, " gzread returns 0";
596 ok defined $buf1, " output buffer defined";
597 is $buf1, "", " output buffer empty string";
600 is $u->gzread($buf2, 0), 0, " gzread returns 0";
601 ok defined $buf2, " output buffer defined";
602 is $buf2, "", " output buffer empty string";
606 title 'gzreadline does not support $/';
608 my $lex = new LexFile my $name ;
610 my $a = gzopen($name, "w");
612 my $len = length $text;
617 for my $delim ( undef, "", 0, 1, "abc", $text, "\n\n", "\n" )
620 my $u = gzopen($name, "r");
622 is $u->gzreadline($line), length $text, " read $len bytes";
623 is $line, $text, " got expected line";
624 ok ! $u->gzclose, " closed" ;
625 is $/, $delim, ' $/ unchanged by gzreadline';