CompTestUtils.pm revision 1.1.1.1
1package CompTestUtils;
2
3package main ;
4
5use strict ;
6use warnings;
7use bytes;
8
9#use lib qw(t t/compress);
10
11use Carp ;
12#use Test::More ;
13
14
15
16sub title
17{
18    #diag "" ;
19    ok(1, $_[0]) ;
20    #diag "" ;
21}
22
23sub like_eval
24{
25    like $@, @_ ;
26}
27
28{
29    package LexFile ;
30
31    our ($index);
32    $index = '00000';
33
34    sub new
35    {
36        my $self = shift ;
37        foreach (@_)
38        {
39            # autogenerate the name unless if none supplied
40            $_ = "tst" . $index ++ . ".tmp"
41                unless defined $_;
42        }
43        chmod 0777, @_;
44        for (@_) { 1 while unlink $_ } ;
45        bless [ @_ ], $self ;
46    }
47
48    sub DESTROY
49    {
50        my $self = shift ;
51        chmod 0777, @{ $self } ;
52        for (@$self) { 1 while unlink $_ } ;
53    }
54
55}
56
57{
58    package LexDir ;
59
60    use File::Path;
61    sub new
62    {
63        my $self = shift ;
64        foreach (@_) { rmtree $_ }
65        bless [ @_ ], $self ;
66    }
67
68    sub DESTROY
69    {
70        my $self = shift ;
71        foreach (@$self) { rmtree $_ }
72    }
73}
74sub readFile
75{
76    my $f = shift ;
77
78    my @strings ;
79
80    if (IO::Compress::Base::Common::isaFilehandle($f))
81    {
82        my $pos = tell($f);
83        seek($f, 0,0);
84        @strings = <$f> ;
85        seek($f, 0, $pos);
86    }
87    else
88    {
89        open (F, "<$f")
90            or croak "Cannot open $f: $!\n" ;
91        binmode F;
92        @strings = <F> ;
93        close F ;
94    }
95
96    return @strings if wantarray ;
97    return join "", @strings ;
98}
99
100sub touch
101{
102    foreach (@_) { writeFile($_, '') }
103}
104
105sub writeFile
106{
107    my($filename, @strings) = @_ ;
108    1 while unlink $filename ;
109    open (F, ">$filename")
110        or croak "Cannot open $filename: $!\n" ;
111    binmode F;
112    foreach (@strings) {
113        no warnings ;
114        print F $_ ;
115    }
116    close F ;
117}
118
119sub GZreadFile
120{
121    my ($filename) = shift ;
122
123    my ($uncomp) = "" ;
124    my $line = "" ;
125    my $fil = gzopen($filename, "rb")
126        or croak "Cannopt open '$filename': $Compress::Zlib::gzerrno" ;
127
128    $uncomp .= $line
129        while $fil->gzread($line) > 0;
130
131    $fil->gzclose ;
132    return $uncomp ;
133}
134
135sub hexDump
136{
137    my $d = shift ;
138
139    if (IO::Compress::Base::Common::isaFilehandle($d))
140    {
141        $d = readFile($d);
142    }
143    elsif (IO::Compress::Base::Common::isaFilename($d))
144    {
145        $d = readFile($d);
146    }
147    else
148    {
149        $d = $$d ;
150    }
151
152    my $offset = 0 ;
153
154    $d = '' unless defined $d ;
155    #while (read(STDIN, $data, 16)) {
156    while (my $data = substr($d, 0, 16)) {
157        substr($d, 0, 16) = '' ;
158        printf "# %8.8lx    ", $offset;
159        $offset += 16;
160
161        my @array = unpack('C*', $data);
162        foreach (@array) {
163            printf('%2.2x ', $_);
164        }
165        print "   " x (16 - @array)
166            if @array < 16 ;
167        $data =~ tr/\0-\37\177-\377/./;
168        print "  $data\n";
169    }
170
171}
172
173sub readHeaderInfo
174{
175    my $name = shift ;
176    my %opts = @_ ;
177
178    my $string = <<EOM;
179some text
180EOM
181
182    ok my $x = new IO::Compress::Gzip $name, %opts
183        or diag "GzipError is $IO::Compress::Gzip::GzipError" ;
184    ok $x->write($string) ;
185    ok $x->close ;
186
187    #is GZreadFile($name), $string ;
188
189    ok my $gunz = new IO::Uncompress::Gunzip $name, Strict => 0
190        or diag "GunzipError is $IO::Uncompress::Gunzip::GunzipError" ;
191    ok my $hdr = $gunz->getHeaderInfo();
192    my $uncomp ;
193    ok $gunz->read($uncomp) ;
194    ok $uncomp eq $string;
195    ok $gunz->close ;
196
197    return $hdr ;
198}
199
200sub cmpFile
201{
202    my ($filename, $uue) = @_ ;
203    return readFile($filename) eq unpack("u", $uue) ;
204}
205
206#sub isRawFormat
207#{
208#    my $class = shift;
209#    # TODO -- add Lzma here?
210#    my %raw = map { $_ => 1 } qw( RawDeflate );
211#
212#    return defined $raw{$class};
213#}
214
215
216
217my %TOP = (
218    'IO::Uncompress::AnyInflate' => { Inverse  => 'IO::Compress::Gzip',
219                                      Error    => 'AnyInflateError',
220                                      TopLevel => 'anyinflate',
221                                      Raw      => 0,
222                            },
223
224    'IO::Uncompress::AnyUncompress' => { Inverse  => 'IO::Compress::Gzip',
225                                         Error    => 'AnyUncompressError',
226                                         TopLevel => 'anyuncompress',
227                                         Raw      => 0,
228                            },
229
230    'IO::Compress::Gzip' => { Inverse  => 'IO::Uncompress::Gunzip',
231                              Error    => 'GzipError',
232                              TopLevel => 'gzip',
233                              Raw      => 0,
234                            },
235    'IO::Uncompress::Gunzip' => { Inverse  => 'IO::Compress::Gzip',
236                                  Error    => 'GunzipError',
237                                  TopLevel => 'gunzip',
238                                  Raw      => 0,
239                            },
240
241    'IO::Compress::Deflate' => { Inverse  => 'IO::Uncompress::Inflate',
242                                 Error    => 'DeflateError',
243                                 TopLevel => 'deflate',
244                                 Raw      => 0,
245                            },
246    'IO::Uncompress::Inflate' => { Inverse  => 'IO::Compress::Deflate',
247                                   Error    => 'InflateError',
248                                   TopLevel => 'inflate',
249                                   Raw      => 0,
250                            },
251
252    'IO::Compress::RawDeflate' => { Inverse  => 'IO::Uncompress::RawInflate',
253                                    Error    => 'RawDeflateError',
254                                    TopLevel => 'rawdeflate',
255                                    Raw      => 1,
256                            },
257    'IO::Uncompress::RawInflate' => { Inverse  => 'IO::Compress::RawDeflate',
258                                      Error    => 'RawInflateError',
259                                      TopLevel => 'rawinflate',
260                                      Raw      => 1,
261                            },
262
263    'IO::Compress::Zip' => { Inverse  => 'IO::Uncompress::Unzip',
264                             Error    => 'ZipError',
265                             TopLevel => 'zip',
266                             Raw      => 0,
267                            },
268    'IO::Uncompress::Unzip' => { Inverse  => 'IO::Compress::Zip',
269                                 Error    => 'UnzipError',
270                                 TopLevel => 'unzip',
271                                 Raw      => 0,
272                            },
273
274    'IO::Compress::Bzip2' => { Inverse  => 'IO::Uncompress::Bunzip2',
275                               Error    => 'Bzip2Error',
276                               TopLevel => 'bzip2',
277                               Raw      => 0,
278                            },
279    'IO::Uncompress::Bunzip2' => { Inverse  => 'IO::Compress::Bzip2',
280                                   Error    => 'Bunzip2Error',
281                                   TopLevel => 'bunzip2',
282                                   Raw      => 0,
283                            },
284
285    'IO::Compress::Lzop' => { Inverse  => 'IO::Uncompress::UnLzop',
286                              Error    => 'LzopError',
287                              TopLevel => 'lzop',
288                              Raw      => 0,
289                            },
290    'IO::Uncompress::UnLzop' => { Inverse  => 'IO::Compress::Lzop',
291                                  Error    => 'UnLzopError',
292                                  TopLevel => 'unlzop',
293                                  Raw      => 0,
294                            },
295
296    'IO::Compress::Lzf' => { Inverse  => 'IO::Uncompress::UnLzf',
297                             Error    => 'LzfError',
298                             TopLevel => 'lzf',
299                             Raw      => 0,
300                            },
301    'IO::Uncompress::UnLzf' => { Inverse  => 'IO::Compress::Lzf',
302                                 Error    => 'UnLzfError',
303                                 TopLevel => 'unlzf',
304                                 Raw      => 0,
305                            },
306
307    'IO::Compress::Lzma' => { Inverse  => 'IO::Uncompress::UnLzma',
308                              Error    => 'LzmaError',
309                              TopLevel => 'lzma',
310                              Raw      => 1,
311                            },
312    'IO::Uncompress::UnLzma' => { Inverse  => 'IO::Compress::Lzma',
313                                  Error    => 'UnLzmaError',
314                                  TopLevel => 'unlzma',
315                                  Raw      => 1,
316                                },
317
318    'IO::Compress::Xz' => { Inverse  => 'IO::Uncompress::UnXz',
319                            Error    => 'XzError',
320                            TopLevel => 'xz',
321                            Raw      => 0,
322                          },
323    'IO::Uncompress::UnXz' => { Inverse  => 'IO::Compress::Xz',
324                                Error    => 'UnXzError',
325                                TopLevel => 'unxz',
326                                Raw      => 0,
327                              },
328
329    'IO::Compress::PPMd' => { Inverse  => 'IO::Uncompress::UnPPMd',
330                              Error    => 'PPMdError',
331                              TopLevel => 'ppmd',
332                              Raw      => 0,
333                            },
334    'IO::Uncompress::UnPPMd' => { Inverse  => 'IO::Compress::PPMd',
335                                  Error    => 'UnPPMdError',
336                                  TopLevel => 'unppmd',
337                                  Raw      => 0,
338                                },
339
340    'IO::Compress::DummyComp' => { Inverse  => 'IO::Uncompress::DummyUnComp',
341                                   Error    => 'DummyCompError',
342                                   TopLevel => 'dummycomp',
343                                   Raw      => 0,
344                                 },
345    'IO::Uncompress::DummyUnComp' => { Inverse  => 'IO::Compress::DummyComp',
346                                       Error    => 'DummyUnCompError',
347                                       TopLevel => 'dummyunComp',
348                                       Raw      => 0,
349                                     },
350);
351
352
353for my $key (keys %TOP)
354{
355    no strict;
356    no warnings;
357    $TOP{$key}{Error}    = \${ $key . '::' . $TOP{$key}{Error}    };
358    $TOP{$key}{TopLevel} =     $key . '::' . $TOP{$key}{TopLevel}  ;
359
360    # Silence used once warning in really old perl
361    my $dummy            = \${ $key . '::' . $TOP{$key}{Error}    };
362
363    #$TOP{$key . "::" . $TOP{$key}{TopLevel} } = $TOP{$key};
364}
365
366sub uncompressBuffer
367{
368    my $compWith = shift ;
369    my $buffer = shift ;
370
371
372    my $out ;
373    my $obj = $TOP{$compWith}{Inverse}->new( \$buffer, -Append => 1);
374    1 while $obj->read($out) > 0 ;
375    return $out ;
376
377}
378
379
380sub getInverse
381{
382    my $class = shift ;
383
384    return $TOP{$class}{Inverse};
385}
386
387sub getErrorRef
388{
389    my $class = shift ;
390
391    return $TOP{$class}{Error};
392}
393
394sub getTopFuncRef
395{
396    my $class = shift ;
397
398    die "Cannot find $class"
399        if ! defined $TOP{$class}{TopLevel};
400    return \&{ $TOP{$class}{TopLevel} } ;
401}
402
403sub getTopFuncName
404{
405    my $class = shift ;
406
407    return $TOP{$class}{TopLevel} ;
408}
409
410sub compressBuffer
411{
412    my $compWith = shift ;
413    my $buffer = shift ;
414
415
416    my $out ;
417    die "Cannot find $compWith"
418        if ! defined $TOP{$compWith}{Inverse};
419    my $obj = $TOP{$compWith}{Inverse}->new( \$out);
420    $obj->write($buffer) ;
421    $obj->close();
422    return $out ;
423}
424
425our ($AnyUncompressError);
426BEGIN
427{
428    eval ' use IO::Uncompress::AnyUncompress qw($AnyUncompressError); ';
429}
430
431sub anyUncompress
432{
433    my $buffer = shift ;
434    my $already = shift;
435
436    my @opts = ();
437    if (ref $buffer && ref $buffer eq 'ARRAY')
438    {
439        @opts = @$buffer;
440        $buffer = shift @opts;
441    }
442
443    if (ref $buffer)
444    {
445        croak "buffer is undef" unless defined $$buffer;
446        croak "buffer is empty" unless length $$buffer;
447
448    }
449
450
451    my $data ;
452    if (IO::Compress::Base::Common::isaFilehandle($buffer))
453    {
454        $data = readFile($buffer);
455    }
456    elsif (IO::Compress::Base::Common::isaFilename($buffer))
457    {
458        $data = readFile($buffer);
459    }
460    else
461    {
462        $data = $$buffer ;
463    }
464
465    if (defined $already && length $already)
466    {
467
468        my $got = substr($data, 0, length($already));
469        substr($data, 0, length($already)) = '';
470
471        is $got, $already, '  Already OK' ;
472    }
473
474    my $out = '';
475    my $o = new IO::Uncompress::AnyUncompress \$data,
476                    Append => 1,
477                    Transparent => 0,
478                    RawInflate => 1,
479                    UnLzma     => 1,
480                    @opts
481        or croak "Cannot open buffer/file: $AnyUncompressError" ;
482
483    1 while $o->read($out) > 0 ;
484
485    croak "Error uncompressing -- " . $o->error()
486        if $o->error() ;
487
488    return $out ;
489
490}
491
492sub getHeaders
493{
494    my $buffer = shift ;
495    my $already = shift;
496
497    my @opts = ();
498    if (ref $buffer && ref $buffer eq 'ARRAY')
499    {
500        @opts = @$buffer;
501        $buffer = shift @opts;
502    }
503
504    if (ref $buffer)
505    {
506        croak "buffer is undef" unless defined $$buffer;
507        croak "buffer is empty" unless length $$buffer;
508
509    }
510
511
512    my $data ;
513    if (IO::Compress::Base::Common::isaFilehandle($buffer))
514    {
515        $data = readFile($buffer);
516    }
517    elsif (IO::Compress::Base::Common::isaFilename($buffer))
518    {
519        $data = readFile($buffer);
520    }
521    else
522    {
523        $data = $$buffer ;
524    }
525
526    if (defined $already && length $already)
527    {
528
529        my $got = substr($data, 0, length($already));
530        substr($data, 0, length($already)) = '';
531
532        is $got, $already, '  Already OK' ;
533    }
534
535    my $out = '';
536    my $o = new IO::Uncompress::AnyUncompress \$data,
537                MultiStream => 1,
538                Append => 1,
539                Transparent => 0,
540                RawInflate => 1,
541                UnLzma     => 1,
542                @opts
543        or croak "Cannot open buffer/file: $AnyUncompressError" ;
544
545    1 while $o->read($out) > 0 ;
546
547    croak "Error uncompressing -- " . $o->error()
548        if $o->error() ;
549
550    return ($o->getHeaderInfo()) ;
551
552}
553
554sub mkComplete
555{
556    my $class = shift ;
557    my $data = shift;
558    my $Error = getErrorRef($class);
559
560    my $buffer ;
561    my %params = ();
562
563    if ($class eq 'IO::Compress::Gzip') {
564        %params = (
565            Name       => "My name",
566            Comment    => "a comment",
567            ExtraField => ['ab' => "extra"],
568            HeaderCRC  => 1);
569    }
570    elsif ($class eq 'IO::Compress::Zip'){
571        %params = (
572            Name              => "My name",
573            Comment           => "a comment",
574            ZipComment        => "last comment",
575            exTime            => [100, 200, 300],
576            ExtraFieldLocal   => ["ab" => "extra1"],
577            ExtraFieldCentral => ["cd" => "extra2"],
578        );
579    }
580
581    my $z = new $class( \$buffer, %params)
582        or croak "Cannot create $class object: $$Error";
583    $z->write($data);
584    $z->close();
585
586    my $unc = getInverse($class);
587    anyUncompress(\$buffer) eq $data
588        or die "bad bad bad";
589    my $u = new $unc( \$buffer);
590    my $info = $u->getHeaderInfo() ;
591
592
593    return wantarray ? ($info, $buffer) : $buffer ;
594}
595
596sub mkErr
597{
598    my $string = shift ;
599    my ($dummy, $file, $line) = caller ;
600    -- $line ;
601
602    $file = quotemeta($file);
603
604    #return "/$string\\s+at $file line $line/" if $] >= 5.006 ;
605    return "/$string\\s+at /" ;
606}
607
608sub mkEvalErr
609{
610    my $string = shift ;
611
612    #return "/$string\\s+at \\(eval /" if $] > 5.006 ;
613    return "/$string\\s+at /" ;
614}
615
616sub dumpObj
617{
618    my $obj = shift ;
619
620    my ($dummy, $file, $line) = caller ;
621
622    if (@_)
623    {
624        print "#\n# dumpOBJ from $file line $line @_\n" ;
625    }
626    else
627    {
628        print "#\n# dumpOBJ from $file line $line \n" ;
629    }
630
631    my $max = 0 ;;
632    foreach my $k (keys %{ *$obj })
633    {
634        $max = length $k if length $k > $max ;
635    }
636
637    foreach my $k (sort keys %{ *$obj })
638    {
639        my $v = $obj->{$k} ;
640        $v = '-undef-' unless defined $v;
641        my $pad = ' ' x ($max - length($k) + 2) ;
642        print "# $k$pad: [$v]\n";
643    }
644    print "#\n" ;
645}
646
647
648sub getMultiValues
649{
650    my $class = shift ;
651
652    return (0,0) if $class =~ /lzf|lzma/i;
653    return (1,0);
654}
655
656
657sub gotScalarUtilXS
658{
659    eval ' use Scalar::Util "dualvar" ';
660    return $@ ? 0 : 1 ;
661}
662
663package CompTestUtils;
664
6651;
666__END__
667	t/Test/Builder.pm
668	t/Test/More.pm
669	t/Test/Simple.pm
670	t/compress/CompTestUtils.pm
671	t/compress/any.pl
672	t/compress/anyunc.pl
673	t/compress/destroy.pl
674	t/compress/generic.pl
675	t/compress/merge.pl
676	t/compress/multi.pl
677	t/compress/newtied.pl
678	t/compress/oneshot.pl
679	t/compress/prime.pl
680	t/compress/tied.pl
681	t/compress/truncate.pl
682	t/compress/zlib-generic.plParsing config.in...
683Building Zlib enabled
684Auto Detect Gzip OS Code..
685Setting Gzip OS Code to 3 [Unix/Default]
686Looks Good.
687