xref: /openbsd-src/gnu/usr.bin/perl/cpan/Compress-Raw-Zlib/t/02zlib.t (revision f2da64fbbbf1b03f09f390ab01267c93dfd77c4c)
1BEGIN {
2    if ($ENV{PERL_CORE}) {
3	chdir 't' if -d 't';
4	@INC = ("../lib", "lib/compress");
5    }
6}
7
8use lib qw(t t/compress);
9use strict;
10use warnings;
11use bytes;
12
13use Test::More  ;
14use CompTestUtils;
15
16
17BEGIN
18{
19    # use Test::NoWarnings, if available
20    my $extra = 0 ;
21    $extra = 1
22        if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
23
24
25    my $count = 0 ;
26    if ($] < 5.005) {
27        $count = 232 ;
28    }
29    elsif ($] >= 5.006) {
30        $count = 317 ;
31    }
32    else {
33        $count = 275 ;
34    }
35
36    plan tests => $count + $extra;
37
38    use_ok('Compress::Raw::Zlib', 2) ;
39}
40
41
42my $Zlib_ver = Compress::Raw::Zlib::zlib_version ;
43
44my $hello = <<EOM ;
45hello world
46this is a test
47EOM
48
49my $len   = length $hello ;
50
51# Check zlib_version and ZLIB_VERSION are the same.
52SKIP: {
53    skip "TEST_SKIP_VERSION_CHECK is set", 1
54        if $ENV{TEST_SKIP_VERSION_CHECK};
55    is Compress::Raw::Zlib::zlib_version, ZLIB_VERSION,
56        "ZLIB_VERSION matches Compress::Raw::Zlib::zlib_version" ;
57}
58
59{
60    title "Error Cases" ;
61
62    eval { new Compress::Raw::Zlib::Deflate(-Level) };
63    like $@,  mkErr("^Compress::Raw::Zlib::Deflate::new: Expected even number of parameters, got 1") ;
64
65    eval { new Compress::Raw::Zlib::Inflate(-Level) };
66    like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Expected even number of parameters, got 1");
67
68    eval { new Compress::Raw::Zlib::Deflate(-Joe => 1) };
69    like $@, mkErr('^Compress::Raw::Zlib::Deflate::new: unknown key value\(s\) Joe');
70
71    eval { new Compress::Raw::Zlib::Inflate(-Joe => 1) };
72    like $@, mkErr('^Compress::Raw::Zlib::Inflate::new: unknown key value\(s\) Joe');
73
74    eval { new Compress::Raw::Zlib::Deflate(-Bufsize => 0) };
75    like $@, mkErr("^Compress::Raw::Zlib::Deflate::new: Bufsize must be >= 1, you specified 0");
76
77    eval { new Compress::Raw::Zlib::Inflate(-Bufsize => 0) };
78    like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Bufsize must be >= 1, you specified 0");
79
80    eval { new Compress::Raw::Zlib::Deflate(-Bufsize => -1) };
81    like $@, mkErr("^Compress::Raw::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
82
83    eval { new Compress::Raw::Zlib::Inflate(-Bufsize => -1) };
84    like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
85
86    eval { new Compress::Raw::Zlib::Deflate(-Bufsize => "xxx") };
87    like $@, mkErr("^Compress::Raw::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
88
89    eval { new Compress::Raw::Zlib::Inflate(-Bufsize => "xxx") };
90    like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
91
92    eval { new Compress::Raw::Zlib::Inflate(-Bufsize => 1, 2) };
93    like $@, mkErr("^Compress::Raw::Zlib::Inflate::new: Expected even number of parameters, got 3");
94
95    eval { new Compress::Raw::Zlib::Deflate(-Bufsize => 1, 2) };
96    like $@, mkErr("^Compress::Raw::Zlib::Deflate::new: Expected even number of parameters, got 3");
97
98}
99
100{
101
102    title  "deflate/inflate - small buffer";
103    # ==============================
104
105    my $hello = "I am a HAL 9000 computer" ;
106    my @hello = split('', $hello) ;
107    my ($err, $x, $X, $status);
108
109    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1 ), "Create deflate object" );
110    ok $x, "Compress::Raw::Zlib::Deflate ok" ;
111    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
112
113    ok ! defined $x->msg() ;
114    is $x->total_in(), 0, "total_in() == 0" ;
115    is $x->total_out(), 0, "total_out() == 0" ;
116
117    $X = "" ;
118    my $Answer = '';
119    foreach (@hello)
120    {
121        $status = $x->deflate($_, $X) ;
122        last unless $status == Z_OK ;
123
124        $Answer .= $X ;
125    }
126
127    cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
128
129    cmp_ok  $x->flush($X), '==', Z_OK, "flush returned Z_OK" ;
130    $Answer .= $X ;
131
132    ok ! defined $x->msg()  ;
133    is $x->total_in(), length $hello, "total_in ok" ;
134    is $x->total_out(), length $Answer, "total_out ok" ;
135
136    my @Answer = split('', $Answer) ;
137
138    my $k;
139    ok(($k, $err) = new Compress::Raw::Zlib::Inflate( {-Bufsize => 1}) );
140    ok $k, "Compress::Raw::Zlib::Inflate ok" ;
141    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
142
143    ok ! defined $k->msg(), "No error messages" ;
144    is $k->total_in(), 0, "total_in() == 0" ;
145    is $k->total_out(), 0, "total_out() == 0" ;
146    my $GOT = '';
147    my $Z;
148    $Z = 1 ;#x 2000 ;
149    foreach (@Answer)
150    {
151        $status = $k->inflate($_, $Z) ;
152        $GOT .= $Z ;
153        last if $status == Z_STREAM_END or $status != Z_OK ;
154
155    }
156
157    cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
158    is $GOT, $hello, "uncompressed data matches ok" ;
159    ok ! defined $k->msg(), "No error messages" ;
160    is $k->total_in(), length $Answer, "total_in ok" ;
161    is $k->total_out(), length $hello , "total_out ok";
162
163}
164
165
166{
167    # deflate/inflate - small buffer with a number
168    # ==============================
169
170    my $hello = 6529 ;
171
172    ok  my ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1, -AppendOutput => 1 ) ;
173    ok $x ;
174    cmp_ok $err, '==', Z_OK ;
175
176    my $status;
177    my $Answer = '';
178
179    cmp_ok $x->deflate($hello, $Answer), '==', Z_OK ;
180
181    cmp_ok $x->flush($Answer), '==', Z_OK ;
182
183    my @Answer = split('', $Answer) ;
184
185    my $k;
186    ok(($k, $err) = new Compress::Raw::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}) );
187    ok $k ;
188    cmp_ok $err, '==', Z_OK ;
189
190    #my $GOT = '';
191    my $GOT ;
192    foreach (@Answer)
193    {
194        $status = $k->inflate($_, $GOT) ;
195        last if $status == Z_STREAM_END or $status != Z_OK ;
196
197    }
198
199    cmp_ok $status, '==', Z_STREAM_END ;
200    is $GOT, $hello ;
201
202}
203
204{
205
206# deflate/inflate options - AppendOutput
207# ================================
208
209    # AppendOutput
210    # CRC
211
212    my $hello = "I am a HAL 9000 computer" ;
213    my @hello = split('', $hello) ;
214
215    ok  my ($x, $err) = new Compress::Raw::Zlib::Deflate ( {-Bufsize => 1, -AppendOutput =>1} ) ;
216    ok $x ;
217    cmp_ok $err, '==', Z_OK ;
218
219    my $status;
220    my $X;
221    foreach (@hello)
222    {
223        $status = $x->deflate($_, $X) ;
224        last unless $status == Z_OK ;
225    }
226
227    cmp_ok $status, '==', Z_OK ;
228
229    cmp_ok $x->flush($X), '==', Z_OK ;
230
231
232    my @Answer = split('', $X) ;
233
234    my $k;
235    ok(($k, $err) = new Compress::Raw::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}));
236    ok $k ;
237    cmp_ok $err, '==', Z_OK ;
238
239    my $Z;
240    foreach (@Answer)
241    {
242        $status = $k->inflate($_, $Z) ;
243        last if $status == Z_STREAM_END or $status != Z_OK ;
244
245    }
246
247    cmp_ok $status, '==', Z_STREAM_END ;
248    is $Z, $hello ;
249}
250
251
252{
253
254    title "deflate/inflate - larger buffer";
255    # ==============================
256
257    # generate a long random string
258    my $contents = '' ;
259    foreach (1 .. 50000)
260      { $contents .= chr int rand 255 }
261
262
263    ok my ($x, $err) = new Compress::Raw::Zlib::Deflate() ;
264    ok $x ;
265    cmp_ok $err, '==', Z_OK ;
266
267    my (%X, $Y, %Z, $X, $Z);
268    #cmp_ok $x->deflate($contents, $X{key}), '==', Z_OK ;
269    cmp_ok $x->deflate($contents, $X), '==', Z_OK ;
270
271    #$Y = $X{key} ;
272    $Y = $X ;
273
274
275    #cmp_ok $x->flush($X{key}), '==', Z_OK ;
276    #$Y .= $X{key} ;
277    cmp_ok $x->flush($X), '==', Z_OK ;
278    $Y .= $X ;
279
280
281
282    my $keep = $Y ;
283
284    my $k;
285    ok(($k, $err) = new Compress::Raw::Zlib::Inflate() );
286    ok $k ;
287    cmp_ok $err, '==', Z_OK ;
288
289    #cmp_ok $k->inflate($Y, $Z{key}), '==', Z_STREAM_END ;
290    #ok $contents eq $Z{key} ;
291    cmp_ok $k->inflate($Y, $Z), '==', Z_STREAM_END ;
292    ok $contents eq $Z ;
293
294    # redo deflate with AppendOutput
295
296    ok (($k, $err) = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1)) ;
297    ok $k ;
298    cmp_ok $err, '==', Z_OK ;
299
300    my $s ;
301    my $out ;
302    my @bits = split('', $keep) ;
303    foreach my $bit (@bits) {
304        $s = $k->inflate($bit, $out) ;
305    }
306
307    cmp_ok $s, '==', Z_STREAM_END ;
308
309    ok $contents eq $out ;
310
311
312}
313
314{
315
316    title "deflate/inflate - preset dictionary";
317    # ===================================
318
319    my $dictionary = "hello" ;
320    ok my $x = new Compress::Raw::Zlib::Deflate({-Level => Z_BEST_COMPRESSION,
321			     -Dictionary => $dictionary}) ;
322
323    my $dictID = $x->dict_adler() ;
324
325    my ($X, $Y, $Z);
326    cmp_ok $x->deflate($hello, $X), '==', Z_OK;
327    cmp_ok $x->flush($Y), '==', Z_OK;
328    $X .= $Y ;
329
330    ok my $k = new Compress::Raw::Zlib::Inflate(-Dictionary => $dictionary) ;
331
332    cmp_ok $k->inflate($X, $Z), '==', Z_STREAM_END;
333    is $k->dict_adler(), $dictID;
334    is $hello, $Z ;
335
336}
337
338title 'inflate - check remaining buffer after Z_STREAM_END';
339#           and that ConsumeInput works.
340# ===================================================
341
342for my $consume ( 0 .. 1)
343{
344    ok my $x = new Compress::Raw::Zlib::Deflate(-Level => Z_BEST_COMPRESSION ) ;
345
346    my ($X, $Y, $Z);
347    cmp_ok $x->deflate($hello, $X), '==', Z_OK;
348    cmp_ok $x->flush($Y), '==', Z_OK;
349    $X .= $Y ;
350
351    ok my $k = new Compress::Raw::Zlib::Inflate( -ConsumeInput => $consume) ;
352
353    my $first = substr($X, 0, 2) ;
354    my $remember_first = $first ;
355    my $last  = substr($X, 2) ;
356    cmp_ok $k->inflate($first, $Z), '==', Z_OK;
357    if ($consume) {
358        ok $first eq "" ;
359    }
360    else {
361        ok $first eq $remember_first ;
362    }
363
364    my $T ;
365    $last .= "appendage" ;
366    my $remember_last = $last ;
367    cmp_ok $k->inflate($last, $T),  '==', Z_STREAM_END;
368    is $hello, $Z . $T  ;
369    if ($consume) {
370        is $last, "appendage" ;
371    }
372    else {
373        is $last, $remember_last ;
374    }
375
376}
377
378
379
380{
381
382    title 'Check - MAX_WBITS';
383    # =================
384
385    my $hello = "Test test test test test";
386    my @hello = split('', $hello) ;
387
388    ok  my ($x, $err) =
389       new Compress::Raw::Zlib::Deflate ( -Bufsize => 1,
390                                     -WindowBits => -MAX_WBITS(),
391                                     -AppendOutput => 1 ) ;
392    ok $x ;
393    cmp_ok $err, '==', Z_OK ;
394
395    my $Answer = '';
396    my $status;
397    foreach (@hello)
398    {
399        $status = $x->deflate($_, $Answer) ;
400        last unless $status == Z_OK ;
401    }
402
403    cmp_ok $status, '==', Z_OK ;
404
405    cmp_ok $x->flush($Answer), '==', Z_OK ;
406
407    my @Answer = split('', $Answer) ;
408    # Undocumented corner -- extra byte needed to get inflate to return
409    # Z_STREAM_END when done.
410    push @Answer, " " ;
411
412    my $k;
413    ok(($k, $err) = new Compress::Raw::Zlib::Inflate(
414			{-Bufsize => 1,
415			-AppendOutput =>1,
416			-WindowBits => -MAX_WBITS()})) ;
417    ok $k ;
418    cmp_ok $err, '==', Z_OK ;
419
420    my $GOT = '';
421    foreach (@Answer)
422    {
423        $status = $k->inflate($_, $GOT) ;
424        last if $status == Z_STREAM_END or $status != Z_OK ;
425
426    }
427
428    cmp_ok $status, '==', Z_STREAM_END ;
429    is $GOT, $hello ;
430
431}
432
433SKIP:
434{
435    title 'inflateSync';
436
437    skip "inflateSync needs zlib 1.2.1 or better, you have $Zlib_ver", 22
438        if ZLIB_VERNUM() < 0x1210 ;
439
440    # create a deflate stream with flush points
441
442    my $hello = "I am a HAL 9000 computer" x 2001 ;
443    my $goodbye = "Will I dream?" x 2010;
444    my ($x, $err, $answer, $X, $Z, $status);
445    my $Answer ;
446
447    #use Devel::Peek ;
448    ok(($x, $err) = new Compress::Raw::Zlib::Deflate(AppendOutput => 1)) ;
449    ok $x ;
450    cmp_ok $err, '==', Z_OK ;
451
452    cmp_ok $x->deflate($hello, $Answer), '==', Z_OK;
453
454    # create a flush point
455    cmp_ok $x->flush($Answer, Z_FULL_FLUSH), '==', Z_OK ;
456
457    my $len1 = length $Answer;
458
459    cmp_ok $x->deflate($goodbye, $Answer), '==', Z_OK;
460
461    cmp_ok $x->flush($Answer), '==', Z_OK ;
462    my $len2 = length($Answer) - $len1 ;
463
464    my ($first, @Answer) = split('', $Answer) ;
465
466    my $k;
467    ok(($k, $err) = new Compress::Raw::Zlib::Inflate()) ;
468    ok $k ;
469    cmp_ok $err, '==', Z_OK ;
470
471    cmp_ok  $k->inflate($first, $Z), '==', Z_OK;
472
473    # skip to the first flush point.
474    while (@Answer)
475    {
476        my $byte = shift @Answer;
477        $status = $k->inflateSync($byte) ;
478        last unless $status == Z_DATA_ERROR;
479    }
480
481    cmp_ok $status, '==', Z_OK;
482
483    my $GOT = '';
484    foreach (@Answer)
485    {
486        my $Z = '';
487        $status = $k->inflate($_, $Z) ;
488        $GOT .= $Z if defined $Z ;
489        # print "x $status\n";
490        last if $status == Z_STREAM_END or $status != Z_OK ;
491    }
492
493    cmp_ok $status, '==', Z_DATA_ERROR ;
494    is $GOT, $goodbye ;
495
496
497    # Check inflateSync leaves good data in buffer
498    my $rest = $Answer ;
499    $rest =~ s/^(.)//;
500    my $initial = $1 ;
501
502
503    ok(($k, $err) = new Compress::Raw::Zlib::Inflate(ConsumeInput => 0)) ;
504    ok $k ;
505    cmp_ok $err, '==', Z_OK ;
506
507    cmp_ok $k->inflate($initial, $Z), '==', Z_OK;
508
509    # Skip to the flush point
510    $status = $k->inflateSync($rest);
511    cmp_ok $status, '==', Z_OK
512     or diag "status '$status'\nlength rest is " . length($rest) . "\n" ;
513
514    is length($rest), $len2, "expected compressed output";
515
516    $GOT = '';
517    cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR, "inflate returns Z_DATA_ERROR";
518    is $GOT, $goodbye ;
519}
520
521{
522    title 'deflateParams';
523
524    my $hello = "I am a HAL 9000 computer" x 2001 ;
525    my $goodbye = "Will I dream?" x 2010;
526    my ($x, $input, $err, $answer, $X, $status, $Answer);
527
528    ok(($x, $err) = new Compress::Raw::Zlib::Deflate(
529                       -AppendOutput   => 1,
530                       -Level    => Z_DEFAULT_COMPRESSION,
531                       -Strategy => Z_DEFAULT_STRATEGY)) ;
532    ok $x ;
533    cmp_ok $err, '==', Z_OK ;
534
535    ok $x->get_Level()    == Z_DEFAULT_COMPRESSION;
536    ok $x->get_Strategy() == Z_DEFAULT_STRATEGY;
537
538    $status = $x->deflate($hello, $Answer) ;
539    cmp_ok $status, '==', Z_OK ;
540    $input .= $hello;
541
542    # error cases
543    eval { $x->deflateParams() };
544    like $@, mkErr('^Compress::Raw::Zlib::deflateParams needs Level and\/or Strategy');
545
546    eval { $x->deflateParams(-Bufsize => 0) };
547    like $@, mkErr('^Compress::Raw::Zlib::Inflate::deflateParams: Bufsize must be >= 1, you specified 0');
548
549    eval { $x->deflateParams(-Joe => 3) };
550    like $@, mkErr('^Compress::Raw::Zlib::deflateStream::deflateParams: unknown key value\(s\) Joe');
551
552    is $x->get_Level(),    Z_DEFAULT_COMPRESSION;
553    is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
554
555    # change both Level & Strategy
556    $status = $x->deflateParams(-Level => Z_BEST_SPEED, -Strategy => Z_HUFFMAN_ONLY, -Bufsize => 1234) ;
557    cmp_ok $status, '==', Z_OK ;
558
559    is $x->get_Level(),    Z_BEST_SPEED;
560    is $x->get_Strategy(), Z_HUFFMAN_ONLY;
561
562    $status = $x->deflate($goodbye, $Answer) ;
563    cmp_ok $status, '==', Z_OK ;
564    $input .= $goodbye;
565
566    # change only Level
567    $status = $x->deflateParams(-Level => Z_NO_COMPRESSION) ;
568    cmp_ok $status, '==', Z_OK ;
569
570    is $x->get_Level(),    Z_NO_COMPRESSION;
571    is $x->get_Strategy(), Z_HUFFMAN_ONLY;
572
573    $status = $x->deflate($goodbye, $Answer) ;
574    cmp_ok $status, '==', Z_OK ;
575    $input .= $goodbye;
576
577    # change only Strategy
578    $status = $x->deflateParams(-Strategy => Z_FILTERED) ;
579    cmp_ok $status, '==', Z_OK ;
580
581    is $x->get_Level(),    Z_NO_COMPRESSION;
582    is $x->get_Strategy(), Z_FILTERED;
583
584    $status = $x->deflate($goodbye, $Answer) ;
585    cmp_ok $status, '==', Z_OK ;
586    $input .= $goodbye;
587
588    cmp_ok $x->flush($Answer), '==', Z_OK ;
589
590    my $k;
591    ok(($k, $err) = new Compress::Raw::Zlib::Inflate()) ;
592    ok $k ;
593    cmp_ok $err, '==', Z_OK ;
594
595    my $Z;
596    $status = $k->inflate($Answer, $Z) ;
597
598    cmp_ok $status, '==', Z_STREAM_END ;
599    is $Z, $input ;
600}
601
602
603{
604    title "ConsumeInput and a read-only buffer trapped" ;
605
606    ok my $k = new Compress::Raw::Zlib::Inflate(-ConsumeInput => 1) ;
607
608    my $Z;
609    eval { $k->inflate("abc", $Z) ; };
610    like $@, mkErr("Compress::Raw::Zlib::Inflate::inflate input parameter cannot be read-only when ConsumeInput is specified");
611
612}
613
614foreach (1 .. 2)
615{
616    next if $] < 5.005 ;
617
618    title 'test inflate/deflate with a substr';
619
620    my $contents = '' ;
621    foreach (1 .. 5000)
622      { $contents .= chr int rand 255 }
623    ok  my $x = new Compress::Raw::Zlib::Deflate(-AppendOutput => 1) ;
624
625    my $X ;
626    my $status = $x->deflate(substr($contents,0), $X);
627    cmp_ok $status, '==', Z_OK ;
628
629    cmp_ok $x->flush($X), '==', Z_OK  ;
630
631    my $append = "Appended" ;
632    $X .= $append ;
633
634    ok my $k = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1) ;
635
636    my $Z;
637    my $keep = $X ;
638    $status = $k->inflate(substr($X, 0), $Z) ;
639
640    cmp_ok $status, '==', Z_STREAM_END ;
641    #print "status $status X [$X]\n" ;
642    is $contents, $Z ;
643    ok $X eq $append;
644    #is length($X), length($append);
645    #ok $X eq $keep;
646    #is length($X), length($keep);
647}
648
649title 'Looping Append test - checks that deRef_l resets the output buffer';
650foreach (1 .. 2)
651{
652
653    my $hello = "I am a HAL 9000 computer" ;
654    my @hello = split('', $hello) ;
655    my ($err, $x, $X, $status);
656
657    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1 ) );
658    ok $x ;
659    cmp_ok $err, '==', Z_OK ;
660
661    $X = "" ;
662    my $Answer = '';
663    foreach (@hello)
664    {
665        $status = $x->deflate($_, $X) ;
666        last unless $status == Z_OK ;
667
668        $Answer .= $X ;
669    }
670
671    cmp_ok $status, '==', Z_OK ;
672
673    cmp_ok  $x->flush($X), '==', Z_OK ;
674    $Answer .= $X ;
675
676    my @Answer = split('', $Answer) ;
677
678    my $k;
679    ok(($k, $err) = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1) );
680    ok $k ;
681    cmp_ok $err, '==', Z_OK ;
682
683    my $GOT ;
684    my $Z;
685    $Z = 1 ;#x 2000 ;
686    foreach (@Answer)
687    {
688        $status = $k->inflate($_, $GOT) ;
689        last if $status == Z_STREAM_END or $status != Z_OK ;
690    }
691
692    cmp_ok $status, '==', Z_STREAM_END ;
693    is $GOT, $hello ;
694
695}
696
697if ($] >= 5.005)
698{
699    title 'test inflate input parameter via substr';
700
701    my $hello = "I am a HAL 9000 computer" ;
702    my $data = $hello ;
703
704    my($X, $Z);
705
706    ok my $x = new Compress::Raw::Zlib::Deflate ( -AppendOutput => 1 );
707
708    cmp_ok $x->deflate($data, $X), '==',  Z_OK ;
709
710    cmp_ok $x->flush($X), '==', Z_OK ;
711
712    my $append = "Appended" ;
713    $X .= $append ;
714    my $keep = $X ;
715
716    ok my $k = new Compress::Raw::Zlib::Inflate ( -AppendOutput => 1,
717                                             -ConsumeInput => 1 ) ;
718
719    cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
720
721    ok $hello eq $Z ;
722    is $X, $append;
723
724    $X = $keep ;
725    $Z = '';
726    ok $k = new Compress::Raw::Zlib::Inflate ( -AppendOutput => 1,
727                                          -ConsumeInput => 0 ) ;
728
729    cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
730    #cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
731
732    ok $hello eq $Z ;
733    is $X, $keep;
734
735}
736
737SKIP:
738{
739    skip "InflateScan needs zlib 1.2.1 or better, you have $Zlib_ver", 1
740        if ZLIB_VERNUM() < 0x1210 ;
741
742    # regression - check that resetLastBlockByte can cope with a NULL
743    # pointer.
744    Compress::Raw::Zlib::InflateScan->new->resetLastBlockByte(undef);
745    ok 1, "resetLastBlockByte(undef) is ok" ;
746}
747
748SKIP:
749{
750
751    title "gzip mode";
752    # ================
753
754    skip "gzip mode needs zlib 1.2.1 or better, you have $Zlib_ver", 13
755        if ZLIB_VERNUM() < 0x1210 ;
756
757    my $hello = "I am a HAL 9000 computer" ;
758    my @hello = split('', $hello) ;
759    my ($err, $x, $X, $status);
760
761    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate (
762            WindowBits => WANT_GZIP ,
763            AppendOutput => 1
764        ), "Create deflate object" );
765    ok $x, "Compress::Raw::Zlib::Deflate ok" ;
766    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
767
768    $status = $x->deflate($hello, $X) ;
769    cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
770
771    cmp_ok  $x->flush($X), '==', Z_OK, "flush returned Z_OK" ;
772
773    my ($k, $GOT);
774    ($k, $err) = new Compress::Raw::Zlib::Inflate(
775            WindowBits => WANT_GZIP ,
776            ConsumeInput => 0 ,
777            AppendOutput => 1);
778    ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP ok" ;
779    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
780
781    $status = $k->inflate($X, $GOT) ;
782    cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
783    is $GOT, $hello, "uncompressed data matches ok" ;
784
785    $GOT = '';
786    ($k, $err) = new Compress::Raw::Zlib::Inflate(
787            WindowBits => WANT_GZIP_OR_ZLIB ,
788            AppendOutput => 1);
789    ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP_OR_ZLIB ok" ;
790    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
791
792    $status = $k->inflate($X, $GOT) ;
793    cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
794    is $GOT, $hello, "uncompressed data matches ok" ;
795}
796
797SKIP:
798{
799
800    title "gzip error mode";
801    # Create gzip -
802    # read with no special windowbits setting - this will fail
803    # then read with WANT_GZIP_OR_ZLIB - thi swill work
804    # ================
805
806    skip "gzip mode needs zlib 1.2.1 or better, you have $Zlib_ver", 12
807        if ZLIB_VERNUM() < 0x1210 ;
808
809    my $hello = "I am a HAL 9000 computer" ;
810    my ($err, $x, $X, $status);
811
812    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate (
813            WindowBits => WANT_GZIP ,
814            AppendOutput => 1
815        ), "Create deflate object" );
816    ok $x, "Compress::Raw::Zlib::Deflate ok" ;
817    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
818
819    $status = $x->deflate($hello, $X) ;
820    cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
821
822    cmp_ok  $x->flush($X), '==', Z_OK, "flush returned Z_OK" ;
823
824    my ($k, $GOT);
825    ($k, $err) = new Compress::Raw::Zlib::Inflate(
826            WindowBits => MAX_WBITS ,
827            ConsumeInput => 0 ,
828            AppendOutput => 1);
829    ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP ok" ;
830    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
831
832    $status = $k->inflate($X, $GOT) ;
833    cmp_ok $status, '==', Z_DATA_ERROR, "Got Z_DATA_ERROR" ;
834
835    $GOT = '';
836    ($k, $err) = new Compress::Raw::Zlib::Inflate(
837            WindowBits => WANT_GZIP_OR_ZLIB ,
838            AppendOutput => 1);
839    ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP_OR_ZLIB ok" ;
840    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
841
842    $status = $k->inflate($X, $GOT) ;
843    cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
844    is $GOT, $hello, "uncompressed data matches ok" ;
845}
846
847SKIP:
848{
849    title "gzip/zlib error mode";
850    # Create zlib -
851    # read with no WANT_GZIP windowbits setting - this will fail
852    # then read with WANT_GZIP_OR_ZLIB - thi swill work
853    # ================
854
855    skip "gzip mode needs zlib 1.2.1 or better, you have $Zlib_ver", 12
856        if ZLIB_VERNUM() < 0x1210 ;
857
858    my $hello = "I am a HAL 9000 computer" ;
859    my ($err, $x, $X, $status);
860
861    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate (
862            AppendOutput => 1
863        ), "Create deflate object" );
864    ok $x, "Compress::Raw::Zlib::Deflate ok" ;
865    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
866
867    $status = $x->deflate($hello, $X) ;
868    cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
869
870    cmp_ok  $x->flush($X), '==', Z_OK, "flush returned Z_OK" ;
871
872    my ($k, $GOT);
873    ($k, $err) = new Compress::Raw::Zlib::Inflate(
874            WindowBits => WANT_GZIP ,
875            ConsumeInput => 0 ,
876            AppendOutput => 1);
877    ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP ok" ;
878    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
879
880    $status = $k->inflate($X, $GOT) ;
881    cmp_ok $status, '==', Z_DATA_ERROR, "Got Z_DATA_ERROR" ;
882
883    $GOT = '';
884    ($k, $err) = new Compress::Raw::Zlib::Inflate(
885            WindowBits => WANT_GZIP_OR_ZLIB ,
886            AppendOutput => 1);
887    ok $k, "Compress::Raw::Zlib::Inflate WANT_GZIP_OR_ZLIB ok" ;
888    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
889
890    $status = $k->inflate($X, $GOT) ;
891    cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
892    is $GOT, $hello, "uncompressed data matches ok" ;
893}
894
895{
896    title "zlibCompileFlags";
897
898    my $flags = Compress::Raw::Zlib::zlibCompileFlags;
899
900    if (ZLIB_VERNUM() < 0x1210)
901    {
902        is $flags, 0, "zlibCompileFlags == 0 if < 1.2.1";
903    }
904    else
905    {
906        ok $flags, "zlibCompileFlags != 0 if < 1.2.1";
907    }
908}
909
910{
911    title "repeated calls to flush after some compression";
912
913    my $hello = "I am a HAL 9000 computer" ;
914    my ($err, $x, $X, $status);
915
916    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( ), "Create deflate object" );
917    isa_ok $x, "Compress::Raw::Zlib::deflateStream" ;
918    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
919
920    $status = $x->deflate($hello, $X) ;
921    cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
922
923    cmp_ok  $x->flush($X, Z_SYNC_FLUSH), '==', Z_OK, "flush returned Z_OK" ;
924    cmp_ok  $x->flush($X, Z_SYNC_FLUSH), '==', Z_OK, "second flush returned Z_OK" ;
925    is $X, "", "no output from second flush";
926}
927
928{
929    title "repeated calls to flush - no compression";
930
931    my $hello = "I am a HAL 9000 computer" ;
932    my ($err, $x, $X, $status);
933
934    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( ), "Create deflate object" );
935    isa_ok $x, "Compress::Raw::Zlib::deflateStream" ;
936    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
937
938    cmp_ok  $x->flush($X, Z_SYNC_FLUSH), '==', Z_OK, "flush returned Z_OK" ;
939    cmp_ok  $x->flush($X, Z_SYNC_FLUSH), '==', Z_OK, "second flush returned Z_OK" ;
940    is $X, "", "no output from second flush";
941}
942
943exit if $] < 5.006 ;
944
945title 'Looping Append test with substr output - substr the end of the string';
946foreach (1 .. 2)
947{
948
949    my $hello = "I am a HAL 9000 computer" ;
950    my @hello = split('', $hello) ;
951    my ($err, $x, $X, $status);
952
953    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1,
954                                            -AppendOutput => 1 ) );
955    ok $x ;
956    cmp_ok $err, '==', Z_OK ;
957
958    $X = "" ;
959    my $Answer = '';
960    foreach (@hello)
961    {
962        $status = $x->deflate($_, substr($Answer, length($Answer))) ;
963        last unless $status == Z_OK ;
964
965    }
966
967    cmp_ok $status, '==', Z_OK ;
968
969    cmp_ok  $x->flush(substr($Answer, length($Answer))), '==', Z_OK ;
970
971    #cmp_ok length $Answer, ">", 0 ;
972
973    my @Answer = split('', $Answer) ;
974
975
976    my $k;
977    ok(($k, $err) = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1) );
978    ok $k ;
979    cmp_ok $err, '==', Z_OK ;
980
981    my $GOT = '';
982    my $Z;
983    $Z = 1 ;#x 2000 ;
984    foreach (@Answer)
985    {
986        $status = $k->inflate($_, substr($GOT, length($GOT))) ;
987        last if $status == Z_STREAM_END or $status != Z_OK ;
988    }
989
990    cmp_ok $status, '==', Z_STREAM_END ;
991    is $GOT, $hello ;
992
993}
994
995title 'Looping Append test with substr output - substr the complete string';
996foreach (1 .. 2)
997{
998
999    my $hello = "I am a HAL 9000 computer" ;
1000    my @hello = split('', $hello) ;
1001    my ($err, $x, $X, $status);
1002
1003    ok( ($x, $err) = new Compress::Raw::Zlib::Deflate ( -Bufsize => 1,
1004                                            -AppendOutput => 1 ) );
1005    ok $x ;
1006    cmp_ok $err, '==', Z_OK ;
1007
1008    $X = "" ;
1009    my $Answer = '';
1010    foreach (@hello)
1011    {
1012        $status = $x->deflate($_, substr($Answer, 0)) ;
1013        last unless $status == Z_OK ;
1014
1015    }
1016
1017    cmp_ok $status, '==', Z_OK ;
1018
1019    cmp_ok  $x->flush(substr($Answer, 0)), '==', Z_OK ;
1020
1021    my @Answer = split('', $Answer) ;
1022
1023    my $k;
1024    ok(($k, $err) = new Compress::Raw::Zlib::Inflate(-AppendOutput => 1) );
1025    ok $k ;
1026    cmp_ok $err, '==', Z_OK ;
1027
1028    my $GOT = '';
1029    my $Z;
1030    $Z = 1 ;#x 2000 ;
1031    foreach (@Answer)
1032    {
1033        $status = $k->inflate($_, substr($GOT, 0)) ;
1034        last if $status == Z_STREAM_END or $status != Z_OK ;
1035    }
1036
1037    cmp_ok $status, '==', Z_STREAM_END ;
1038    is $GOT, $hello ;
1039}
1040
1041