Avoid possible dereference of NULL in the initialization of PL_origalen.
[p5sagit/p5-mst-13.2.git] / ext / Compress / Zlib / t / 22merge.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
16our ($extra);
17use Compress::Zlib 2 ;
18
19use IO::Compress::Gzip qw($GzipError);
20use IO::Uncompress::Gunzip qw($GunzipError);
21
22use IO::Compress::Deflate qw($DeflateError);
23use IO::Uncompress::Inflate qw($InflateError);
24
25use IO::Compress::RawDeflate qw($RawDeflateError);
26use IO::Uncompress::RawInflate qw($RawInflateError);
27
28
29BEGIN
30{
31 plan(skip_all => "Merge needs Zlib 1.2.1 or better - you have Zlib "
32 . Compress::Zlib::zlib_version())
33 if ZLIB_VERNUM() < 0x1210 ;
34
35 # use Test::NoWarnings, if available
36 $extra = 0 ;
37 $extra = 1
38 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
39
40 plan tests => 490 + $extra ;
41
42}
43
44
45# Check zlib_version and ZLIB_VERSION are the same.
46is Compress::Zlib::zlib_version, ZLIB_VERSION,
47 "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
48
49# Tests
50# destination is a file that doesn't exist -- should work ok unless AnyDeflate
51# destination isn't compressed at all
52# destination is compressed but wrong format
53# destination is corrupt - error messages should be correct
54# use apend mode with old zlib - check that this is trapped
55# destination is not seekable, readable, writable - test for filename & handle
56
57{
58 title "Misc error cases";
59
60 eval { new Compress::Zlib::InflateScan Bufsize => 0} ;
61 like $@, mkErr("^Compress::Zlib::InflateScan::new: Bufsize must be >= 1, you specified 0"), " catch bufsize == 0";
62
63 eval { Compress::Zlib::inflateScanStream::createDeflateStream(undef, Bufsize => 0) } ;
64 like $@, mkErr("^Compress::Zlib::InflateScan::createDeflateStream: Bufsize must be >= 1, you specified 0"), " catch bufsize == 0";
65
66}
67
68# output file/handle not writable
69foreach my $CompressClass ( map { "IO::Compress::$_" } qw( Gzip RawDeflate Deflate) )
70{
71
72 my $Error = getErrorRef($CompressClass);
73
74 foreach my $to_file (0,1)
75 {
76 if ($to_file)
77 { title "$CompressClass - Merge to filename that isn't writable" }
78 else
79 { title "$CompressClass - Merge to filehandle that isn't writable" }
80
9f2e3514 81 my $lex = new LexFile my $out_file ;
642e522c 82
83 # create empty file
84 open F, ">$out_file" ; print F "x"; close F;
85 ok -e $out_file, " file exists" ;
86 ok !-z $out_file, " and is not empty" ;
87
88 # make unwritable
89 is chmod(0444, $out_file), 1, " chmod worked" ;
90 ok -e $out_file, " still exists after chmod" ;
91
92 SKIP:
93 {
94 skip "Cannot create non-writable file", 3
95 if -w $out_file ;
96
97 ok ! -w $out_file, " chmod made file unwritable" ;
98
99 my $dest ;
100 if ($to_file)
101 { $dest = $out_file }
102 else
103 { $dest = new IO::File "<$out_file" }
104
105 my $gz = $CompressClass->new($dest, Merge => 1) ;
106
107 ok ! $gz, " Did not create $CompressClass object";
108
109 {
110 if ($to_file) {
111 is $$Error, "Output file '$out_file' is not writable",
112 " Got non-writable filename message" ;
113 }
114 else {
115 is $$Error, "Output filehandle is not writable",
116 " Got non-writable filehandle message" ;
117 }
118 }
119 }
120
121 chmod 0777, $out_file ;
122 }
123}
124
125# output is not compressed at all
126foreach my $CompressClass ( map { "IO::Compress::$_" } qw( Gzip RawDeflate Deflate) )
127{
128
129 my $Error = getErrorRef($CompressClass);
130
9f2e3514 131 my $lex = new LexFile my $out_file ;
642e522c 132
133 foreach my $to_file ( qw(buffer file handle ) )
134 {
135 title "$CompressClass to $to_file, content is not compressed";
136
137 my $content = "abc" x 300 ;
138 my $buffer ;
139 my $disp_content = defined $content ? $content : '<undef>' ;
140 my $str_content = defined $content ? $content : '' ;
141
142 if ($to_file eq 'buffer')
143 {
144 $buffer = \$content ;
145 }
146 else
147 {
148 writeFile($out_file, $content);
149
150 if ($to_file eq 'handle')
151 {
152 $buffer = new IO::File "+<$out_file"
153 or die "# Cannot open $out_file: $!";
154 }
155 else
156 { $buffer = $out_file }
157 }
158
159 ok ! $CompressClass->new($buffer, Merge => 1), " constructor fails";
160 {
161 like $$Error, '/Cannot create InflateScan object: (Header Error|unexpected end of file)/', " got Bad Magic" ;
162 }
163
164 }
165}
166
167# output is empty
168foreach my $CompressClass ( map { "IO::Compress::$_" } qw( Gzip RawDeflate Deflate) )
169{
170
171 my $Error = getErrorRef($CompressClass);
172
9f2e3514 173 my $lex = new LexFile my $out_file ;
642e522c 174
175 foreach my $to_file ( qw(buffer file handle ) )
176 {
177 title "$CompressClass to $to_file, content is empty";
178
179 my $content = '';
180 my $buffer ;
181 my $dest ;
182
183 if ($to_file eq 'buffer')
184 {
185 $dest = $buffer = \$content ;
186 }
187 else
188 {
189 writeFile($out_file, $content);
190 $dest = $out_file;
191
192 if ($to_file eq 'handle')
193 {
194 $buffer = new IO::File "+<$out_file"
195 or die "# Cannot open $out_file: $!";
196 }
197 else
198 { $buffer = $out_file }
199 }
200
201 ok my $gz = $CompressClass->new($buffer, Merge => 1, AutoClose => 1), " constructor passes";
202
203 $gz->write("FGHI");
204 $gz->close();
205
206 #hexDump($buffer);
207 my $out = anyUncompress($dest);
208
209 is $out, "FGHI", ' Merge OK';
210 }
211}
212
213foreach my $CompressClass ( map { "IO::Compress::$_" } qw( Gzip RawDeflate Deflate) )
214{
215 my $Error = getErrorRef($CompressClass);
216
217 title "$CompressClass - Merge to file that doesn't exist";
218
9f2e3514 219 my $lex = new LexFile my $out_file ;
642e522c 220
221 ok ! -e $out_file, " Destination file, '$out_file', does not exist";
222
223 ok my $gz1 = $CompressClass->new($out_file, Merge => 1)
224 or die "# $CompressClass->new failed: $GzipError\n";
225 #hexDump($buffer);
226 $gz1->write("FGHI");
227 $gz1->close();
228
229 #hexDump($buffer);
230 my $out = anyUncompress($out_file);
231
232 is $out, "FGHI", ' Merged OK';
233}
234
235foreach my $CompressClass ( map { "IO::Compress::$_" } qw( Gzip RawDeflate Deflate) )
236{
237 my $Error = getErrorRef($CompressClass);
238
9f2e3514 239 my $lex = new LexFile my $out_file ;
642e522c 240
241 foreach my $to_file ( qw( buffer file handle ) )
242 {
243 foreach my $content (undef, '', 'x', 'abcde')
244 {
245 #next if ! defined $content && $to_file;
246
247 my $buffer ;
248 my $disp_content = defined $content ? $content : '<undef>' ;
249 my $str_content = defined $content ? $content : '' ;
250
251 if ($to_file eq 'buffer')
252 {
253 my $x ;
254 $buffer = \$x ;
255 title "$CompressClass to Buffer, content is '$disp_content'";
256 }
257 else
258 {
259 $buffer = $out_file ;
260 if ($to_file eq 'handle')
261 {
262 title "$CompressClass to Filehandle, content is '$disp_content'";
263 }
264 else
265 {
266 title "$CompressClass to File, content is '$disp_content'";
267 }
268 }
269
270 my $gz = $CompressClass->new($buffer);
271 my $len = defined $content ? length($content) : 0 ;
272 is $gz->write($content), $len, " write ok";
273 ok $gz->close(), " close ok";
274
275 #hexDump($buffer);
276 is anyUncompress($buffer), $str_content, ' Destination is ok';
277
278 #if ($corruption)
279 #{
280 # next if $TopTypes eq 'RawDeflate' && $content eq '';
281 #
282 #}
283
284 my $dest = $buffer ;
285 if ($to_file eq 'handle')
286 {
287 $dest = new IO::File "+<$buffer" ;
288 }
289
290 my $gz1 = $CompressClass->new($dest, Merge => 1, AutoClose => 1)
07a53161 291 or die "## Error is $$Error\n";
292
642e522c 293 #print "YYY\n";
294 #hexDump($buffer);
295 #print "XXX\n";
296 is $gz1->write("FGHI"), 4, " write returned 4";
297 ok $gz1->close(), " close ok";
298
299 #hexDump($buffer);
300 my $out = anyUncompress($buffer);
301
302 is $out, $str_content . "FGHI", ' Merged OK';
303 #exit;
304 }
305 }
306
307}
308
309
07a53161 310
642e522c 311foreach my $CompressClass ( map { "IO::Compress::$_" } qw( Gzip RawDeflate Deflate) )
312{
313 my $Error = getErrorRef($CompressClass);
314
315 my $Func = getTopFuncRef($CompressClass);
316 my $TopType = getTopFuncName($CompressClass);
317
318 my $buffer ;
319
9f2e3514 320 my $lex = new LexFile my $out_file ;
642e522c 321
322 foreach my $to_file (0, 1)
323 {
324 foreach my $content (undef, '', 'x', 'abcde')
325 {
326 my $disp_content = defined $content ? $content : '<undef>' ;
327 my $str_content = defined $content ? $content : '' ;
328 my $buffer ;
329 if ($to_file)
330 {
331 $buffer = $out_file ;
332 title "$TopType to File, content is '$disp_content'";
333 }
334 else
335 {
336 my $x = '';
337 $buffer = \$x ;
338 title "$TopType to Buffer, content is '$disp_content'";
339 }
340
341
342 ok $Func->(\$content, $buffer), " Compress content";
343 #hexDump($buffer);
344 is anyUncompress($buffer), $str_content, ' Destination is ok';
345
346
347 ok $Func->(\"FGHI", $buffer, Merge => 1), " Merge content";
348
349 #hexDump($buffer);
350 my $out = anyUncompress($buffer);
351
352 is $out, $str_content . "FGHI", ' Merged OK';
353 }
354 }
355
356}
357
358
359