13 # use Test::NoWarnings, if available
16 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
30 plan tests => $count + $extra;
32 use_ok('Compress::Zlib', 2) ;
42 my $len = length $hello ;
44 # Check zlib_version and ZLIB_VERSION are the same.
45 is Compress::Zlib::zlib_version, ZLIB_VERSION,
46 "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
51 eval { new Compress::Zlib::Deflate(-Level) };
52 like $@, mkErr("^Compress::Zlib::Deflate::new: Expected even number of parameters, got 1") ;
54 eval { new Compress::Zlib::Inflate(-Level) };
55 like $@, mkErr("^Compress::Zlib::Inflate::new: Expected even number of parameters, got 1");
57 eval { new Compress::Zlib::Deflate(-Joe => 1) };
58 like $@, mkErr('^Compress::Zlib::Deflate::new: unknown key value\(s\) Joe');
60 eval { new Compress::Zlib::Inflate(-Joe => 1) };
61 like $@, mkErr('^Compress::Zlib::Inflate::new: unknown key value\(s\) Joe');
63 eval { new Compress::Zlib::Deflate(-Bufsize => 0) };
64 like $@, mkErr("^Compress::Zlib::Deflate::new: Bufsize must be >= 1, you specified 0");
66 eval { new Compress::Zlib::Inflate(-Bufsize => 0) };
67 like $@, mkErr("^Compress::Zlib::Inflate::new: Bufsize must be >= 1, you specified 0");
69 eval { new Compress::Zlib::Deflate(-Bufsize => -1) };
70 like $@, mkErr("^Compress::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
72 eval { new Compress::Zlib::Inflate(-Bufsize => -1) };
73 like $@, mkErr("^Compress::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
75 eval { new Compress::Zlib::Deflate(-Bufsize => "xxx") };
76 like $@, mkErr("^Compress::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
78 eval { new Compress::Zlib::Inflate(-Bufsize => "xxx") };
79 like $@, mkErr("^Compress::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
81 eval { new Compress::Zlib::Inflate(-Bufsize => 1, 2) };
82 like $@, mkErr("^Compress::Zlib::Inflate::new: Expected even number of parameters, got 3");
84 eval { new Compress::Zlib::Deflate(-Bufsize => 1, 2) };
85 like $@, mkErr("^Compress::Zlib::Deflate::new: Expected even number of parameters, got 3");
91 title "deflate/inflate - small buffer";
92 # ==============================
94 my $hello = "I am a HAL 9000 computer" ;
95 my @hello = split('', $hello) ;
96 my ($err, $x, $X, $status);
98 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1 ), "Create deflate object" );
99 ok $x, "Compress::Zlib::Deflate ok" ;
100 cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
102 ok ! defined $x->msg() ;
103 is $x->total_in(), 0, "total_in() == 0" ;
104 is $x->total_out(), 0, "total_out() == 0" ;
110 $status = $x->deflate($_, $X) ;
111 last unless $status == Z_OK ;
116 cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
118 cmp_ok $x->flush($X), '==', Z_OK, "flush returned Z_OK" ;
121 ok ! defined $x->msg() ;
122 is $x->total_in(), length $hello, "total_in ok" ;
123 is $x->total_out(), length $Answer, "total_out ok" ;
125 my @Answer = split('', $Answer) ;
128 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1}) );
129 ok $k, "Compress::Zlib::Inflate ok" ;
130 cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
132 ok ! defined $k->msg(), "No error messages" ;
133 is $k->total_in(), 0, "total_in() == 0" ;
134 is $k->total_out(), 0, "total_out() == 0" ;
140 $status = $k->inflate($_, $Z) ;
142 last if $status == Z_STREAM_END or $status != Z_OK ;
146 cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
147 is $GOT, $hello, "uncompressed data matches ok" ;
148 ok ! defined $k->msg(), "No error messages" ;
149 is $k->total_in(), length $Answer, "total_in ok" ;
150 is $k->total_out(), length $hello , "total_out ok";
156 # deflate/inflate - small buffer with a number
157 # ==============================
161 ok my ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1, -AppendOutput => 1 ) ;
163 cmp_ok $err, '==', Z_OK ;
168 cmp_ok $x->deflate($hello, $Answer), '==', Z_OK ;
170 cmp_ok $x->flush($Answer), '==', Z_OK ;
172 my @Answer = split('', $Answer) ;
175 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}) );
177 cmp_ok $err, '==', Z_OK ;
183 $status = $k->inflate($_, $GOT) ;
184 last if $status == Z_STREAM_END or $status != Z_OK ;
188 cmp_ok $status, '==', Z_STREAM_END ;
195 # deflate/inflate options - AppendOutput
196 # ================================
201 my $hello = "I am a HAL 9000 computer" ;
202 my @hello = split('', $hello) ;
204 ok my ($x, $err) = new Compress::Zlib::Deflate ( {-Bufsize => 1, -AppendOutput =>1} ) ;
206 cmp_ok $err, '==', Z_OK ;
212 $status = $x->deflate($_, $X) ;
213 last unless $status == Z_OK ;
216 cmp_ok $status, '==', Z_OK ;
218 cmp_ok $x->flush($X), '==', Z_OK ;
221 my @Answer = split('', $X) ;
224 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}));
226 cmp_ok $err, '==', Z_OK ;
231 $status = $k->inflate($_, $Z) ;
232 last if $status == Z_STREAM_END or $status != Z_OK ;
236 cmp_ok $status, '==', Z_STREAM_END ;
243 title "deflate/inflate - larger buffer";
244 # ==============================
246 # generate a long random string
249 { $contents .= chr int rand 255 }
252 ok my ($x, $err) = new Compress::Zlib::Deflate() ;
254 cmp_ok $err, '==', Z_OK ;
256 my (%X, $Y, %Z, $X, $Z);
257 #cmp_ok $x->deflate($contents, $X{key}), '==', Z_OK ;
258 cmp_ok $x->deflate($contents, $X), '==', Z_OK ;
264 #cmp_ok $x->flush($X{key}), '==', Z_OK ;
266 cmp_ok $x->flush($X), '==', Z_OK ;
274 ok(($k, $err) = new Compress::Zlib::Inflate() );
276 cmp_ok $err, '==', Z_OK ;
278 #cmp_ok $k->inflate($Y, $Z{key}), '==', Z_STREAM_END ;
279 #ok $contents eq $Z{key} ;
280 cmp_ok $k->inflate($Y, $Z), '==', Z_STREAM_END ;
283 # redo deflate with AppendOutput
285 ok (($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1)) ;
287 cmp_ok $err, '==', Z_OK ;
291 my @bits = split('', $keep) ;
292 foreach my $bit (@bits) {
293 $s = $k->inflate($bit, $out) ;
296 cmp_ok $s, '==', Z_STREAM_END ;
298 ok $contents eq $out ;
305 title "deflate/inflate - preset dictionary";
306 # ===================================
308 my $dictionary = "hello" ;
309 ok my $x = new Compress::Zlib::Deflate({-Level => Z_BEST_COMPRESSION,
310 -Dictionary => $dictionary}) ;
312 my $dictID = $x->dict_adler() ;
315 cmp_ok $x->deflate($hello, $X), '==', Z_OK;
316 cmp_ok $x->flush($Y), '==', Z_OK;
319 ok my $k = new Compress::Zlib::Inflate(-Dictionary => $dictionary) ;
321 cmp_ok $k->inflate($X, $Z), '==', Z_STREAM_END;
322 is $k->dict_adler(), $dictID;
327 title 'inflate - check remaining buffer after Z_STREAM_END';
328 # and that ConsumeInput works.
329 # ===================================================
331 for my $consume ( 0 .. 1)
333 ok my $x = new Compress::Zlib::Deflate(-Level => Z_BEST_COMPRESSION ) ;
336 cmp_ok $x->deflate($hello, $X), '==', Z_OK;
337 cmp_ok $x->flush($Y), '==', Z_OK;
340 ok my $k = new Compress::Zlib::Inflate( -ConsumeInput => $consume) ;
342 my $first = substr($X, 0, 2) ;
343 my $remember_first = $first ;
344 my $last = substr($X, 2) ;
345 cmp_ok $k->inflate($first, $Z), '==', Z_OK;
350 ok $first eq $remember_first ;
354 $last .= "appendage" ;
355 my $remember_last = $last ;
356 cmp_ok $k->inflate($last, $T), '==', Z_STREAM_END;
359 is $last, "appendage" ;
362 is $last, $remember_last ;
371 title 'Check - MAX_WBITS';
374 my $hello = "Test test test test test";
375 my @hello = split('', $hello) ;
378 new Compress::Zlib::Deflate ( -Bufsize => 1,
379 -WindowBits => -MAX_WBITS(),
380 -AppendOutput => 1 ) ;
382 cmp_ok $err, '==', Z_OK ;
388 $status = $x->deflate($_, $Answer) ;
389 last unless $status == Z_OK ;
392 cmp_ok $status, '==', Z_OK ;
394 cmp_ok $x->flush($Answer), '==', Z_OK ;
396 my @Answer = split('', $Answer) ;
397 # Undocumented corner -- extra byte needed to get inflate to return
398 # Z_STREAM_END when done.
402 ok(($k, $err) = new Compress::Zlib::Inflate(
405 -WindowBits => -MAX_WBITS()})) ;
407 cmp_ok $err, '==', Z_OK ;
412 $status = $k->inflate($_, $GOT) ;
413 last if $status == Z_STREAM_END or $status != Z_OK ;
417 cmp_ok $status, '==', Z_STREAM_END ;
425 # create a deflate stream with flush points
427 my $hello = "I am a HAL 9000 computer" x 2001 ;
428 my $goodbye = "Will I dream?" x 2010;
429 my ($x, $err, $answer, $X, $Z, $status);
433 ok(($x, $err) = new Compress::Zlib::Deflate(AppendOutput => 1)) ;
435 cmp_ok $err, '==', Z_OK ;
437 cmp_ok $x->deflate($hello, $Answer), '==', Z_OK;
439 # create a flush point
440 cmp_ok $x->flush($Answer, Z_FULL_FLUSH), '==', Z_OK ;
442 cmp_ok $x->deflate($goodbye, $Answer), '==', Z_OK;
444 cmp_ok $x->flush($Answer), '==', Z_OK ;
446 my ($first, @Answer) = split('', $Answer) ;
449 ok(($k, $err) = new Compress::Zlib::Inflate()) ;
451 cmp_ok $err, '==', Z_OK ;
453 cmp_ok $k->inflate($first, $Z), '==', Z_OK;
455 # skip to the first flush point.
458 my $byte = shift @Answer;
459 $status = $k->inflateSync($byte) ;
460 last unless $status == Z_DATA_ERROR;
463 cmp_ok $status, '==', Z_OK;
469 $status = $k->inflate($_, $Z) ;
470 $GOT .= $Z if defined $Z ;
471 # print "x $status\n";
472 last if $status == Z_STREAM_END or $status != Z_OK ;
476 cmp_ok $status, '==', Z_DATA_ERROR ;
480 # Check inflateSync leaves good data in buffer
486 ok(($k, $err) = new Compress::Zlib::Inflate(-ConsumeInput => 0)) ;
488 cmp_ok $err, '==', Z_OK ;
490 cmp_ok $k->inflate($initial, $Z), '==', Z_OK;
492 # Skip to the flush point
493 $status = $k->inflateSync($rest);
494 cmp_ok $status, '==', Z_OK
495 or diag "status '$status'\nlength rest is " . length($rest) . "\n" ;
497 cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR;
498 is $Z . $GOT, $goodbye ;
502 title 'deflateParams';
504 my $hello = "I am a HAL 9000 computer" x 2001 ;
505 my $goodbye = "Will I dream?" x 2010;
506 my ($x, $input, $err, $answer, $X, $status, $Answer);
508 ok(($x, $err) = new Compress::Zlib::Deflate(
510 -Level => Z_DEFAULT_COMPRESSION,
511 -Strategy => Z_DEFAULT_STRATEGY)) ;
513 cmp_ok $err, '==', Z_OK ;
515 ok $x->get_Level() == Z_DEFAULT_COMPRESSION;
516 ok $x->get_Strategy() == Z_DEFAULT_STRATEGY;
518 $status = $x->deflate($hello, $Answer) ;
519 cmp_ok $status, '==', Z_OK ;
523 eval { $x->deflateParams() };
524 like $@, mkErr('^Compress::Zlib::deflateParams needs Level and\/or Strategy');
526 eval { $x->deflateParams(-Bufsize => 0) };
527 like $@, mkErr('^Compress::Zlib::Inflate::deflateParams: Bufsize must be >= 1, you specified 0');
529 eval { $x->deflateParams(-Joe => 3) };
530 like $@, mkErr('^Compress::Zlib::deflateStream::deflateParams: unknown key value\(s\) Joe');
532 is $x->get_Level(), Z_DEFAULT_COMPRESSION;
533 is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
535 # change both Level & Strategy
536 $status = $x->deflateParams(-Level => Z_BEST_SPEED, -Strategy => Z_HUFFMAN_ONLY, -Bufsize => 1234) ;
537 cmp_ok $status, '==', Z_OK ;
539 is $x->get_Level(), Z_BEST_SPEED;
540 is $x->get_Strategy(), Z_HUFFMAN_ONLY;
542 $status = $x->deflate($goodbye, $Answer) ;
543 cmp_ok $status, '==', Z_OK ;
547 $status = $x->deflateParams(-Level => Z_NO_COMPRESSION) ;
548 cmp_ok $status, '==', Z_OK ;
550 is $x->get_Level(), Z_NO_COMPRESSION;
551 is $x->get_Strategy(), Z_HUFFMAN_ONLY;
553 $status = $x->deflate($goodbye, $Answer) ;
554 cmp_ok $status, '==', Z_OK ;
557 # change only Strategy
558 $status = $x->deflateParams(-Strategy => Z_FILTERED) ;
559 cmp_ok $status, '==', Z_OK ;
561 is $x->get_Level(), Z_NO_COMPRESSION;
562 is $x->get_Strategy(), Z_FILTERED;
564 $status = $x->deflate($goodbye, $Answer) ;
565 cmp_ok $status, '==', Z_OK ;
568 cmp_ok $x->flush($Answer), '==', Z_OK ;
571 ok(($k, $err) = new Compress::Zlib::Inflate()) ;
573 cmp_ok $err, '==', Z_OK ;
576 $status = $k->inflate($Answer, $Z) ;
578 cmp_ok $status, '==', Z_STREAM_END ;
584 title "ConsumeInput and a read-only buffer trapped" ;
586 ok my $k = new Compress::Zlib::Inflate(-ConsumeInput => 1) ;
589 eval { $k->inflate("abc", $Z) ; };
590 like $@, mkErr("Compress::Zlib::Inflate::inflate input parameter cannot be read-only when ConsumeInput is specified");
598 title 'test inflate/deflate with a substr';
602 { $contents .= chr int rand 255 }
603 ok my $x = new Compress::Zlib::Deflate(-AppendOutput => 1) ;
606 my $status = $x->deflate(substr($contents,0), $X);
607 cmp_ok $status, '==', Z_OK ;
609 cmp_ok $x->flush($X), '==', Z_OK ;
611 my $append = "Appended" ;
614 ok my $k = new Compress::Zlib::Inflate(-AppendOutput => 1) ;
618 $status = $k->inflate(substr($X, 0), $Z) ;
620 cmp_ok $status, '==', Z_STREAM_END ;
621 #print "status $status X [$X]\n" ;
624 #is length($X), length($append);
626 #is length($X), length($keep);
629 title 'Looping Append test - checks that deRef_l resets the output buffer';
633 my $hello = "I am a HAL 9000 computer" ;
634 my @hello = split('', $hello) ;
635 my ($err, $x, $X, $status);
637 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1 ) );
639 cmp_ok $err, '==', Z_OK ;
645 $status = $x->deflate($_, $X) ;
646 last unless $status == Z_OK ;
651 cmp_ok $status, '==', Z_OK ;
653 cmp_ok $x->flush($X), '==', Z_OK ;
656 my @Answer = split('', $Answer) ;
659 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
661 cmp_ok $err, '==', Z_OK ;
668 $status = $k->inflate($_, $GOT) ;
669 last if $status == Z_STREAM_END or $status != Z_OK ;
672 cmp_ok $status, '==', Z_STREAM_END ;
679 title 'test inflate input parameter via substr';
681 my $hello = "I am a HAL 9000 computer" ;
686 ok my $x = new Compress::Zlib::Deflate ( -AppendOutput => 1 );
688 cmp_ok $x->deflate($data, $X), '==', Z_OK ;
690 cmp_ok $x->flush($X), '==', Z_OK ;
692 my $append = "Appended" ;
696 ok my $k = new Compress::Zlib::Inflate ( -AppendOutput => 1,
697 -ConsumeInput => 1 ) ;
699 # cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
700 cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
707 ok $k = new Compress::Zlib::Inflate ( -AppendOutput => 1,
708 -ConsumeInput => 0 ) ;
710 cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
711 #cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
720 title 'Looping Append test with substr output - substr the end of the string';
724 my $hello = "I am a HAL 9000 computer" ;
725 my @hello = split('', $hello) ;
726 my ($err, $x, $X, $status);
728 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1,
729 -AppendOutput => 1 ) );
731 cmp_ok $err, '==', Z_OK ;
737 $status = $x->deflate($_, substr($Answer, length($Answer))) ;
738 last unless $status == Z_OK ;
742 cmp_ok $status, '==', Z_OK ;
744 cmp_ok $x->flush(substr($Answer, length($Answer))), '==', Z_OK ;
746 my @Answer = split('', $Answer) ;
749 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
751 cmp_ok $err, '==', Z_OK ;
758 $status = $k->inflate($_, substr($GOT, length($GOT))) ;
759 last if $status == Z_STREAM_END or $status != Z_OK ;
762 cmp_ok $status, '==', Z_STREAM_END ;
767 title 'Looping Append test with substr output - substr the complete string';
771 my $hello = "I am a HAL 9000 computer" ;
772 my @hello = split('', $hello) ;
773 my ($err, $x, $X, $status);
775 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1,
776 -AppendOutput => 1 ) );
778 cmp_ok $err, '==', Z_OK ;
784 $status = $x->deflate($_, substr($Answer, 0)) ;
785 last unless $status == Z_OK ;
789 cmp_ok $status, '==', Z_OK ;
791 cmp_ok $x->flush(substr($Answer, 0)), '==', Z_OK ;
793 my @Answer = split('', $Answer) ;
796 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
798 cmp_ok $err, '==', Z_OK ;
805 $status = $k->inflate($_, substr($GOT, 0)) ;
806 last if $status == Z_STREAM_END or $status != Z_OK ;
809 cmp_ok $status, '==', Z_STREAM_END ;