proposal [perl #34301]: IO::Socket calls getpeername far too often
[p5sagit/p5-mst-13.2.git] / ext / Compress / Zlib / t / 20tied.t
CommitLineData
642e522c 1
2use lib 't';
3use strict;
4use warnings;
5use bytes;
6
7use Test::More ;
8use ZlibTestUtils;
9
10our ($BadPerl);
11
12BEGIN
13{
14 plan(skip_all => "Tied Filehandle needs Perl 5.005 or better" )
15 if $] < 5.005 ;
16
17 # use Test::NoWarnings, if available
18 my $extra = 0 ;
19 $extra = 1
20 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
21
22 my $tests ;
23 $BadPerl = ($] >= 5.006 or $] <= 5.008) ;
24
25 if ($BadPerl) {
26 $tests = 731 ;
27 }
28 else {
29 $tests = 771 ;
30 }
31
32 plan tests => $tests + $extra ;
33
34 use_ok('Compress::Zlib', 2) ;
35
36 use_ok('IO::Compress::Gzip', qw($GzipError)) ;
37 use_ok('IO::Uncompress::Gunzip', qw($GunzipError)) ;
38
39 use_ok('IO::Compress::Deflate', qw($DeflateError)) ;
40 use_ok('IO::Uncompress::Inflate', qw($InflateError)) ;
41
42 use_ok('IO::Compress::RawDeflate', qw($RawDeflateError)) ;
43 use_ok('IO::Uncompress::RawInflate', qw($RawInflateError)) ;
44}
45
46
47use IO::Handle qw(SEEK_SET SEEK_CUR SEEK_END);
48
49
50
51
52our ($UncompressClass);
53
54
55sub myGZreadFile
56{
57 my $filename = shift ;
58 my $init = shift ;
59
60
61 my $fil = new $UncompressClass $filename,
62 -Strict => 1,
63 -Append => 1
64 ;
65
66 my $data ;
67 $data = $init if defined $init ;
68 1 while $fil->read($data) > 0;
69
70 $fil->close ;
71 return $data ;
72}
73
74# Check zlib_version and ZLIB_VERSION are the same.
75is Compress::Zlib::zlib_version, ZLIB_VERSION,
76 "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
77
78
79
80foreach my $CompressClass ('IO::Compress::Gzip',
81 'IO::Compress::Deflate',
82 'IO::Compress::RawDeflate')
83{
84 next if $BadPerl ;
85
86
87 title "Testing $CompressClass";
88
89
90 my $x ;
91 my $gz = new $CompressClass(\$x);
92
93 my $buff ;
94
95 eval { getc($gz) } ;
96 like $@, mkErr("^getc Not Available: File opened only for output");
97
98 eval { read($gz, $buff, 1) } ;
99 like $@, mkErr("^read Not Available: File opened only for output");
100
101 eval { <$gz> } ;
102 like $@, mkErr("^readline Not Available: File opened only for output");
103
104}
105
106foreach my $CompressClass ('IO::Compress::Gzip',
107 'IO::Compress::Deflate',
108 'IO::Compress::RawDeflate')
109{
110 next if $BadPerl;
111 $UncompressClass = getInverse($CompressClass);
112
113 title "Testing $UncompressClass";
114
115 my $gc ;
116 my $guz = new $CompressClass(\$gc);
117 $guz->write("abc") ;
118 $guz->close();
119
120 my $x ;
121 my $gz = new $UncompressClass(\$gc);
122
123 my $buff ;
124
125 eval { print $gz "abc" } ;
126 like $@, mkErr("^print Not Available: File opened only for intput");
127
128 eval { printf $gz "fmt", "abc" } ;
129 like $@, mkErr("^printf Not Available: File opened only for intput");
130
131 #eval { write($gz, $buff, 1) } ;
132 #like $@, mkErr("^write Not Available: File opened only for intput");
133
134}
135
136foreach my $CompressClass ('IO::Compress::Gzip',
137 'IO::Compress::Deflate',
138 'IO::Compress::RawDeflate')
139{
140 $UncompressClass = getInverse($CompressClass);
141
142 title "Testing $CompressClass and $UncompressClass";
143
144
145 {
146 # Write
147 # these tests come almost 100% from IO::String
148
149 my $name = "test.gz" ;
150 my $lex = new LexFile $name ;
151
152 my $io = $CompressClass->new($name);
153
154 is $io->tell(), 0 ;
155
156 my $heisan = "Heisan\n";
157 print $io $heisan ;
158
159 ok ! $io->eof;
160
161 is $io->tell(), length($heisan) ;
162
163 print($io "a", "b", "c");
164
165 {
166 local($\) = "\n";
167 print $io "d", "e";
168 local($,) = ",";
169 print $io "f", "g", "h";
170 }
171
172 my $foo = "1234567890";
173
174 ok syswrite($io, $foo, length($foo)) == length($foo) ;
175 if ( $[ < 5.6 )
176 { is $io->syswrite($foo, length $foo), length $foo }
177 else
178 { is $io->syswrite($foo), length $foo }
179 ok $io->syswrite($foo, length($foo)) == length $foo;
180 ok $io->write($foo, length($foo), 5) == 5;
181 ok $io->write("xxx\n", 100, -1) == 1;
182
183 for (1..3) {
184 printf $io "i(%d)", $_;
185 $io->printf("[%d]\n", $_);
186 }
187 select $io;
188 print "\n";
189 select STDOUT;
190
191 close $io ;
192
193 ok $io->eof;
194
195 is myGZreadFile($name), "Heisan\nabcde\nf,g,h\n" .
196 ("1234567890" x 3) . "67890\n" .
197 "i(1)[1]\ni(2)[2]\ni(3)[3]\n\n";
198
199
200 }
201
202 {
203 # Read
204 my $str = <<EOT;
205This is an example
206of a paragraph
207
208
209and a single line.
210
211EOT
212
213 my $name = "test.gz" ;
214 my $lex = new LexFile $name ;
215
216 my $iow = new $CompressClass $name ;
217 print $iow $str ;
218 close $iow;
219
220 my @tmp;
221 my $buf;
222 {
223 my $io = new $UncompressClass $name ;
224
225 ok ! $io->eof;
226 is $io->tell(), 0 ;
227 my @lines = <$io>;
228 is @lines, 6
229 or print "# Got " . scalar(@lines) . " lines, expected 6\n" ;
230 is $lines[1], "of a paragraph\n" ;
231 is join('', @lines), $str ;
232 is $., 6;
233 is $io->tell(), length($str) ;
234
235 ok $io->eof;
236
237 ok ! ( defined($io->getline) ||
238 (@tmp = $io->getlines) ||
239 defined(<$io>) ||
240 defined($io->getc) ||
241 read($io, $buf, 100) != 0) ;
242 }
243
244
245 {
246 local $/; # slurp mode
247 my $io = $UncompressClass->new($name);
248 ok !$io->eof;
249 my @lines = $io->getlines;
250 ok $io->eof;
251 ok @lines == 1 && $lines[0] eq $str;
252
253 $io = $UncompressClass->new($name);
254 ok ! $io->eof;
255 my $line = <$io>;
256 ok $line eq $str;
257 ok $io->eof;
258 }
259
260 {
261 local $/ = ""; # paragraph mode
262 my $io = $UncompressClass->new($name);
263 ok ! $io->eof;
264 my @lines = <$io>;
265 ok $io->eof;
266 ok @lines == 2
267 or print "# Got " . scalar(@lines) . " lines, expected 2\n" ;
268 ok $lines[0] eq "This is an example\nof a paragraph\n\n\n"
269 or print "# $lines[0]\n";
270 ok $lines[1] eq "and a single line.\n\n";
271 }
272
273 {
274 local $/ = "is";
275 my $io = $UncompressClass->new($name);
276 my @lines = ();
277 my $no = 0;
278 my $err = 0;
279 ok ! $io->eof;
280 while (<$io>) {
281 push(@lines, $_);
282 $err++ if $. != ++$no;
283 }
284
285 ok $err == 0 ;
286 ok $io->eof;
287
288 ok @lines == 3
289 or print "# Got " . scalar(@lines) . " lines, expected 3\n" ;
290 ok join("-", @lines) eq
291 "This- is- an example\n" .
292 "of a paragraph\n\n\n" .
293 "and a single line.\n\n";
294 }
295
296
297 # Test read
298
299 {
300 my $io = $UncompressClass->new($name);
301
302
303 if (! $BadPerl) {
304 eval { read($io, $buf, -1) } ;
305 like $@, mkErr("length parameter is negative");
306 }
307
308 is read($io, $buf, 0), 0, "Requested 0 bytes" ;
309
310 ok read($io, $buf, 3) == 3 ;
311 ok $buf eq "Thi";
312
313 ok sysread($io, $buf, 3, 2) == 3 ;
314 ok $buf eq "Ths i"
315 or print "# [$buf]\n" ;;
316 ok ! $io->eof;
317
318 # $io->seek(-4, 2);
319 #
320 # ok ! $io->eof;
321 #
322 # ok read($io, $buf, 20) == 4 ;
323 # ok $buf eq "e.\n\n";
324 #
325 # ok read($io, $buf, 20) == 0 ;
326 # ok $buf eq "";
327 #
328 # ok ! $io->eof;
329 }
330
331 }
332
333 {
334 # Read from non-compressed file
335
336 my $str = <<EOT;
337This is an example
338of a paragraph
339
340
341and a single line.
342
343EOT
344
345 my $name = "test.gz" ;
346 my $lex = new LexFile $name ;
347
348 writeFile($name, $str);
349 my @tmp;
350 my $buf;
351 {
352 my $io = new $UncompressClass $name, -Transparent => 1 ;
353
354 ok defined $io;
355 ok ! $io->eof;
356 ok $io->tell() == 0 ;
357 my @lines = <$io>;
358 ok @lines == 6;
359 ok $lines[1] eq "of a paragraph\n" ;
360 ok join('', @lines) eq $str ;
361 ok $. == 6;
362 ok $io->tell() == length($str) ;
363
364 ok $io->eof;
365
366 ok ! ( defined($io->getline) ||
367 (@tmp = $io->getlines) ||
368 defined(<$io>) ||
369 defined($io->getc) ||
370 read($io, $buf, 100) != 0) ;
371 }
372
373
374 {
375 local $/; # slurp mode
376 my $io = $UncompressClass->new($name);
377 ok ! $io->eof;
378 my @lines = $io->getlines;
379 ok $io->eof;
380 ok @lines == 1 && $lines[0] eq $str;
381
382 $io = $UncompressClass->new($name);
383 ok ! $io->eof;
384 my $line = <$io>;
385 ok $line eq $str;
386 ok $io->eof;
387 }
388
389 {
390 local $/ = ""; # paragraph mode
391 my $io = $UncompressClass->new($name);
392 ok ! $io->eof;
393 my @lines = <$io>;
394 ok $io->eof;
395 ok @lines == 2
396 or print "# exected 2 lines, got " . scalar(@lines) . "\n";
397 ok $lines[0] eq "This is an example\nof a paragraph\n\n\n"
398 or print "# [$lines[0]]\n" ;
399 ok $lines[1] eq "and a single line.\n\n";
400 }
401
402 {
403 local $/ = "is";
404 my $io = $UncompressClass->new($name);
405 my @lines = ();
406 my $no = 0;
407 my $err = 0;
408 ok ! $io->eof;
409 while (<$io>) {
410 push(@lines, $_);
411 $err++ if $. != ++$no;
412 }
413
414 ok $err == 0 ;
415 ok $io->eof;
416
417 ok @lines == 3 ;
418 ok join("-", @lines) eq
419 "This- is- an example\n" .
420 "of a paragraph\n\n\n" .
421 "and a single line.\n\n";
422 }
423
424
425 # Test read
426
427 {
428 my $io = $UncompressClass->new($name);
429
430 ok read($io, $buf, 3) == 3 ;
431 ok $buf eq "Thi";
432
433 ok sysread($io, $buf, 3, 2) == 3 ;
434 ok $buf eq "Ths i";
435 ok ! $io->eof;
436
437 # $io->seek(-4, 2);
438 #
439 # ok ! $io->eof;
440 #
441 # ok read($io, $buf, 20) == 4 ;
442 # ok $buf eq "e.\n\n";
443 #
444 # ok read($io, $buf, 20) == 0 ;
445 # ok $buf eq "";
446 #
447 # ok ! $io->eof;
448 }
449
450
451 }
452
453 {
454 # Vary the length parameter in a read
455
456 my $str = <<EOT;
457x
458x
459This is an example
460of a paragraph
461
462
463and a single line.
464
465EOT
466 $str = $str x 100 ;
467
468
469 foreach my $bufsize (1, 3, 512, 4096, length($str)-1, length($str), length($str)+1)
470 {
471 foreach my $trans (0, 1)
472 {
473 foreach my $append (0, 1)
474 {
475 title "Read Tests - buf length $bufsize, Transparent $trans, Append $append" ;
476
477 my $name = "testz.gz" ;
478 my $lex = new LexFile $name ;
479
480 if ($trans) {
481 writeFile($name, $str) ;
482 }
483 else {
484 my $iow = new $CompressClass $name ;
485 print $iow $str ;
486 close $iow;
487 }
488
489
490 my $io = $UncompressClass->new($name,
491 -Append => $append,
492 -Transparent => $trans);
493
494 my $buf;
495
496 is $io->tell(), 0;
497
498 if ($append) {
499 1 while $io->read($buf, $bufsize) > 0;
500 }
501 else {
502 my $tmp ;
503 $buf .= $tmp while $io->read($tmp, $bufsize) > 0 ;
504 }
505 is length $buf, length $str;
506 ok $buf eq $str ;
507 ok ! $io->error() ;
508 ok $io->eof;
509 }
510 }
511 }
512 }
513
514}