Avoid possible dereference of NULL in the initialization of PL_origalen.
[p5sagit/p5-mst-13.2.git] / ext / Compress / Zlib / t / 11truncate.t
CommitLineData
16816334 1BEGIN {
d695c1a1 2 if ($ENV{PERL_CORE}) {
16816334 3 chdir 't' if -d 't';
0ecadccd 4 @INC = ("../lib", "lib");
16816334 5 }
6}
642e522c 7
8use lib 't';
9use strict;
10use warnings;
11use bytes;
12
13use Test::More ;
14use ZlibTestUtils;
15
16BEGIN {
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 plan tests => 2374 + $extra;
23
24 use_ok('Compress::Zlib', 2) ;
25
26 use_ok('IO::Compress::Gzip', qw($GzipError)) ;
27 use_ok('IO::Uncompress::Gunzip', qw($GunzipError)) ;
28
29 use_ok('IO::Compress::Deflate', qw($DeflateError)) ;
30 use_ok('IO::Uncompress::Inflate', qw($InflateError)) ;
31
32 use_ok('IO::Compress::RawDeflate', qw($RawDeflateError)) ;
33 use_ok('IO::Uncompress::RawInflate', qw($RawInflateError)) ;
34
35}
36
37
38my $hello = <<EOM ;
39hello world
40this is a test
41some more stuff on this line
42ad finally...
43EOM
44
45my $blocksize = 10 ;
46
47
48foreach my $CompressClass ('IO::Compress::Gzip', 'IO::Compress::Deflate')
49{
50 my $UncompressClass = getInverse($CompressClass);
51
52
53 my $compressed ;
54 my $cc ;
55 my $gz ;
56 if ($CompressClass eq 'IO::Compress::Gzip') {
57 ok( my $x = new IO::Compress::Gzip \$compressed,
58 -Name => "My name",
59 -Comment => "a comment",
60 -ExtraField => ['ab' => "extra"],
61 -HeaderCRC => 1);
62 ok $x->write($hello) ;
63 ok $x->close ;
64 $cc = $compressed ;
65
66 ok($gz = new IO::Uncompress::Gunzip \$cc,
67 -Transparent => 0)
68 or diag "$GunzipError";
69 my $un;
70 ok $gz->read($un) > 0 ;
71 ok $gz->close();
72 ok $un eq $hello ;
73 }
74 else {
75 ok( my $x = new $CompressClass(\$compressed));
76 ok $x->write($hello) ;
77 ok $x->close ;
78 $cc = $compressed ;
79
80 ok($gz = new $UncompressClass(\$cc,
81 -Transparent => 0))
82 or diag "$GunzipError";
83 my $un;
84 ok $gz->read($un) > 0 ;
85 ok $gz->close();
86 ok $un eq $hello ;
87 }
88
89
90 for my $trans ( 0 .. 1)
91 {
92 title "Testing $CompressClass, Transparent $trans";
93
94 my $info = $gz->getHeaderInfo() ;
95 my $header_size = $info->{HeaderLength};
96 my $trailer_size = $info->{TrailerLength};
97 ok 1, "Compressed size is " . length($compressed) ;
98 ok 1, "Header size is $header_size" ;
99 ok 1, "Trailer size is $trailer_size" ;
100
101 title "Fingerprint Truncation";
102 foreach my $i (1)
103 {
9f2e3514 104 my $lex = new LexFile my $name ;
642e522c 105
106 ok 1, "Length $i" ;
107 my $part = substr($compressed, 0, $i);
108 writeFile($name, $part);
109
110 my $gz = new $UncompressClass $name,
111 -BlockSize => $blocksize,
112 -Transparent => $trans;
113 if ($trans) {
114 ok $gz;
115 ok ! $gz->error() ;
116 my $buff ;
117 ok $gz->read($buff) == length($part) ;
118 ok $buff eq $part ;
119 ok $gz->eof() ;
120 $gz->close();
121 }
122 else {
123 ok !$gz;
124 }
125
126 }
127
128 title "Header Truncation";
129 #
130 # Any header corruption past the fingerprint is considered catastrophic
131 # so even if Transparent is set, it should still fail
132 #
133 foreach my $i (2 .. $header_size -1)
134 {
9f2e3514 135 my $lex = new LexFile my $name ;
642e522c 136
137 ok 1, "Length $i" ;
138 my $part = substr($compressed, 0, $i);
139 writeFile($name, $part);
140 ok ! defined new $UncompressClass $name,
141 -BlockSize => $blocksize,
142 -Transparent => $trans;
143 #ok $gz->eof() ;
144 }
145
146 title "Compressed Data Truncation";
147 foreach my $i ($header_size .. length($compressed) - 1 - $trailer_size)
148 {
149
9f2e3514 150 my $lex = new LexFile my $name ;
642e522c 151
152 ok 1, "Length $i" ;
153 my $part = substr($compressed, 0, $i);
154 writeFile($name, $part);
155 ok my $gz = new $UncompressClass $name,
156 -BlockSize => $blocksize,
157 -Transparent => $trans;
158 my $un ;
159 my $status = 0 ;
160 $status = $gz->read($un) while $status >= 0 ;
161 ok $status < 0 ;
162 ok $gz->eof() ;
163 ok $gz->error() ;
164 $gz->close();
165 }
166
167 # RawDeflate does not have a trailer
168 next if $CompressClass eq 'IO::Compress::RawDeflate' ;
169
170 title "Compressed Trailer Truncation";
171 foreach my $i (length($compressed) - $trailer_size .. length($compressed) -1 )
172 {
173 foreach my $lax (0, 1)
174 {
9f2e3514 175 my $lex = new LexFile my $name ;
642e522c 176
177 ok 1, "Length $i, Lax $lax" ;
178 my $part = substr($compressed, 0, $i);
179 writeFile($name, $part);
180 ok my $gz = new $UncompressClass $name,
181 -BlockSize => $blocksize,
182 -Strict => !$lax,
183 -Append => 1,
184 -Transparent => $trans;
185 my $un = '';
186 my $status = 1 ;
187 $status = $gz->read($un) while $status > 0 ;
188
189 if ($lax)
190 {
191 is $un, $hello;
192 is $status, 0
193 or diag "Status $status Error is " . $gz->error() ;
194 ok $gz->eof()
195 or diag "Status $status Error is " . $gz->error() ;
196 ok ! $gz->error() ;
197 }
198 else
199 {
200 ok $status < 0
201 or diag "Status $status Error is " . $gz->error() ;
202 ok $gz->eof()
203 or diag "Status $status Error is " . $gz->error() ;
204 ok $gz->error() ;
205 }
206
207 $gz->close();
208 }
209 }
210 }
211}
212
213
214foreach my $CompressClass ( 'IO::Compress::RawDeflate')
215{
216 my $UncompressClass = getInverse($CompressClass);
217 my $Error = getErrorRef($UncompressClass);
218
219 my $compressed ;
220 ok( my $x = new IO::Compress::RawDeflate \$compressed);
221 ok $x->write($hello) ;
222 ok $x->close ;
223
224
225 my $cc = $compressed ;
226
227 my $gz ;
228 ok($gz = new $UncompressClass(\$cc,
229 -Transparent => 0))
230 or diag "$$Error\n";
231 my $un;
232 ok $gz->read($un) > 0 ;
233 ok $gz->close();
234 ok $un eq $hello ;
235
236 for my $trans (0 .. 1)
237 {
238 title "Testing $CompressClass, Transparent = $trans";
239
240 my $info = $gz->getHeaderInfo() ;
241 my $header_size = $info->{HeaderLength};
242 my $trailer_size = $info->{TrailerLength};
243 ok 1, "Compressed size is " . length($compressed) ;
244 ok 1, "Header size is $header_size" ;
245 ok 1, "Trailer size is $trailer_size" ;
246
247
248 title "Compressed Data Truncation";
249 foreach my $i (0 .. $blocksize)
250 {
251
9f2e3514 252 my $lex = new LexFile my $name ;
642e522c 253
254 ok 1, "Length $i" ;
255 my $part = substr($compressed, 0, $i);
256 writeFile($name, $part);
257 my $gz = new $UncompressClass $name,
258 -BlockSize => $blocksize,
259 -Transparent => $trans;
260 if ($trans) {
261 ok $gz;
262 ok ! $gz->error() ;
263 my $buff = '';
264 ok $gz->read($buff) == length $part ;
265 ok $buff eq $part ;
266 ok $gz->eof() ;
267 $gz->close();
268 }
269 else {
270 ok !$gz;
271 }
272 }
273
274 foreach my $i ($blocksize+1 .. length($compressed)-1)
275 {
276
9f2e3514 277 my $lex = new LexFile my $name ;
642e522c 278
279 ok 1, "Length $i" ;
280 my $part = substr($compressed, 0, $i);
281 writeFile($name, $part);
282 ok my $gz = new $UncompressClass $name,
283 -BlockSize => $blocksize,
284 -Transparent => $trans;
285 my $un ;
286 my $status = 0 ;
287 $status = $gz->read($un) while $status >= 0 ;
288 ok $status < 0 ;
289 ok $gz->eof() ;
290 ok $gz->error() ;
291 $gz->close();
292 }
293 }
294
295}
296