1#!perl -w 2 3BEGIN { 4 unshift @INC, 't/compat' if $] < 5.006002; 5}; 6 7use strict; 8use Test::More; 9use Storable qw(store nstore); 10use Config qw(%Config); 11 12# The @tests array below was create by the following program 13my $dummy = <<'EOT'; 14use Storable; 15use Data::Dump qw(dump); 16 17print "my \@tests = (\n"; 18for my $f (<data_*>) { 19 print " [\n"; 20 print " " . dump(substr(`cat $f`, 0, 32) . "...") , ",\n"; 21 22 my $x = dump(Storable::file_magic($f)); 23 $x =~ s/^/ /gm; 24 print "$x,\n"; 25 26 print " ],\n"; 27} 28print ");\n"; 29EOT 30 31my @tests = ( 32 [ 33 "perl-store\x041234\4\4\4\xD4\xC2\32\b\3\13\0\0\0v\b\xC5\32\b...", 34 { 35 byteorder => 1234, 36 file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.1.le32", 37 hdrsize => 18, 38 intsize => 4, 39 longsize => 4, 40 netorder => 0, 41 ptrsize => 4, 42 version => -1, 43 version_nv => -1, 44 }, 45 ], 46 [ 47 "perl-store\0\x041234\4\4\4\x8Co\34\b\3\13\0\0\0v\x94v\34...", 48 { 49 byteorder => 1234, 50 file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.4_07.le32", 51 hdrsize => 19, 52 intsize => 4, 53 longsize => 4, 54 major => 0, 55 netorder => 0, 56 ptrsize => 4, 57 version => 0, 58 version_nv => 0, 59 }, 60 ], 61 [ 62 "perl-store\1\x8Co\34\b\3\0\0\0\13v\x94v\34\b\1\0\0\4\0\0\0...", 63 { 64 file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.4_07.neutral", 65 hdrsize => 11, 66 major => 0, 67 netorder => 1, 68 version => 0, 69 version_nv => 0, 70 }, 71 ], 72 [ 73 "pst0\2\x041234\4\4\4\3\13\0\0\0\1\0\4\0\0\0\0\0\0\0\0\0\0\0...", 74 { 75 byteorder => 1234, 76 file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.604.le32", 77 hdrsize => 13, 78 intsize => 4, 79 longsize => 4, 80 major => 1, 81 netorder => 0, 82 ptrsize => 4, 83 version => 1, 84 version_nv => 1, 85 }, 86 ], 87 [ 88 "pst0\3\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 89 { 90 file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.604.neutral", 91 hdrsize => 5, 92 major => 1, 93 netorder => 1, 94 version => 1, 95 version_nv => 1, 96 }, 97 ], 98 [ 99 "pst0\4\0\x041234\4\4\4\3\13\0\0\0\1\0\4\0\0\0\0\0\0\0\0\0\0...", 100 { 101 byteorder => 1234, 102 file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.700.le32", 103 hdrsize => 14, 104 intsize => 4, 105 longsize => 4, 106 major => 2, 107 minor => 0, 108 netorder => 0, 109 ptrsize => 4, 110 version => "2.0", 111 version_nv => "2.000", 112 }, 113 ], 114 [ 115 "pst0\5\0\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 116 { 117 file => "data_perl-5.006001_i686-linux-thread-multi_Storable-0.700.neutral", 118 hdrsize => 6, 119 major => 2, 120 minor => 0, 121 netorder => 1, 122 version => "2.0", 123 version_nv => "2.000", 124 }, 125 ], 126 [ 127 "pst0\4\4\x041234\4\4\4\x08\3\13\0\0\0\1\0\4\0\0\0\0\0\0\0\0\0...", 128 { 129 byteorder => 1234, 130 file => "data_perl-5.006001_i686-linux-thread-multi_Storable-1.012.le32", 131 hdrsize => 15, 132 intsize => 4, 133 longsize => 4, 134 major => 2, 135 minor => 4, 136 netorder => 0, 137 nvsize => 8, 138 ptrsize => 4, 139 version => "2.4", 140 version_nv => "2.004", 141 }, 142 ], 143 [ 144 "pst0\4\3\x044321\4\4\4\x08\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0...", 145 { 146 byteorder => 4321, 147 file => "data_perl-5.006001_IA64.ARCHREV_0-thread-multi_Storable-1.006.be32", 148 hdrsize => 15, 149 intsize => 4, 150 longsize => 4, 151 major => 2, 152 minor => 3, 153 netorder => 0, 154 nvsize => 8, 155 ptrsize => 4, 156 version => "2.3", 157 version_nv => "2.003", 158 }, 159 ], 160 [ 161 "pst0\5\3\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 162 { 163 file => "data_perl-5.006001_IA64.ARCHREV_0-thread-multi_Storable-1.006.neutral", 164 hdrsize => 6, 165 major => 2, 166 minor => 3, 167 netorder => 1, 168 version => "2.3", 169 version_nv => "2.003", 170 }, 171 ], 172 [ 173 "pst0\4\4\x044321\4\4\4\x08\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0...", 174 { 175 byteorder => 4321, 176 file => "data_perl-5.006001_IA64.ARCHREV_0-thread-multi_Storable-1.012.be32", 177 hdrsize => 15, 178 intsize => 4, 179 longsize => 4, 180 major => 2, 181 minor => 4, 182 netorder => 0, 183 nvsize => 8, 184 ptrsize => 4, 185 version => "2.4", 186 version_nv => "2.004", 187 }, 188 ], 189 [ 190 "pst0\5\4\3\0\0\0\13\1\0\0\4\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0...", 191 { 192 file => "data_perl-5.006001_IA64.ARCHREV_0-thread-multi_Storable-1.012.neutral", 193 hdrsize => 6, 194 major => 2, 195 minor => 4, 196 netorder => 1, 197 version => "2.4", 198 version_nv => "2.004", 199 }, 200 ], 201 [ 202 "pst0\4\6\x044321\4\4\4\x08\3\0\0\0\13\n\n4294967296...", 203 { 204 byteorder => 4321, 205 file => "data_perl-5.008001_darwin-thread-multi-2level_Storable-2.08.be32", 206 hdrsize => 15, 207 intsize => 4, 208 longsize => 4, 209 major => 2, 210 minor => 6, 211 netorder => 0, 212 nvsize => 8, 213 ptrsize => 4, 214 version => "2.6", 215 version_nv => "2.006", 216 }, 217 ], 218 [ 219 "pst0\5\6\3\0\0\0\13\n\n4294967296\0\0\0\bfour_...", 220 { 221 file => "data_perl-5.008001_darwin-thread-multi-2level_Storable-2.08.neutral", 222 hdrsize => 6, 223 major => 2, 224 minor => 6, 225 netorder => 1, 226 version => "2.6", 227 version_nv => "2.006", 228 }, 229 ], 230 [ 231 "pst0\4\6\x044321\4\4\4\x08\3\0\0\0\13\4\3\0\0\0\0\0\0\0\nem...", 232 { 233 byteorder => 4321, 234 file => "data_perl-5.008003_PA-RISC1.1-thread-multi_Storable-2.09.be32", 235 hdrsize => 15, 236 intsize => 4, 237 longsize => 4, 238 major => 2, 239 minor => 6, 240 netorder => 0, 241 nvsize => 8, 242 ptrsize => 4, 243 version => "2.6", 244 version_nv => "2.006", 245 }, 246 ], 247 [ 248 "pst0\5\6\3\0\0\0\13\4\3\0\0\0\0\0\0\0\nempty_hash\n...", 249 { 250 file => "data_perl-5.008003_PA-RISC1.1-thread-multi_Storable-2.09.neutral", 251 hdrsize => 6, 252 major => 2, 253 minor => 6, 254 netorder => 1, 255 version => "2.6", 256 version_nv => "2.006", 257 }, 258 ], 259 [ 260 "pst0\4\6\x0812345678\4\4\4\x08\3\13\0\0\0\4\3\0\0\0\0\n\0...", 261 { 262 byteorder => 12_345_678, 263 file => "data_perl-5.008004_i86pc-solaris-64int_Storable-2.12.le64", 264 hdrsize => 19, 265 intsize => 4, 266 longsize => 4, 267 major => 2, 268 minor => 6, 269 netorder => 0, 270 nvsize => 8, 271 ptrsize => 4, 272 version => "2.6", 273 version_nv => "2.006", 274 }, 275 ], 276 [ 277 "pst0\4\6\x041234\4\4\4\x08\3\13\0\0\0\4\3\0\0\0\0\n\0\0\0em...", 278 { 279 byteorder => 1234, 280 file => "data_perl-5.008006_i686-linux-thread-multi_Storable-2.13.le32", 281 hdrsize => 15, 282 intsize => 4, 283 longsize => 4, 284 major => 2, 285 minor => 6, 286 netorder => 0, 287 nvsize => 8, 288 ptrsize => 4, 289 version => "2.6", 290 version_nv => "2.006", 291 }, 292 ], 293 [ 294 "pst0\4\6\x0887654321\4\x08\x08\x08\3\0\0\0\13\4\3\0\0\0\0\0\0...", 295 { 296 byteorder => 87_654_321, 297 file => "data_perl-5.008007_IA64.ARCHREV_0-thread-multi-LP64_Storable-2.13.be64", 298 hdrsize => 19, 299 intsize => 4, 300 longsize => 8, 301 major => 2, 302 minor => 6, 303 netorder => 0, 304 nvsize => 8, 305 ptrsize => 8, 306 version => "2.6", 307 version_nv => "2.006", 308 }, 309 ], 310 [ 311 "pst0\4\x07\x0812345678\4\x08\x08\x08\3\13\0\0\0\4\3\0\0\0\0\n\0...", 312 { 313 byteorder => 12_345_678, 314 file => "data_perl-5.008007_x86-solaris-thread-multi-64_Storable-2.15.le64", 315 hdrsize => 19, 316 intsize => 4, 317 longsize => 8, 318 major => 2, 319 minor => 7, 320 netorder => 0, 321 nvsize => 8, 322 ptrsize => 8, 323 version => "2.7", 324 version_nv => "2.007", 325 }, 326 ], 327 [ 328 "pst0\5\x07\3\0\0\0\13\4\3\0\0\0\0\0\0\0\nempty_hash\n...", 329 { 330 file => "data_perl-5.008007_x86-solaris-thread-multi-64_Storable-2.15.neutral", 331 hdrsize => 6, 332 major => 2, 333 minor => 7, 334 netorder => 1, 335 version => "2.7", 336 version_nv => "2.007", 337 }, 338 ], 339 [ 340 "pst0\4\5\x041234\4\4\4\x08\3\13\0\0\0\4\3\0\0\0\0\n\0\0\0em...", 341 { 342 byteorder => 1234, 343 file => "data_perl-5.008_i686-linux-thread-multi_Storable-2.04.le32", 344 hdrsize => 15, 345 intsize => 4, 346 longsize => 4, 347 major => 2, 348 minor => 5, 349 netorder => 0, 350 nvsize => 8, 351 ptrsize => 4, 352 version => "2.5", 353 version_nv => "2.005", 354 }, 355 ], 356 [ 357 "pst0\5\5\3\0\0\0\13\4\3\0\0\0\0\0\0\0\nempty_hash\n...", 358 { 359 file => "data_perl-5.008_i686-linux-thread-multi_Storable-2.04.neutral", 360 hdrsize => 6, 361 major => 2, 362 minor => 5, 363 netorder => 1, 364 version => "2.5", 365 version_nv => "2.005", 366 }, 367 ], 368 [ 369 "pst0\4\x07\x041234\4\4\4\x08\3\13\0\0\0\4\3\0\0\0\0\n\0\0\0em...", 370 { 371 byteorder => 1234, 372 file => "data_perl-5.009003_i686-linux_Storable-2.15.le32", 373 hdrsize => 15, 374 intsize => 4, 375 longsize => 4, 376 major => 2, 377 minor => 7, 378 netorder => 0, 379 nvsize => 8, 380 ptrsize => 4, 381 version => "2.7", 382 version_nv => "2.007", 383 }, 384 ], 385); 386 387plan tests => 31 + 2 * @tests; 388 389my $file = "xx-$$.pst"; 390 391is(eval { Storable::file_magic($file) }, undef, "empty file give undef"); 392like($@, qq{/^Can't open '\Q$file\E':/}, "...and croaks"); 393is(Storable::file_magic(__FILE__), undef, "not an image"); 394 395store({}, $file); 396{ 397 my $info = Storable::file_magic($file); 398 unlink($file); 399 ok($info, "got info"); 400 is($info->{file}, $file, "file set"); 401 is($info->{hdrsize}, 11 + length($Config{byteorder}), "hdrsize"); 402 like($info->{version}, q{/^2\.\d+$/}, "sane version"); 403 is($info->{version_nv}, Storable::BIN_WRITE_VERSION_NV, "version_nv match"); 404 is($info->{major}, 2, "sane major"); 405 ok($info->{minor}, "have minor"); 406 ok($info->{minor} >= Storable::BIN_WRITE_MINOR, "large enough minor"); 407 408 ok(!$info->{netorder}, "no netorder"); 409 410 my %attrs = ( 411 nvsize => 5.006, 412 ptrsize => 5.005, 413 map {$_ => 5.004} qw(byteorder intsize longsize) 414 ); 415 for my $attr (keys %attrs) { 416 SKIP: { 417 skip "attribute $attr not available on this version of Perl", 1 if $attrs{$attr} > $]; 418 is($info->{$attr}, $Config{$attr}, "$attr match Config"); 419 } 420 } 421} 422 423nstore({}, $file); 424{ 425 my $info = Storable::file_magic($file); 426 unlink($file); 427 ok($info, "got info"); 428 is($info->{file}, $file, "file set"); 429 is($info->{hdrsize}, 6, "hdrsize"); 430 like($info->{version}, q{/^2\.\d+$/}, "sane version"); 431 is($info->{version_nv}, Storable::BIN_WRITE_VERSION_NV, "version_nv match"); 432 is($info->{major}, 2, "sane major"); 433 ok($info->{minor}, "have minor"); 434 ok($info->{minor} >= Storable::BIN_WRITE_MINOR, "large enough minor"); 435 436 ok($info->{netorder}, "no netorder"); 437 for (qw(byteorder intsize longsize ptrsize nvsize)) { 438 ok(!exists $info->{$_}, "no $_"); 439 } 440} 441 442for my $test (@tests) { 443 my($data, $expected) = @$test; 444 open(FH, '>', $file) || die "Can't create $file: $!"; 445 binmode(FH); 446 print FH $data; 447 close(FH) || die "Can't write $file: $!"; 448 449 my $name = $expected->{file}; 450 $expected->{file} = $file; 451 452 my $info = Storable::file_magic($file); 453 unlink($file); 454 455 is_deeply($info, $expected, "file_magic $name"); 456 457 $expected->{file} = 1; 458 is_deeply(Storable::read_magic($data), $expected, "read magic $name"); 459} 460