|
Packit |
0bf95d |
#!/usr/bin/perl
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
use strict;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
BEGIN {
|
|
Packit |
0bf95d |
$| = 1;
|
|
Packit |
0bf95d |
$^W = 1;
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
use Test::More tests => 6;
|
|
Packit |
0bf95d |
use File::Spec ();
|
|
Packit |
0bf95d |
use File::Spec::Unix ();
|
|
Packit |
0bf95d |
use Archive::Zip qw( :ERROR_CODES );
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
my $expected_fn =
|
|
Packit |
0bf95d |
File::Spec->catfile(File::Spec->curdir, "t", "badjpeg", "expected.jpg");
|
|
Packit |
0bf95d |
my $expected_zip =
|
|
Packit |
0bf95d |
File::Spec::Unix->catfile(File::Spec::Unix->curdir, "t", "badjpeg",
|
|
Packit |
0bf95d |
"expected.jpg",);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
my $got_fn = "got.jpg";
|
|
Packit |
0bf95d |
my $archive_fn = "out.zip";
|
|
Packit |
0bf95d |
my ($before, $after);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
sub slurp_file {
|
|
Packit |
0bf95d |
my $filename = shift;
|
|
Packit |
0bf95d |
open my $fh, "<$filename"
|
|
Packit |
0bf95d |
or die 'Can not open file';
|
|
Packit |
0bf95d |
my $contents;
|
|
Packit |
0bf95d |
binmode($fh);
|
|
Packit |
0bf95d |
SCOPE: {
|
|
Packit |
0bf95d |
local $/;
|
|
Packit |
0bf95d |
$contents = <$fh>;
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
close $fh;
|
|
Packit |
0bf95d |
return $contents;
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
sub binary_is {
|
|
Packit |
0bf95d |
my ($got, $expected, $msg) = @_;
|
|
Packit |
0bf95d |
local $Test::Builder::Level = $Test::Builder::Level + 1;
|
|
Packit |
0bf95d |
my $verdict = ($got eq $expected);
|
|
Packit |
0bf95d |
ok($verdict, $msg);
|
|
Packit |
0bf95d |
if (!$verdict) {
|
|
Packit |
0bf95d |
my $len;
|
|
Packit |
0bf95d |
if (length($got) > length($expected)) {
|
|
Packit |
0bf95d |
$len = length($expected);
|
|
Packit |
0bf95d |
diag("got is longer than expected");
|
|
Packit |
0bf95d |
} elsif (length($got) < length($expected)) {
|
|
Packit |
0bf95d |
$len = length($got);
|
|
Packit |
0bf95d |
diag("expected is longer than got");
|
|
Packit |
0bf95d |
} else {
|
|
Packit |
0bf95d |
$len = length($got);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
BYTE_LOOP:
|
|
Packit |
0bf95d |
for my $byte_idx (0 .. ($len - 1)) {
|
|
Packit |
0bf95d |
my $got_byte = substr($got, $byte_idx, 1);
|
|
Packit |
0bf95d |
my $expected_byte = substr($expected, $byte_idx, 1);
|
|
Packit |
0bf95d |
if ($got_byte ne $expected_byte) {
|
|
Packit |
0bf95d |
diag(
|
|
Packit |
0bf95d |
sprintf(
|
|
Packit |
0bf95d |
"Byte %i differ: got == 0x%.2x, expected == 0x%.2x",
|
|
Packit |
0bf95d |
$byte_idx, ord($got_byte), ord($expected_byte)));
|
|
Packit |
0bf95d |
last BYTE_LOOP;
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
sub run_tests {
|
|
Packit |
0bf95d |
my $id = shift;
|
|
Packit |
0bf95d |
my $msg_it = sub {
|
|
Packit |
0bf95d |
my $msg_raw = shift;
|
|
Packit |
0bf95d |
return "$id - $msg_raw";
|
|
Packit |
0bf95d |
};
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Read the contents of the good file into the variable.
|
|
Packit |
0bf95d |
$before = slurp_file($expected_fn);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Zip the file.
|
|
Packit |
0bf95d |
SCOPE: {
|
|
Packit |
0bf95d |
my $zip = Archive::Zip->new();
|
|
Packit |
0bf95d |
$zip->addFile($expected_fn);
|
|
Packit |
0bf95d |
$zip->extractMember($expected_zip, $got_fn);
|
|
Packit |
0bf95d |
$after = slurp_file($got_fn);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
unlink $got_fn;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# TEST:$n=$n+1
|
|
Packit |
0bf95d |
binary_is($after, $before,
|
|
Packit |
0bf95d |
$msg_it->("Content of file after extraction"),
|
|
Packit |
0bf95d |
);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
my $status = $zip->writeToFileNamed($archive_fn);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# TEST:$n=$n+1
|
|
Packit |
0bf95d |
cmp_ok($status, '==', AZ_OK, $msg_it->('Zip was written fine'));
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Read back the file from the archive.
|
|
Packit |
0bf95d |
SCOPE: {
|
|
Packit |
0bf95d |
my $zip2;
|
|
Packit |
0bf95d |
$zip2 = Archive::Zip->new($archive_fn);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
$zip2->extractMember($expected_zip, $got_fn);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
$after = slurp_file($got_fn);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
unlink $got_fn;
|
|
Packit |
0bf95d |
unlink $archive_fn;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# TEST:$n=$n+1
|
|
Packit |
0bf95d |
binary_is($after, $before,
|
|
Packit |
0bf95d |
$msg_it->('Read back the file from the archive'),
|
|
Packit |
0bf95d |
);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Run the tests once with $\ undef.
|
|
Packit |
0bf95d |
run_tests("Normal");
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Run them once while setting $\.
|
|
Packit |
0bf95d |
SCOPE: {
|
|
Packit |
0bf95d |
local $\ = "\n";
|
|
Packit |
0bf95d |
run_tests(q{$\ is \n});
|
|
Packit |
0bf95d |
}
|