19 # use Test::NoWarnings, if available
22 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
36 plan tests => $count + $extra;
38 use_ok('Compress::Zlib', 2) ;
48 my $len = length $hello ;
50 # Check zlib_version and ZLIB_VERSION are the same.
51 is Compress::Zlib::zlib_version, ZLIB_VERSION,
52 "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
57 eval { new Compress::Zlib::Deflate(-Level) };
58 like $@, mkErr("^Compress::Zlib::Deflate::new: Expected even number of parameters, got 1") ;
60 eval { new Compress::Zlib::Inflate(-Level) };
61 like $@, mkErr("^Compress::Zlib::Inflate::new: Expected even number of parameters, got 1");
63 eval { new Compress::Zlib::Deflate(-Joe => 1) };
64 like $@, mkErr('^Compress::Zlib::Deflate::new: unknown key value\(s\) Joe');
66 eval { new Compress::Zlib::Inflate(-Joe => 1) };
67 like $@, mkErr('^Compress::Zlib::Inflate::new: unknown key value\(s\) Joe');
69 eval { new Compress::Zlib::Deflate(-Bufsize => 0) };
70 like $@, mkErr("^Compress::Zlib::Deflate::new: Bufsize must be >= 1, you specified 0");
72 eval { new Compress::Zlib::Inflate(-Bufsize => 0) };
73 like $@, mkErr("^Compress::Zlib::Inflate::new: Bufsize must be >= 1, you specified 0");
75 eval { new Compress::Zlib::Deflate(-Bufsize => -1) };
76 like $@, mkErr("^Compress::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
78 eval { new Compress::Zlib::Inflate(-Bufsize => -1) };
79 like $@, mkErr("^Compress::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
81 eval { new Compress::Zlib::Deflate(-Bufsize => "xxx") };
82 like $@, mkErr("^Compress::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
84 eval { new Compress::Zlib::Inflate(-Bufsize => "xxx") };
85 like $@, mkErr("^Compress::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
87 eval { new Compress::Zlib::Inflate(-Bufsize => 1, 2) };
88 like $@, mkErr("^Compress::Zlib::Inflate::new: Expected even number of parameters, got 3");
90 eval { new Compress::Zlib::Deflate(-Bufsize => 1, 2) };
91 like $@, mkErr("^Compress::Zlib::Deflate::new: Expected even number of parameters, got 3");
97 title "deflate/inflate - small buffer";
98 # ==============================
100 my $hello = "I am a HAL 9000 computer" ;
101 my @hello = split('', $hello) ;
102 my ($err, $x, $X, $status);
104 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1 ), "Create deflate object" );
105 ok $x, "Compress::Zlib::Deflate ok" ;
106 cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
108 ok ! defined $x->msg() ;
109 is $x->total_in(), 0, "total_in() == 0" ;
110 is $x->total_out(), 0, "total_out() == 0" ;
116 $status = $x->deflate($_, $X) ;
117 last unless $status == Z_OK ;
122 cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
124 cmp_ok $x->flush($X), '==', Z_OK, "flush returned Z_OK" ;
127 ok ! defined $x->msg() ;
128 is $x->total_in(), length $hello, "total_in ok" ;
129 is $x->total_out(), length $Answer, "total_out ok" ;
131 my @Answer = split('', $Answer) ;
134 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1}) );
135 ok $k, "Compress::Zlib::Inflate ok" ;
136 cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
138 ok ! defined $k->msg(), "No error messages" ;
139 is $k->total_in(), 0, "total_in() == 0" ;
140 is $k->total_out(), 0, "total_out() == 0" ;
146 $status = $k->inflate($_, $Z) ;
148 last if $status == Z_STREAM_END or $status != Z_OK ;
152 cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
153 is $GOT, $hello, "uncompressed data matches ok" ;
154 ok ! defined $k->msg(), "No error messages" ;
155 is $k->total_in(), length $Answer, "total_in ok" ;
156 is $k->total_out(), length $hello , "total_out ok";
162 # deflate/inflate - small buffer with a number
163 # ==============================
167 ok my ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1, -AppendOutput => 1 ) ;
169 cmp_ok $err, '==', Z_OK ;
174 cmp_ok $x->deflate($hello, $Answer), '==', Z_OK ;
176 cmp_ok $x->flush($Answer), '==', Z_OK ;
178 my @Answer = split('', $Answer) ;
181 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}) );
183 cmp_ok $err, '==', Z_OK ;
189 $status = $k->inflate($_, $GOT) ;
190 last if $status == Z_STREAM_END or $status != Z_OK ;
194 cmp_ok $status, '==', Z_STREAM_END ;
201 # deflate/inflate options - AppendOutput
202 # ================================
207 my $hello = "I am a HAL 9000 computer" ;
208 my @hello = split('', $hello) ;
210 ok my ($x, $err) = new Compress::Zlib::Deflate ( {-Bufsize => 1, -AppendOutput =>1} ) ;
212 cmp_ok $err, '==', Z_OK ;
218 $status = $x->deflate($_, $X) ;
219 last unless $status == Z_OK ;
222 cmp_ok $status, '==', Z_OK ;
224 cmp_ok $x->flush($X), '==', Z_OK ;
227 my @Answer = split('', $X) ;
230 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}));
232 cmp_ok $err, '==', Z_OK ;
237 $status = $k->inflate($_, $Z) ;
238 last if $status == Z_STREAM_END or $status != Z_OK ;
242 cmp_ok $status, '==', Z_STREAM_END ;
249 title "deflate/inflate - larger buffer";
250 # ==============================
252 # generate a long random string
255 { $contents .= chr int rand 255 }
258 ok my ($x, $err) = new Compress::Zlib::Deflate() ;
260 cmp_ok $err, '==', Z_OK ;
262 my (%X, $Y, %Z, $X, $Z);
263 #cmp_ok $x->deflate($contents, $X{key}), '==', Z_OK ;
264 cmp_ok $x->deflate($contents, $X), '==', Z_OK ;
270 #cmp_ok $x->flush($X{key}), '==', Z_OK ;
272 cmp_ok $x->flush($X), '==', Z_OK ;
280 ok(($k, $err) = new Compress::Zlib::Inflate() );
282 cmp_ok $err, '==', Z_OK ;
284 #cmp_ok $k->inflate($Y, $Z{key}), '==', Z_STREAM_END ;
285 #ok $contents eq $Z{key} ;
286 cmp_ok $k->inflate($Y, $Z), '==', Z_STREAM_END ;
289 # redo deflate with AppendOutput
291 ok (($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1)) ;
293 cmp_ok $err, '==', Z_OK ;
297 my @bits = split('', $keep) ;
298 foreach my $bit (@bits) {
299 $s = $k->inflate($bit, $out) ;
302 cmp_ok $s, '==', Z_STREAM_END ;
304 ok $contents eq $out ;
311 title "deflate/inflate - preset dictionary";
312 # ===================================
314 my $dictionary = "hello" ;
315 ok my $x = new Compress::Zlib::Deflate({-Level => Z_BEST_COMPRESSION,
316 -Dictionary => $dictionary}) ;
318 my $dictID = $x->dict_adler() ;
321 cmp_ok $x->deflate($hello, $X), '==', Z_OK;
322 cmp_ok $x->flush($Y), '==', Z_OK;
325 ok my $k = new Compress::Zlib::Inflate(-Dictionary => $dictionary) ;
327 cmp_ok $k->inflate($X, $Z), '==', Z_STREAM_END;
328 is $k->dict_adler(), $dictID;
333 title 'inflate - check remaining buffer after Z_STREAM_END';
334 # and that ConsumeInput works.
335 # ===================================================
337 for my $consume ( 0 .. 1)
339 ok my $x = new Compress::Zlib::Deflate(-Level => Z_BEST_COMPRESSION ) ;
342 cmp_ok $x->deflate($hello, $X), '==', Z_OK;
343 cmp_ok $x->flush($Y), '==', Z_OK;
346 ok my $k = new Compress::Zlib::Inflate( -ConsumeInput => $consume) ;
348 my $first = substr($X, 0, 2) ;
349 my $remember_first = $first ;
350 my $last = substr($X, 2) ;
351 cmp_ok $k->inflate($first, $Z), '==', Z_OK;
356 ok $first eq $remember_first ;
360 $last .= "appendage" ;
361 my $remember_last = $last ;
362 cmp_ok $k->inflate($last, $T), '==', Z_STREAM_END;
365 is $last, "appendage" ;
368 is $last, $remember_last ;
377 title 'Check - MAX_WBITS';
380 my $hello = "Test test test test test";
381 my @hello = split('', $hello) ;
384 new Compress::Zlib::Deflate ( -Bufsize => 1,
385 -WindowBits => -MAX_WBITS(),
386 -AppendOutput => 1 ) ;
388 cmp_ok $err, '==', Z_OK ;
394 $status = $x->deflate($_, $Answer) ;
395 last unless $status == Z_OK ;
398 cmp_ok $status, '==', Z_OK ;
400 cmp_ok $x->flush($Answer), '==', Z_OK ;
402 my @Answer = split('', $Answer) ;
403 # Undocumented corner -- extra byte needed to get inflate to return
404 # Z_STREAM_END when done.
408 ok(($k, $err) = new Compress::Zlib::Inflate(
411 -WindowBits => -MAX_WBITS()})) ;
413 cmp_ok $err, '==', Z_OK ;
418 $status = $k->inflate($_, $GOT) ;
419 last if $status == Z_STREAM_END or $status != Z_OK ;
423 cmp_ok $status, '==', Z_STREAM_END ;
431 # create a deflate stream with flush points
433 my $hello = "I am a HAL 9000 computer" x 2001 ;
434 my $goodbye = "Will I dream?" x 2010;
435 my ($x, $err, $answer, $X, $Z, $status);
439 ok(($x, $err) = new Compress::Zlib::Deflate(AppendOutput => 1)) ;
441 cmp_ok $err, '==', Z_OK ;
443 cmp_ok $x->deflate($hello, $Answer), '==', Z_OK;
445 # create a flush point
446 cmp_ok $x->flush($Answer, Z_FULL_FLUSH), '==', Z_OK ;
448 cmp_ok $x->deflate($goodbye, $Answer), '==', Z_OK;
450 cmp_ok $x->flush($Answer), '==', Z_OK ;
452 my ($first, @Answer) = split('', $Answer) ;
455 ok(($k, $err) = new Compress::Zlib::Inflate()) ;
457 cmp_ok $err, '==', Z_OK ;
459 cmp_ok $k->inflate($first, $Z), '==', Z_OK;
461 # skip to the first flush point.
464 my $byte = shift @Answer;
465 $status = $k->inflateSync($byte) ;
466 last unless $status == Z_DATA_ERROR;
469 cmp_ok $status, '==', Z_OK;
475 $status = $k->inflate($_, $Z) ;
476 $GOT .= $Z if defined $Z ;
477 # print "x $status\n";
478 last if $status == Z_STREAM_END or $status != Z_OK ;
482 cmp_ok $status, '==', Z_DATA_ERROR ;
486 # Check inflateSync leaves good data in buffer
492 ok(($k, $err) = new Compress::Zlib::Inflate(-ConsumeInput => 0)) ;
494 cmp_ok $err, '==', Z_OK ;
496 cmp_ok $k->inflate($initial, $Z), '==', Z_OK;
498 # Skip to the flush point
499 $status = $k->inflateSync($rest);
500 cmp_ok $status, '==', Z_OK
501 or diag "status '$status'\nlength rest is " . length($rest) . "\n" ;
503 cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR;
504 is $Z . $GOT, $goodbye ;
508 title 'deflateParams';
510 my $hello = "I am a HAL 9000 computer" x 2001 ;
511 my $goodbye = "Will I dream?" x 2010;
512 my ($x, $input, $err, $answer, $X, $status, $Answer);
514 ok(($x, $err) = new Compress::Zlib::Deflate(
516 -Level => Z_DEFAULT_COMPRESSION,
517 -Strategy => Z_DEFAULT_STRATEGY)) ;
519 cmp_ok $err, '==', Z_OK ;
521 ok $x->get_Level() == Z_DEFAULT_COMPRESSION;
522 ok $x->get_Strategy() == Z_DEFAULT_STRATEGY;
524 $status = $x->deflate($hello, $Answer) ;
525 cmp_ok $status, '==', Z_OK ;
529 eval { $x->deflateParams() };
530 like $@, mkErr('^Compress::Zlib::deflateParams needs Level and\/or Strategy');
532 eval { $x->deflateParams(-Bufsize => 0) };
533 like $@, mkErr('^Compress::Zlib::Inflate::deflateParams: Bufsize must be >= 1, you specified 0');
535 eval { $x->deflateParams(-Joe => 3) };
536 like $@, mkErr('^Compress::Zlib::deflateStream::deflateParams: unknown key value\(s\) Joe');
538 is $x->get_Level(), Z_DEFAULT_COMPRESSION;
539 is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
541 # change both Level & Strategy
542 $status = $x->deflateParams(-Level => Z_BEST_SPEED, -Strategy => Z_HUFFMAN_ONLY, -Bufsize => 1234) ;
543 cmp_ok $status, '==', Z_OK ;
545 is $x->get_Level(), Z_BEST_SPEED;
546 is $x->get_Strategy(), Z_HUFFMAN_ONLY;
548 $status = $x->deflate($goodbye, $Answer) ;
549 cmp_ok $status, '==', Z_OK ;
553 $status = $x->deflateParams(-Level => Z_NO_COMPRESSION) ;
554 cmp_ok $status, '==', Z_OK ;
556 is $x->get_Level(), Z_NO_COMPRESSION;
557 is $x->get_Strategy(), Z_HUFFMAN_ONLY;
559 $status = $x->deflate($goodbye, $Answer) ;
560 cmp_ok $status, '==', Z_OK ;
563 # change only Strategy
564 $status = $x->deflateParams(-Strategy => Z_FILTERED) ;
565 cmp_ok $status, '==', Z_OK ;
567 is $x->get_Level(), Z_NO_COMPRESSION;
568 is $x->get_Strategy(), Z_FILTERED;
570 $status = $x->deflate($goodbye, $Answer) ;
571 cmp_ok $status, '==', Z_OK ;
574 cmp_ok $x->flush($Answer), '==', Z_OK ;
577 ok(($k, $err) = new Compress::Zlib::Inflate()) ;
579 cmp_ok $err, '==', Z_OK ;
582 $status = $k->inflate($Answer, $Z) ;
584 cmp_ok $status, '==', Z_STREAM_END ;
590 title "ConsumeInput and a read-only buffer trapped" ;
592 ok my $k = new Compress::Zlib::Inflate(-ConsumeInput => 1) ;
595 eval { $k->inflate("abc", $Z) ; };
596 like $@, mkErr("Compress::Zlib::Inflate::inflate input parameter cannot be read-only when ConsumeInput is specified");
604 title 'test inflate/deflate with a substr';
608 { $contents .= chr int rand 255 }
609 ok my $x = new Compress::Zlib::Deflate(-AppendOutput => 1) ;
612 my $status = $x->deflate(substr($contents,0), $X);
613 cmp_ok $status, '==', Z_OK ;
615 cmp_ok $x->flush($X), '==', Z_OK ;
617 my $append = "Appended" ;
620 ok my $k = new Compress::Zlib::Inflate(-AppendOutput => 1) ;
624 $status = $k->inflate(substr($X, 0), $Z) ;
626 cmp_ok $status, '==', Z_STREAM_END ;
627 #print "status $status X [$X]\n" ;
630 #is length($X), length($append);
632 #is length($X), length($keep);
635 title 'Looping Append test - checks that deRef_l resets the output buffer';
639 my $hello = "I am a HAL 9000 computer" ;
640 my @hello = split('', $hello) ;
641 my ($err, $x, $X, $status);
643 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1 ) );
645 cmp_ok $err, '==', Z_OK ;
651 $status = $x->deflate($_, $X) ;
652 last unless $status == Z_OK ;
657 cmp_ok $status, '==', Z_OK ;
659 cmp_ok $x->flush($X), '==', Z_OK ;
662 my @Answer = split('', $Answer) ;
665 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
667 cmp_ok $err, '==', Z_OK ;
674 $status = $k->inflate($_, $GOT) ;
675 last if $status == Z_STREAM_END or $status != Z_OK ;
678 cmp_ok $status, '==', Z_STREAM_END ;
685 title 'test inflate input parameter via substr';
687 my $hello = "I am a HAL 9000 computer" ;
692 ok my $x = new Compress::Zlib::Deflate ( -AppendOutput => 1 );
694 cmp_ok $x->deflate($data, $X), '==', Z_OK ;
696 cmp_ok $x->flush($X), '==', Z_OK ;
698 my $append = "Appended" ;
702 ok my $k = new Compress::Zlib::Inflate ( -AppendOutput => 1,
703 -ConsumeInput => 1 ) ;
705 # cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
706 cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
713 ok $k = new Compress::Zlib::Inflate ( -AppendOutput => 1,
714 -ConsumeInput => 0 ) ;
716 cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
717 #cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
726 title 'Looping Append test with substr output - substr the end of the string';
730 my $hello = "I am a HAL 9000 computer" ;
731 my @hello = split('', $hello) ;
732 my ($err, $x, $X, $status);
734 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1,
735 -AppendOutput => 1 ) );
737 cmp_ok $err, '==', Z_OK ;
743 $status = $x->deflate($_, substr($Answer, length($Answer))) ;
744 last unless $status == Z_OK ;
748 cmp_ok $status, '==', Z_OK ;
750 cmp_ok $x->flush(substr($Answer, length($Answer))), '==', Z_OK ;
752 my @Answer = split('', $Answer) ;
755 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
757 cmp_ok $err, '==', Z_OK ;
764 $status = $k->inflate($_, substr($GOT, length($GOT))) ;
765 last if $status == Z_STREAM_END or $status != Z_OK ;
768 cmp_ok $status, '==', Z_STREAM_END ;
773 title 'Looping Append test with substr output - substr the complete string';
777 my $hello = "I am a HAL 9000 computer" ;
778 my @hello = split('', $hello) ;
779 my ($err, $x, $X, $status);
781 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1,
782 -AppendOutput => 1 ) );
784 cmp_ok $err, '==', Z_OK ;
790 $status = $x->deflate($_, substr($Answer, 0)) ;
791 last unless $status == Z_OK ;
795 cmp_ok $status, '==', Z_OK ;
797 cmp_ok $x->flush(substr($Answer, 0)), '==', Z_OK ;
799 my @Answer = split('', $Answer) ;
802 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
804 cmp_ok $err, '==', Z_OK ;
811 $status = $k->inflate($_, substr($GOT, 0)) ;
812 last if $status == Z_STREAM_END or $status != Z_OK ;
815 cmp_ok $status, '==', Z_STREAM_END ;