Revert change 26749
[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';
0ecadccd 4 @INC = ("../lib", "lib");
16816334 5 }
6}
642e522c 7
8use lib 't';
9use strict;
10use warnings;
11use bytes;
12
13use Test::More ;
14use ZlibTestUtils;
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
23 plan tests => 208 + $extra ;
24
25 use_ok('Compress::Zlib', 2) ;
26 use_ok('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() ;
73ok ! $fil->gzclose ;
74ok $fil->gzeof() ;
75
76unlink $name ;
77
78ok $hello eq $uncomp ;
79
80# check that a number can be gzipped
81my $number = 7603 ;
82my $num_len = 4 ;
83
84ok $fil = gzopen($name, "wb") ;
85
86is $gzerrno, 0;
87
88is $fil->gzwrite($number), $num_len, "gzwrite returned $num_len" ;
89is $gzerrno, 0, 'gzerrno is 0';
90ok $fil->gzflush(Z_FINISH) ;
91
92is $gzerrno, 0, 'gzerrno is 0';
93
94ok ! $fil->gzclose ;
95
96cmp_ok $gzerrno, '==', 0;
97
98ok $fil = gzopen($name, "rb") ;
99
100ok (($x = $fil->gzread($uncomp)) == $num_len) ;
101
102ok $fil->gzerror() == 0 || $fil->gzerror() == Z_STREAM_END;
103ok $gzerrno == 0 || $gzerrno == Z_STREAM_END;
104ok $fil->gzeof() ;
105
106ok ! $fil->gzclose ;
107ok $fil->gzeof() ;
108
109ok $gzerrno == 0
110 or print "# gzerrno is $gzerrno\n" ;
111
112unlink $name ;
113
114ok $number == $uncomp ;
115ok $number eq $uncomp ;
116
117
118# now a bigger gzip test
119
120my $text = 'text' ;
121my $file = "$text.gz" ;
122
123ok my $f = gzopen($file, "wb") ;
124
125# generate a long random string
126my $contents = '' ;
127foreach (1 .. 5000)
128 { $contents .= chr int rand 256 }
129
130$len = length $contents ;
131
132ok $f->gzwrite($contents) == $len ;
133
134ok ! $f->gzclose ;
135
136ok $f = gzopen($file, "rb") ;
137
138ok ! $f->gzeof() ;
139
140my $uncompressed ;
141is $f->gzread($uncompressed, $len), $len ;
142
143ok $contents eq $uncompressed
144
145 or print "# Length orig $len" .
146 ", Length uncompressed " . length($uncompressed) . "\n" ;
147
148ok $f->gzeof() ;
149ok ! $f->gzclose ;
150
151unlink($file) ;
152
153# gzip - readline tests
154# ======================
155
156# first create a small gzipped text file
157$name = "test.gz" ;
158my @text = (<<EOM, <<EOM, <<EOM, <<EOM) ;
159this is line 1
160EOM
161the second line
162EOM
163the line after the previous line
164EOM
165the final line
166EOM
167
168$text = join("", @text) ;
169
170ok $fil = gzopen($name, "wb") ;
171ok $fil->gzwrite($text) == length $text ;
172ok ! $fil->gzclose ;
173
174# now try to read it back in
175ok $fil = gzopen($name, "rb") ;
176ok ! $fil->gzeof() ;
177my $line = '';
178for my $i (0 .. @text -2)
179{
180 ok $fil->gzreadline($line) > 0;
59bd6a32 181 is $line, $text[$i] ;
642e522c 182 ok ! $fil->gzeof() ;
183}
184
185# now read the last line
186ok $fil->gzreadline($line) > 0;
59bd6a32 187is $line, $text[-1] ;
642e522c 188ok $fil->gzeof() ;
189
190# read past the eof
191is $fil->gzreadline($line), 0;
192
193ok $fil->gzeof() ;
194ok ! $fil->gzclose ;
195ok $fil->gzeof() ;
196unlink($name) ;
197
198# a text file with a very long line (bigger than the internal buffer)
199my $line1 = ("abcdefghijklmnopq" x 2000) . "\n" ;
200my $line2 = "second line\n" ;
201$text = $line1 . $line2 ;
202ok $fil = gzopen($name, "wb") ;
203ok $fil->gzwrite($text) == length $text ;
204ok ! $fil->gzclose ;
205
206# now try to read it back in
207ok $fil = gzopen($name, "rb") ;
208ok ! $fil->gzeof() ;
209my $i = 0 ;
210my @got = ();
211while ($fil->gzreadline($line) > 0) {
212 $got[$i] = $line ;
213 ++ $i ;
214}
59bd6a32 215is $i, 2 ;
216is $got[0], $line1 ;
217is $got[1], $line2 ;
642e522c 218
219ok $fil->gzeof() ;
220ok ! $fil->gzclose ;
221ok $fil->gzeof() ;
222
223unlink $name ;
224
225# a text file which is not termined by an EOL
226
227$line1 = "hello hello, I'm back again\n" ;
228$line2 = "there is no end in sight" ;
229
230$text = $line1 . $line2 ;
231ok $fil = gzopen($name, "wb") ;
232ok $fil->gzwrite($text) == length $text ;
233ok ! $fil->gzclose ;
234
235# now try to read it back in
236ok $fil = gzopen($name, "rb") ;
237@got = () ; $i = 0 ;
238while ($fil->gzreadline($line) > 0) {
239 $got[$i] = $line ;
240 ++ $i ;
241}
59bd6a32 242is $i, 2 ;
243is $got[0], $line1 ;
244is $got[1], $line2 ;
642e522c 245
246ok $fil->gzeof() ;
247ok ! $fil->gzclose ;
248
249unlink $name ;
250
251{
252
253 title 'mix gzread and gzreadline';
254
255 # case 1: read a line, then a block. The block is
256 # smaller than the internal block used by
257 # gzreadline
59bd6a32 258 my $lex = new LexFile my $name ;
642e522c 259 $line1 = "hello hello, I'm back again\n" ;
260 $line2 = "abc" x 200 ;
261 my $line3 = "def" x 200 ;
262
263 $text = $line1 . $line2 . $line3 ;
59bd6a32 264 my $fil;
642e522c 265 ok $fil = gzopen($name, "wb"), ' gzopen for write ok' ;
266 is $fil->gzwrite($text), length $text, ' gzwrite ok' ;
267 is $fil->gztell(), length $text, ' gztell ok' ;
268 ok ! $fil->gzclose, ' gzclose ok' ;
269
270 # now try to read it back in
271 ok $fil = gzopen($name, "rb"), ' gzopen for read ok' ;
272 ok ! $fil->gzeof(), ' !gzeof' ;
273 cmp_ok $fil->gzreadline($line), '>', 0, ' gzreadline' ;
274 is $fil->gztell(), length $line1, ' gztell ok' ;
275 ok ! $fil->gzeof(), ' !gzeof' ;
276 is $line, $line1, ' got expected line' ;
277 cmp_ok $fil->gzread($line, length $line2), '>', 0, ' gzread ok' ;
278 is $fil->gztell(), length($line1)+length($line2), ' gztell ok' ;
279 ok ! $fil->gzeof(), ' !gzeof' ;
280 is $line, $line2, ' read expected block' ;
281 cmp_ok $fil->gzread($line, length $line3), '>', 0, ' gzread ok' ;
282 is $fil->gztell(), length($text), ' gztell ok' ;
283 ok $fil->gzeof(), ' !gzeof' ;
284 is $line, $line3, ' read expected block' ;
285 ok ! $fil->gzclose, ' gzclose' ;
286}
287
288{
289 title "Pass gzopen a filehandle - use IO::File" ;
290
59bd6a32 291 my $lex = new LexFile my $name ;
642e522c 292
293 my $hello = "hello" ;
294 my $len = length $hello ;
295
296 unlink $name ;
297
298 my $f = new IO::File ">$name" ;
299 ok $f;
300
59bd6a32 301 my $fil;
302 ok $fil = gzopen($f, "wb") ;
642e522c 303
304 ok $fil->gzwrite($hello) == $len ;
305
306 ok ! $fil->gzclose ;
307
308 $f = new IO::File "<$name" ;
309 ok $fil = gzopen($name, "rb") ;
310
311 my $uncmomp;
312 ok (($x = $fil->gzread($uncomp)) == $len)
313 or print "# length $x, expected $len\n" ;
314
315 ok $fil->gzeof() ;
316 ok ! $fil->gzclose ;
317 ok $fil->gzeof() ;
318
319 unlink $name ;
320
59bd6a32 321 is $uncomp, $hello, "got expected output" ;
642e522c 322
323
324}
325
326
327{
328 title "Pass gzopen a filehandle - use open" ;
329
59bd6a32 330 my $lex = new LexFile my $name ;
642e522c 331
332 my $hello = "hello" ;
333 my $len = length $hello ;
334
335 unlink $name ;
336
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
357 unlink $name ;
358
59bd6a32 359 is $uncomp, $hello ;
642e522c 360
361
362}
363
364foreach my $stdio ( ['-', '-'], [*STDIN, *STDOUT])
365{
366 my $stdin = $stdio->[0];
367 my $stdout = $stdio->[1];
368
369 title "Pass gzopen a filehandle - use $stdin" ;
370
59bd6a32 371 my $lex = new LexFile my $name ;
642e522c 372
373 my $hello = "hello" ;
374 my $len = length $hello ;
375
376 unlink $name ;
377
378 ok open(SAVEOUT, ">&STDOUT"), " save STDOUT";
379 my $dummy = fileno SAVEOUT;
380 ok open(STDOUT, ">$name"), " redirect STDOUT" ;
381
382 my $status = 0 ;
383
384 my $fil = gzopen($stdout, "wb") ;
385
386 $status = $fil &&
387 ($fil->gzwrite($hello) == $len) &&
388 ($fil->gzclose == 0) ;
389
390 open(STDOUT, ">&SAVEOUT");
391
392 ok $status, " wrote to stdout";
393
394 open(SAVEIN, "<&STDIN");
395 ok open(STDIN, "<$name"), " redirect STDIN";
396 $dummy = fileno SAVEIN;
397
398 ok $fil = gzopen($stdin, "rb") ;
399
400 my $uncmomp;
401 ok (($x = $fil->gzread($uncomp)) == $len)
402 or print "# length $x, expected $len\n" ;
403
404 ok $fil->gzeof() ;
405 ok ! $fil->gzclose ;
406 ok $fil->gzeof() ;
407
408 open(STDIN, "<&SAVEIN");
409
410 unlink $name ;
411
59bd6a32 412 is $uncomp, $hello ;
642e522c 413
414
415}
416
417{
418 title 'test parameters for gzopen';
59bd6a32 419 my $lex = new LexFile my $name ;
642e522c 420
421 my $fil;
422
423 unlink $name ;
424
425 # missing parameters
426 eval ' $fil = gzopen() ' ;
427 like $@, mkEvalErr('Not enough arguments for Compress::Zlib::gzopen'),
428 ' gzopen with missing mode fails' ;
429
430 # unknown parameters
431 $fil = gzopen($name, "xy") ;
432 ok ! defined $fil, ' gzopen with unknown mode fails' ;
433
434 $fil = gzopen($name, "ab") ;
435 ok $fil, ' gzopen with mode "ab" is ok' ;
436
437 $fil = gzopen($name, "wb6") ;
438 ok $fil, ' gzopen with mode "wb6" is ok' ;
439
440 $fil = gzopen($name, "wbf") ;
441 ok $fil, ' gzopen with mode "wbf" is ok' ;
442
443 $fil = gzopen($name, "wbh") ;
444 ok $fil, ' gzopen with mode "wbh" is ok' ;
445}
446
447{
448 title 'Read operations when opened for writing';
449
59bd6a32 450 my $lex = new LexFile my $name ;
451 my $fil;
642e522c 452 ok $fil = gzopen($name, "wb"), ' gzopen for writing' ;
453 ok !$fil->gzeof(), ' !eof'; ;
454 is $fil->gzread(), Z_STREAM_ERROR, " gzread returns Z_STREAM_ERROR" ;
59bd6a32 455 ok ! $fil->gzclose, " gzclose ok" ;
642e522c 456}
457
458{
459 title 'write operations when opened for reading';
460
59bd6a32 461 my $lex = new LexFile my $name ;
642e522c 462 my $test = "hello" ;
59bd6a32 463 my $fil;
642e522c 464 ok $fil = gzopen($name, "wb"), " gzopen for writing" ;
465 is $fil->gzwrite($text), length $text, " gzwrite ok" ;
466 ok ! $fil->gzclose, " gzclose ok" ;
467
468 ok $fil = gzopen($name, "rb"), " gzopen for reading" ;
469 is $fil->gzwrite(), Z_STREAM_ERROR, " gzwrite returns Z_STREAM_ERROR" ;
470}
471
472{
473 title 'read/write a non-readable/writable file';
474
475 SKIP:
476 {
477 my $name ;
478 my $lex = new LexFile $name ;
479 writeFile($name, "abc");
480 chmod 0444, $name ;
481
482 skip "Cannot create non-writable file", 3
483 if -w $name ;
484
485 ok ! -w $name, " input file not writable";
486
487 my $fil = gzopen($name, "wb") ;
488 ok !$fil, " gzopen returns undef" ;
489 ok $gzerrno, " gzerrno ok" or
490 diag " gzerrno $gzerrno\n";
491
492 chmod 0777, $name ;
493 }
494
495 SKIP:
496 {
497 my $name ;
498 my $lex = new LexFile $name ;
499 writeFile($name, "abc");
500 chmod 0222, $name ;
501
502 skip "Cannot create non-readable file", 3
503 if -r $name ;
504
505 ok ! -r $name, " input file not readable";
506 $gzerrno = 0;
507 $fil = gzopen($name, "rb") ;
508 ok !$fil, " gzopen returns undef" ;
509 ok $gzerrno, " gzerrno ok";
510 chmod 0777, $name ;
511 }
512
513}
514
515{
516 title "gzseek" ;
517
518 my $buff ;
59bd6a32 519 my $name ;
642e522c 520 my $lex = new LexFile $name ;
521
522 my $first = "beginning" ;
523 my $last = "the end" ;
524 my $iow = gzopen($name, "w");
525 $iow->gzwrite($first) ;
526 ok $iow->gzseek(5, SEEK_CUR) ;
527 is $iow->gztell(), length($first)+5;
528 ok $iow->gzseek(0, SEEK_CUR) ;
529 is $iow->gztell(), length($first)+5;
530 ok $iow->gzseek(length($first)+10, SEEK_SET) ;
531 is $iow->gztell(), length($first)+10;
532
533 $iow->gzwrite($last) ;
534 $iow->gzclose ;
535
536 ok GZreadFile($name) eq $first . "\x00" x 10 . $last ;
537
538 my $io = gzopen($name, "r");
539 ok $io->gzseek(length($first), SEEK_CUR) ;
540 ok ! $io->gzeof;
541 is $io->gztell(), length($first);
542
543 ok $io->gzread($buff, 5) ;
544 is $buff, "\x00" x 5 ;
545 is $io->gztell(), length($first) + 5;
546
547 is $io->gzread($buff, 0), 0 ;
548 #is $buff, "\x00" x 5 ;
549 is $io->gztell(), length($first) + 5;
550
551 ok $io->gzseek(0, SEEK_CUR) ;
552 my $here = $io->gztell() ;
553 is $here, length($first)+5;
554
555 ok $io->gzseek($here+5, SEEK_SET) ;
556 is $io->gztell(), $here+5 ;
557 ok $io->gzread($buff, 100) ;
558 ok $buff eq $last ;
559 ok $io->gzeof;
560}
561
562{
563 # seek error cases
59bd6a32 564 my $lex = new LexFile my $name ;
642e522c 565
566 my $a = gzopen($name, "w");
567
568 ok ! $a->gzerror()
569 or print "# gzerrno is $Compress::Zlib::gzerrno \n" ;
570 eval { $a->gzseek(-1, 10) ; };
571 like $@, mkErr("gzseek: unknown value, 10, for whence parameter");
572
573 eval { $a->gzseek(-1, SEEK_END) ; };
574 like $@, mkErr("gzseek: cannot seek backwards");
575
576 $a->gzwrite("fred");
577 $a->gzclose ;
578
579
580 my $u = gzopen($name, "r");
581
582 eval { $u->gzseek(-1, 10) ; };
583 like $@, mkErr("gzseek: unknown value, 10, for whence parameter");
584
585 eval { $u->gzseek(-1, SEEK_END) ; };
586 like $@, mkErr("gzseek: SEEK_END not allowed");
587
588 eval { $u->gzseek(-1, SEEK_CUR) ; };
589 like $@, mkErr("gzseek: cannot seek backwards");
590}