Update Compress Modules to version 2.002
[p5sagit/p5-mst-13.2.git] / ext / Compress / Zlib / t / 14gzopen.t
CommitLineData
16816334 1BEGIN {
d695c1a1 2 if ($ENV{PERL_CORE}) {
16816334 3 chdir 't' if -d 't';
1a6a8453 4 @INC = ("../lib", "lib/compress");
16816334 5 }
6}
642e522c 7
25f0751f 8use lib qw(t t/compress);
642e522c 9use strict;
10use warnings;
11use bytes;
12
13use Test::More ;
25f0751f 14use CompTestUtils;
642e522c 15use IO::File ;
16
17BEGIN {
18 # use Test::NoWarnings, if available
19 my $extra = 0 ;
20 $extra = 1
21 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
22
98719077 23 plan tests => 217 + $extra ;
642e522c 24
25 use_ok('Compress::Zlib', 2) ;
25f0751f 26 use_ok('IO::Compress::Gzip::Constants') ;
642e522c 27}
28
29
30my $hello = <<EOM ;
31hello world
32this is a test
33EOM
34
35my $len = length $hello ;
36
37# Check zlib_version and ZLIB_VERSION are the same.
38is Compress::Zlib::zlib_version, ZLIB_VERSION,
39 "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
40
41# gzip tests
42#===========
43
44my $name = "test.gz" ;
45my ($x, $uncomp) ;
46
47ok my $fil = gzopen($name, "wb") ;
48
49is $gzerrno, 0, 'gzerrno is 0';
50is $fil->gzerror(), 0, "gzerror() returned 0";
51
52is $fil->gztell(), 0, "gztell returned 0";
53is $gzerrno, 0, 'gzerrno is 0';
54
55is $fil->gzwrite($hello), $len ;
56is $gzerrno, 0, 'gzerrno is 0';
57
58is $fil->gztell(), $len, "gztell returned $len";
59is $gzerrno, 0, 'gzerrno is 0';
60
61ok ! $fil->gzclose ;
62
63ok $fil = gzopen($name, "rb") ;
64
65ok ! $fil->gzeof() ;
66is $gzerrno, 0, 'gzerrno is 0';
67is $fil->gztell(), 0;
68
69is $fil->gzread($uncomp), $len;
70
71is $fil->gztell(), $len;
72ok $fil->gzeof() ;
cb7abd7f 73
74# gzread after eof bahavior
75
76my $xyz = "123" ;
77is $fil->gzread($xyz), 0, "gzread returns 0 on eof" ;
78is $xyz, "", "gzread on eof zaps the output buffer [Match 1,x behavior]" ;
79
642e522c 80ok ! $fil->gzclose ;
81ok $fil->gzeof() ;
82
cb7abd7f 83
9f2e3514 841 while unlink $name ;
642e522c 85
86ok $hello eq $uncomp ;
87
88# check that a number can be gzipped
89my $number = 7603 ;
90my $num_len = 4 ;
91
92ok $fil = gzopen($name, "wb") ;
93
94is $gzerrno, 0;
95
96is $fil->gzwrite($number), $num_len, "gzwrite returned $num_len" ;
97is $gzerrno, 0, 'gzerrno is 0';
98ok $fil->gzflush(Z_FINISH) ;
99
100is $gzerrno, 0, 'gzerrno is 0';
101
102ok ! $fil->gzclose ;
103
104cmp_ok $gzerrno, '==', 0;
105
106ok $fil = gzopen($name, "rb") ;
107
108ok (($x = $fil->gzread($uncomp)) == $num_len) ;
109
110ok $fil->gzerror() == 0 || $fil->gzerror() == Z_STREAM_END;
111ok $gzerrno == 0 || $gzerrno == Z_STREAM_END;
112ok $fil->gzeof() ;
113
114ok ! $fil->gzclose ;
115ok $fil->gzeof() ;
116
117ok $gzerrno == 0
118 or print "# gzerrno is $gzerrno\n" ;
119
9f2e3514 1201 while unlink $name ;
642e522c 121
122ok $number == $uncomp ;
123ok $number eq $uncomp ;
124
125
126# now a bigger gzip test
127
128my $text = 'text' ;
129my $file = "$text.gz" ;
130
131ok my $f = gzopen($file, "wb") ;
132
133# generate a long random string
134my $contents = '' ;
135foreach (1 .. 5000)
136 { $contents .= chr int rand 256 }
137
138$len = length $contents ;
139
140ok $f->gzwrite($contents) == $len ;
141
142ok ! $f->gzclose ;
143
144ok $f = gzopen($file, "rb") ;
145
146ok ! $f->gzeof() ;
147
148my $uncompressed ;
149is $f->gzread($uncompressed, $len), $len ;
150
151ok $contents eq $uncompressed
152
153 or print "# Length orig $len" .
154 ", Length uncompressed " . length($uncompressed) . "\n" ;
155
156ok $f->gzeof() ;
157ok ! $f->gzclose ;
158
9f2e3514 1591 while unlink($file) ;
642e522c 160
161# gzip - readline tests
162# ======================
163
164# first create a small gzipped text file
165$name = "test.gz" ;
166my @text = (<<EOM, <<EOM, <<EOM, <<EOM) ;
167this is line 1
168EOM
169the second line
170EOM
171the line after the previous line
172EOM
173the final line
174EOM
175
176$text = join("", @text) ;
177
178ok $fil = gzopen($name, "wb") ;
179ok $fil->gzwrite($text) == length $text ;
180ok ! $fil->gzclose ;
181
182# now try to read it back in
183ok $fil = gzopen($name, "rb") ;
184ok ! $fil->gzeof() ;
185my $line = '';
186for my $i (0 .. @text -2)
187{
188 ok $fil->gzreadline($line) > 0;
59bd6a32 189 is $line, $text[$i] ;
642e522c 190 ok ! $fil->gzeof() ;
191}
192
193# now read the last line
194ok $fil->gzreadline($line) > 0;
59bd6a32 195is $line, $text[-1] ;
642e522c 196ok $fil->gzeof() ;
197
198# read past the eof
199is $fil->gzreadline($line), 0;
200
201ok $fil->gzeof() ;
202ok ! $fil->gzclose ;
203ok $fil->gzeof() ;
9f2e3514 2041 while unlink($name) ;
642e522c 205
206# a text file with a very long line (bigger than the internal buffer)
207my $line1 = ("abcdefghijklmnopq" x 2000) . "\n" ;
208my $line2 = "second line\n" ;
209$text = $line1 . $line2 ;
210ok $fil = gzopen($name, "wb") ;
211ok $fil->gzwrite($text) == length $text ;
212ok ! $fil->gzclose ;
213
214# now try to read it back in
215ok $fil = gzopen($name, "rb") ;
216ok ! $fil->gzeof() ;
217my $i = 0 ;
218my @got = ();
219while ($fil->gzreadline($line) > 0) {
220 $got[$i] = $line ;
221 ++ $i ;
222}
59bd6a32 223is $i, 2 ;
224is $got[0], $line1 ;
225is $got[1], $line2 ;
642e522c 226
227ok $fil->gzeof() ;
228ok ! $fil->gzclose ;
229ok $fil->gzeof() ;
230
9f2e3514 2311 while unlink $name ;
642e522c 232
233# a text file which is not termined by an EOL
234
235$line1 = "hello hello, I'm back again\n" ;
236$line2 = "there is no end in sight" ;
237
238$text = $line1 . $line2 ;
239ok $fil = gzopen($name, "wb") ;
240ok $fil->gzwrite($text) == length $text ;
241ok ! $fil->gzclose ;
242
243# now try to read it back in
244ok $fil = gzopen($name, "rb") ;
245@got = () ; $i = 0 ;
246while ($fil->gzreadline($line) > 0) {
247 $got[$i] = $line ;
248 ++ $i ;
249}
59bd6a32 250is $i, 2 ;
251is $got[0], $line1 ;
252is $got[1], $line2 ;
642e522c 253
254ok $fil->gzeof() ;
255ok ! $fil->gzclose ;
256
9f2e3514 2571 while unlink $name ;
642e522c 258
259{
260
261 title 'mix gzread and gzreadline';
262
263 # case 1: read a line, then a block. The block is
264 # smaller than the internal block used by
265 # gzreadline
59bd6a32 266 my $lex = new LexFile my $name ;
642e522c 267 $line1 = "hello hello, I'm back again\n" ;
268 $line2 = "abc" x 200 ;
269 my $line3 = "def" x 200 ;
270
271 $text = $line1 . $line2 . $line3 ;
59bd6a32 272 my $fil;
642e522c 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' ;
277
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' ;
294}
295
296{
297 title "Pass gzopen a filehandle - use IO::File" ;
298
59bd6a32 299 my $lex = new LexFile my $name ;
642e522c 300
301 my $hello = "hello" ;
302 my $len = length $hello ;
303
642e522c 304 my $f = new IO::File ">$name" ;
305 ok $f;
306
59bd6a32 307 my $fil;
308 ok $fil = gzopen($f, "wb") ;
642e522c 309
310 ok $fil->gzwrite($hello) == $len ;
311
312 ok ! $fil->gzclose ;
313
314 $f = new IO::File "<$name" ;
315 ok $fil = gzopen($name, "rb") ;
316
317 my $uncmomp;
318 ok (($x = $fil->gzread($uncomp)) == $len)
319 or print "# length $x, expected $len\n" ;
320
321 ok $fil->gzeof() ;
322 ok ! $fil->gzclose ;
323 ok $fil->gzeof() ;
324
59bd6a32 325 is $uncomp, $hello, "got expected output" ;
642e522c 326}
327
328
329{
330 title "Pass gzopen a filehandle - use open" ;
331
59bd6a32 332 my $lex = new LexFile my $name ;
642e522c 333
334 my $hello = "hello" ;
335 my $len = length $hello ;
336
642e522c 337 open F, ">$name" ;
338
59bd6a32 339 my $fil;
340 ok $fil = gzopen(*F, "wb") ;
642e522c 341
342 is $fil->gzwrite($hello), $len ;
343
344 ok ! $fil->gzclose ;
345
346 open F, "<$name" ;
347 ok $fil = gzopen(*F, "rb") ;
348
349 my $uncmomp;
350 $x = $fil->gzread($uncomp);
351 is $x, $len ;
352
353 ok $fil->gzeof() ;
354 ok ! $fil->gzclose ;
355 ok $fil->gzeof() ;
356
59bd6a32 357 is $uncomp, $hello ;
642e522c 358
359
360}
361
362foreach my $stdio ( ['-', '-'], [*STDIN, *STDOUT])
363{
364 my $stdin = $stdio->[0];
365 my $stdout = $stdio->[1];
366
367 title "Pass gzopen a filehandle - use $stdin" ;
368
59bd6a32 369 my $lex = new LexFile my $name ;
642e522c 370
371 my $hello = "hello" ;
372 my $len = length $hello ;
373
642e522c 374 ok open(SAVEOUT, ">&STDOUT"), " save STDOUT";
375 my $dummy = fileno SAVEOUT;
376 ok open(STDOUT, ">$name"), " redirect STDOUT" ;
377
378 my $status = 0 ;
379
380 my $fil = gzopen($stdout, "wb") ;
381
382 $status = $fil &&
383 ($fil->gzwrite($hello) == $len) &&
384 ($fil->gzclose == 0) ;
385
386 open(STDOUT, ">&SAVEOUT");
387
388 ok $status, " wrote to stdout";
389
390 open(SAVEIN, "<&STDIN");
391 ok open(STDIN, "<$name"), " redirect STDIN";
392 $dummy = fileno SAVEIN;
393
394 ok $fil = gzopen($stdin, "rb") ;
395
396 my $uncmomp;
397 ok (($x = $fil->gzread($uncomp)) == $len)
398 or print "# length $x, expected $len\n" ;
399
400 ok $fil->gzeof() ;
401 ok ! $fil->gzclose ;
402 ok $fil->gzeof() ;
403
404 open(STDIN, "<&SAVEIN");
405
59bd6a32 406 is $uncomp, $hello ;
642e522c 407
408
409}
410
411{
412 title 'test parameters for gzopen';
59bd6a32 413 my $lex = new LexFile my $name ;
642e522c 414
415 my $fil;
416
642e522c 417 # missing parameters
418 eval ' $fil = gzopen() ' ;
419 like $@, mkEvalErr('Not enough arguments for Compress::Zlib::gzopen'),
420 ' gzopen with missing mode fails' ;
421
422 # unknown parameters
423 $fil = gzopen($name, "xy") ;
424 ok ! defined $fil, ' gzopen with unknown mode fails' ;
425
426 $fil = gzopen($name, "ab") ;
427 ok $fil, ' gzopen with mode "ab" is ok' ;
428
429 $fil = gzopen($name, "wb6") ;
430 ok $fil, ' gzopen with mode "wb6" is ok' ;
431
432 $fil = gzopen($name, "wbf") ;
433 ok $fil, ' gzopen with mode "wbf" is ok' ;
434
435 $fil = gzopen($name, "wbh") ;
436 ok $fil, ' gzopen with mode "wbh" is ok' ;
437}
438
439{
440 title 'Read operations when opened for writing';
441
59bd6a32 442 my $lex = new LexFile my $name ;
443 my $fil;
642e522c 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" ;
59bd6a32 447 ok ! $fil->gzclose, " gzclose ok" ;
642e522c 448}
449
450{
451 title 'write operations when opened for reading';
452
59bd6a32 453 my $lex = new LexFile my $name ;
642e522c 454 my $test = "hello" ;
59bd6a32 455 my $fil;
642e522c 456 ok $fil = gzopen($name, "wb"), " gzopen for writing" ;
457 is $fil->gzwrite($text), length $text, " gzwrite ok" ;
458 ok ! $fil->gzclose, " gzclose ok" ;
459
460 ok $fil = gzopen($name, "rb"), " gzopen for reading" ;
461 is $fil->gzwrite(), Z_STREAM_ERROR, " gzwrite returns Z_STREAM_ERROR" ;
462}
463
464{
465 title 'read/write a non-readable/writable file';
466
467 SKIP:
468 {
9f2e3514 469 my $lex = new LexFile my $name ;
642e522c 470 writeFile($name, "abc");
471 chmod 0444, $name ;
472
473 skip "Cannot create non-writable file", 3
474 if -w $name ;
475
476 ok ! -w $name, " input file not writable";
477
478 my $fil = gzopen($name, "wb") ;
479 ok !$fil, " gzopen returns undef" ;
480 ok $gzerrno, " gzerrno ok" or
481 diag " gzerrno $gzerrno\n";
482
483 chmod 0777, $name ;
484 }
485
486 SKIP:
487 {
9f2e3514 488 my $lex = new LexFile my $name ;
f6fd7794 489 skip "Cannot create non-readable file", 3
490 if $^O eq 'cygwin';
491
642e522c 492 writeFile($name, "abc");
493 chmod 0222, $name ;
494
495 skip "Cannot create non-readable file", 3
496 if -r $name ;
497
498 ok ! -r $name, " input file not readable";
499 $gzerrno = 0;
500 $fil = gzopen($name, "rb") ;
501 ok !$fil, " gzopen returns undef" ;
502 ok $gzerrno, " gzerrno ok";
503 chmod 0777, $name ;
504 }
505
506}
507
508{
509 title "gzseek" ;
510
511 my $buff ;
9f2e3514 512 my $lex = new LexFile my $name ;
642e522c 513
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;
524
525 $iow->gzwrite($last) ;
526 $iow->gzclose ;
527
528 ok GZreadFile($name) eq $first . "\x00" x 10 . $last ;
529
530 my $io = gzopen($name, "r");
531 ok $io->gzseek(length($first), SEEK_CUR) ;
532 ok ! $io->gzeof;
533 is $io->gztell(), length($first);
534
535 ok $io->gzread($buff, 5) ;
536 is $buff, "\x00" x 5 ;
537 is $io->gztell(), length($first) + 5;
538
539 is $io->gzread($buff, 0), 0 ;
540 #is $buff, "\x00" x 5 ;
541 is $io->gztell(), length($first) + 5;
542
543 ok $io->gzseek(0, SEEK_CUR) ;
544 my $here = $io->gztell() ;
545 is $here, length($first)+5;
546
547 ok $io->gzseek($here+5, SEEK_SET) ;
548 is $io->gztell(), $here+5 ;
549 ok $io->gzread($buff, 100) ;
550 ok $buff eq $last ;
551 ok $io->gzeof;
552}
553
554{
555 # seek error cases
59bd6a32 556 my $lex = new LexFile my $name ;
642e522c 557
558 my $a = gzopen($name, "w");
559
560 ok ! $a->gzerror()
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");
564
565 eval { $a->gzseek(-1, SEEK_END) ; };
566 like $@, mkErr("gzseek: cannot seek backwards");
567
568 $a->gzwrite("fred");
569 $a->gzclose ;
570
571
572 my $u = gzopen($name, "r");
573
574 eval { $u->gzseek(-1, 10) ; };
575 like $@, mkErr("gzseek: unknown value, 10, for whence parameter");
576
577 eval { $u->gzseek(-1, SEEK_END) ; };
578 like $@, mkErr("gzseek: SEEK_END not allowed");
579
580 eval { $u->gzseek(-1, SEEK_CUR) ; };
581 like $@, mkErr("gzseek: cannot seek backwards");
582}
98719077 583
584{
585 title "gzread ver 1.x compat -- the output buffer is always zapped.";
586 my $lex = new LexFile my $name ;
587
588 my $a = gzopen($name, "w");
589 $a->gzwrite("fred");
590 $a->gzclose ;
591
592 my $u = gzopen($name, "r");
593
594 my $buf1 ;
595 is $u->gzread($buf1, 0), 0, " gzread returns 0";
596 ok defined $buf1, " output buffer defined";
597 is $buf1, "", " output buffer empty string";
598
599 my $buf2 = "qwerty";
600 is $u->gzread($buf2, 0), 0, " gzread returns 0";
601 ok defined $buf2, " output buffer defined";
602 is $buf2, "", " output buffer empty string";
603}