|
Packit |
0bf95d |
#!/usr/bin/perl
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Main testing for Archive::Zip
|
|
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 Archive::Zip qw( :ERROR_CODES :CONSTANTS );
|
|
Packit |
0bf95d |
use FileHandle;
|
|
Packit |
0bf95d |
use File::Path;
|
|
Packit |
0bf95d |
use File::Spec;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
use Test::More tests => 141;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
use lib 't';
|
|
Packit |
0bf95d |
use common;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#####################################################################
|
|
Packit |
0bf95d |
# Testing Utility Functions
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- check CRC
|
|
Packit |
0bf95d |
is(TESTSTRINGCRC, 0xac373f32, 'Testing CRC matches expected');
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Bad times die
|
|
Packit |
0bf95d |
SCOPE: {
|
|
Packit |
0bf95d |
my @errors = ();
|
|
Packit |
0bf95d |
local $Archive::Zip::ErrorHandler = sub { push @errors, @_ };
|
|
Packit |
0bf95d |
eval { Archive::Zip::Member::_unixToDosTime(0) };
|
|
Packit |
0bf95d |
ok($errors[0] =~ /Tried to add member with zero or undef/,
|
|
Packit |
0bf95d |
'Got expected _unixToDosTime error');
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- check time conversion
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
foreach my $unix_time (
|
|
Packit |
0bf95d |
315576062, 315576064, 315580000, 315600000,
|
|
Packit |
0bf95d |
316000000, 320000000, 400000000, 500000000,
|
|
Packit |
0bf95d |
600000000, 700000000, 800000000, 900000000,
|
|
Packit |
0bf95d |
1000000000, 1100000000, 1200000000, int(time() / 2) * 2,
|
|
Packit |
0bf95d |
) {
|
|
Packit |
0bf95d |
my $dos_time = Archive::Zip::Member::_unixToDosTime($unix_time);
|
|
Packit |
0bf95d |
my $round_trip = Archive::Zip::Member::_dosToUnixTime($dos_time);
|
|
Packit |
0bf95d |
is($unix_time, $round_trip, 'Got expected DOS DateTime value');
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#####################################################################
|
|
Packit |
0bf95d |
# Testing Archives
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- empty file
|
|
Packit |
0bf95d |
# new # Archive::Zip
|
|
Packit |
0bf95d |
# new # Archive::Zip::Archive
|
|
Packit |
0bf95d |
my $zip = Archive::Zip->new();
|
|
Packit |
0bf95d |
isa_ok($zip, 'Archive::Zip');
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# members # Archive::Zip::Archive
|
|
Packit |
0bf95d |
my @members = $zip->members;
|
|
Packit |
0bf95d |
is(scalar(@members), 0, '->members is 0');
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# numberOfMembers # Archive::Zip::Archive
|
|
Packit |
0bf95d |
my $numberOfMembers = $zip->numberOfMembers();
|
|
Packit |
0bf95d |
is($numberOfMembers, 0, '->numberofMembers is 0');
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# writeToFileNamed # Archive::Zip::Archive
|
|
Packit |
0bf95d |
my $status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK, '->writeToFileNames ok');
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
my $zipout;
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
if ($^O eq 'MSWin32') {
|
|
Packit |
0bf95d |
print STDERR
|
|
Packit |
0bf95d |
"\n# You might see an expected 'zipfile is empty' warning now.\n";
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
skip("freebsd's unzip doesn't care about empty zips", 1)
|
|
Packit |
0bf95d |
if $^O eq 'freebsd';
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
ok($status != 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# unzip -t returns error code=1 for warning on empty
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- add a directory
|
|
Packit |
0bf95d |
my $memberName = TESTDIR . '/';
|
|
Packit |
0bf95d |
my $dirName = TESTDIR;
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# addDirectory # Archive::Zip::Archive
|
|
Packit |
0bf95d |
# new # Archive::Zip::Member
|
|
Packit |
0bf95d |
my $member = $zip->addDirectory($memberName);
|
|
Packit |
0bf95d |
ok(defined($member));
|
|
Packit |
0bf95d |
is($member->fileName(), $memberName);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# On some (Windows systems) the modification time is
|
|
Packit |
0bf95d |
# corrupted. Save this to check late.
|
|
Packit |
0bf95d |
my $dir_time = $member->lastModFileDateTime();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# members # Archive::Zip::Archive
|
|
Packit |
0bf95d |
@members = $zip->members();
|
|
Packit |
0bf95d |
is(scalar(@members), 1);
|
|
Packit |
0bf95d |
is($members[0], $member);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# numberOfMembers # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$numberOfMembers = $zip->numberOfMembers();
|
|
Packit |
0bf95d |
is($numberOfMembers, 1);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# writeToFileNamed # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Does the modification time get corrupted?
|
|
Packit |
0bf95d |
is(($zip->members)[0]->lastModFileDateTime(), $dir_time);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- extract the directory by name
|
|
Packit |
0bf95d |
rmtree([TESTDIR], 0, 0);
|
|
Packit |
0bf95d |
$status = $zip->extractMember($memberName);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
ok(-d $dirName);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- extract the directory by identity
|
|
Packit |
0bf95d |
ok(rmdir($dirName)); # it's still empty
|
|
Packit |
0bf95d |
$status = $zip->extractMember($member);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
ok(-d $dirName);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- add a string member, uncompressed
|
|
Packit |
0bf95d |
$memberName = TESTDIR . '/string.txt';
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# addString # Archive::Zip::Archive
|
|
Packit |
0bf95d |
# newFromString # Archive::Zip::Member
|
|
Packit |
0bf95d |
$member = $zip->addString(TESTSTRING, $memberName);
|
|
Packit |
0bf95d |
ok(defined($member));
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
is($member->fileName(), $memberName);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# members # Archive::Zip::Archive
|
|
Packit |
0bf95d |
@members = $zip->members();
|
|
Packit |
0bf95d |
is(scalar(@members), 2);
|
|
Packit |
0bf95d |
is($members[1], $member);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# numberOfMembers # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$numberOfMembers = $zip->numberOfMembers();
|
|
Packit |
0bf95d |
is($numberOfMembers, 2);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# writeToFileNamed # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
is($member->crc32(), TESTSTRINGCRC);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
is($member->crc32String(), sprintf("%08x", TESTSTRINGCRC));
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- extract it by name
|
|
Packit |
0bf95d |
$status = $zip->extractMember($memberName);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
ok(-f $memberName);
|
|
Packit |
0bf95d |
is(fileCRC($memberName), TESTSTRINGCRC);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- now compress it and re-test
|
|
Packit |
0bf95d |
my $oldCompressionMethod =
|
|
Packit |
0bf95d |
$member->desiredCompressionMethod(COMPRESSION_DEFLATED);
|
|
Packit |
0bf95d |
is($oldCompressionMethod, COMPRESSION_STORED, 'old compression method OK');
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# writeToFileNamed # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK, 'writeToFileNamed returns AZ_OK');
|
|
Packit |
0bf95d |
is($member->crc32(), TESTSTRINGCRC);
|
|
Packit |
0bf95d |
is($member->uncompressedSize(), TESTSTRINGLENGTH);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- extract it by name
|
|
Packit |
0bf95d |
$status = $zip->extractMember($memberName);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
ok(-f $memberName);
|
|
Packit |
0bf95d |
is(fileCRC($memberName), TESTSTRINGCRC);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- add a file member, compressed
|
|
Packit |
0bf95d |
ok(rename($memberName, TESTDIR . '/file.txt'));
|
|
Packit |
0bf95d |
$memberName = TESTDIR . '/file.txt';
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# addFile # Archive::Zip::Archive
|
|
Packit |
0bf95d |
# newFromFile # Archive::Zip::Member
|
|
Packit |
0bf95d |
$member = $zip->addFile($memberName);
|
|
Packit |
0bf95d |
ok(defined($member));
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
is($member->desiredCompressionMethod(), COMPRESSION_DEFLATED);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# writeToFileNamed # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
is($member->crc32(), TESTSTRINGCRC);
|
|
Packit |
0bf95d |
is($member->uncompressedSize(), TESTSTRINGLENGTH);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- extract it by name (note we have to rename it first
|
|
Packit |
0bf95d |
#--------- or we will clobber the original file
|
|
Packit |
0bf95d |
my $newName = $memberName;
|
|
Packit |
0bf95d |
$newName =~ s/\.txt/2.txt/;
|
|
Packit |
0bf95d |
$status = $zip->extractMember($memberName, $newName);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
ok(-f $newName);
|
|
Packit |
0bf95d |
is(fileCRC($newName), TESTSTRINGCRC);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- now make it uncompressed and re-test
|
|
Packit |
0bf95d |
$oldCompressionMethod = $member->desiredCompressionMethod(COMPRESSION_STORED);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
is($oldCompressionMethod, COMPRESSION_DEFLATED);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# writeToFileNamed # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
is($member->crc32(), TESTSTRINGCRC);
|
|
Packit |
0bf95d |
is($member->uncompressedSize(), TESTSTRINGLENGTH);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- extract it by name
|
|
Packit |
0bf95d |
$status = $zip->extractMember($memberName, $newName);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
ok(-f $newName);
|
|
Packit |
0bf95d |
is(fileCRC($newName), TESTSTRINGCRC);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Now, the contents of OUTPUTZIP are:
|
|
Packit |
0bf95d |
# Length Method Size Ratio Date Time CRC-32 Name
|
|
Packit |
0bf95d |
#-------- ------ ------- ----- ---- ---- ------ ----
|
|
Packit |
0bf95d |
# 0 Stored 0 0% 03-17-00 11:16 00000000 testDir/
|
|
Packit |
0bf95d |
# 300 Defl:N 146 51% 03-17-00 11:16 ac373f32 testDir/string.txt
|
|
Packit |
0bf95d |
# 300 Stored 300 0% 03-17-00 11:16 ac373f32 testDir/file.txt
|
|
Packit |
0bf95d |
#-------- ------- --- -------
|
|
Packit |
0bf95d |
# 600 446 26% 3 files
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# members # Archive::Zip::Archive
|
|
Packit |
0bf95d |
@members = $zip->members();
|
|
Packit |
0bf95d |
is(scalar(@members), 3);
|
|
Packit |
0bf95d |
is($members[2], $member);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# memberNames # Archive::Zip::Archive
|
|
Packit |
0bf95d |
my @memberNames = $zip->memberNames();
|
|
Packit |
0bf95d |
is(scalar(@memberNames), 3);
|
|
Packit |
0bf95d |
is($memberNames[2], $memberName);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# memberNamed # Archive::Zip::Archive
|
|
Packit |
0bf95d |
is($zip->memberNamed($memberName), $member);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# membersMatching # Archive::Zip::Archive
|
|
Packit |
0bf95d |
@members = $zip->membersMatching('file');
|
|
Packit |
0bf95d |
is(scalar(@members), 1);
|
|
Packit |
0bf95d |
is($members[0], $member);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
@members = $zip->membersMatching('.txt$');
|
|
Packit |
0bf95d |
is(scalar(@members), 2);
|
|
Packit |
0bf95d |
is($members[1], $member);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- remove the string member and test the file
|
|
Packit |
0bf95d |
# removeMember # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$member = $zip->removeMember($members[0]);
|
|
Packit |
0bf95d |
is($member, $members[0]);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- add the string member at the end and test the file
|
|
Packit |
0bf95d |
# addMember # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$zip->addMember($member);
|
|
Packit |
0bf95d |
@members = $zip->members();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
is(scalar(@members), 3);
|
|
Packit |
0bf95d |
is($members[2], $member);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# memberNames # Archive::Zip::Archive
|
|
Packit |
0bf95d |
@memberNames = $zip->memberNames();
|
|
Packit |
0bf95d |
is(scalar(@memberNames), 3);
|
|
Packit |
0bf95d |
is($memberNames[1], $memberName);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- remove the file member
|
|
Packit |
0bf95d |
$member = $zip->removeMember($members[1]);
|
|
Packit |
0bf95d |
is($member, $members[1]);
|
|
Packit |
0bf95d |
is($zip->numberOfMembers(), 2);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- replace the string member with the file member
|
|
Packit |
0bf95d |
# replaceMember # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$member = $zip->replaceMember($members[2], $member);
|
|
Packit |
0bf95d |
is($member, $members[2]);
|
|
Packit |
0bf95d |
is($zip->numberOfMembers(), 2);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- re-add the string member
|
|
Packit |
0bf95d |
$zip->addMember($member);
|
|
Packit |
0bf95d |
is($zip->numberOfMembers(), 3);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
@members = $zip->members();
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- add compressed file
|
|
Packit |
0bf95d |
$member = $zip->addFile(File::Spec->catfile(TESTDIR, 'file.txt'));
|
|
Packit |
0bf95d |
ok(defined($member));
|
|
Packit |
0bf95d |
$member->desiredCompressionMethod(COMPRESSION_DEFLATED);
|
|
Packit |
0bf95d |
$member->fileName(TESTDIR . '/fileC.txt');
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- add uncompressed string
|
|
Packit |
0bf95d |
$member = $zip->addString(TESTSTRING, TESTDIR . '/stringU.txt');
|
|
Packit |
0bf95d |
ok(defined($member));
|
|
Packit |
0bf95d |
$member->desiredCompressionMethod(COMPRESSION_STORED);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# Now, the file looks like this:
|
|
Packit |
0bf95d |
# Length Method Size Ratio Date Time CRC-32 Name
|
|
Packit |
0bf95d |
#-------- ------ ------- ----- ---- ---- ------ ----
|
|
Packit |
0bf95d |
# 0 Stored 0 0% 03-17-00 12:30 00000000 testDir/
|
|
Packit |
0bf95d |
# 300 Stored 300 0% 03-17-00 12:30 ac373f32 testDir/file.txt
|
|
Packit |
0bf95d |
# 300 Defl:N 146 51% 03-17-00 12:30 ac373f32 testDir/string.txt
|
|
Packit |
0bf95d |
# 300 Stored 300 0% 03-17-00 12:30 ac373f32 testDir/stringU.txt
|
|
Packit |
0bf95d |
# 300 Defl:N 146 51% 03-17-00 12:30 ac373f32 testDir/fileC.txt
|
|
Packit |
0bf95d |
#-------- ------- --- -------
|
|
Packit |
0bf95d |
# 1200 892 26% 5 files
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
@members = $zip->members();
|
|
Packit |
0bf95d |
$numberOfMembers = $zip->numberOfMembers();
|
|
Packit |
0bf95d |
is($numberOfMembers, 5);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- make sure the contents of the stored file member are OK.
|
|
Packit |
0bf95d |
# contents # Archive::Zip::Archive
|
|
Packit |
0bf95d |
is($zip->contents($members[1]), TESTSTRING);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# contents # Archive::Zip::Member
|
|
Packit |
0bf95d |
is($members[1]->contents(), TESTSTRING);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- make sure the contents of the compressed string member are OK.
|
|
Packit |
0bf95d |
is($members[2]->contents(), TESTSTRING);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- make sure the contents of the stored string member are OK.
|
|
Packit |
0bf95d |
is($members[3]->contents(), TESTSTRING);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- make sure the contents of the compressed file member are OK.
|
|
Packit |
0bf95d |
is($members[4]->contents(), TESTSTRING);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- write to INPUTZIP
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(INPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip(INPUTZIP);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- read from INPUTZIP (appending its entries)
|
|
Packit |
0bf95d |
# read # Archive::Zip::Archive
|
|
Packit |
0bf95d |
$status = $zip->read(INPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
is($zip->numberOfMembers(), 10);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- clean up duplicate names
|
|
Packit |
0bf95d |
@members = $zip->members();
|
|
Packit |
0bf95d |
$member = $zip->removeMember($members[5]);
|
|
Packit |
0bf95d |
is($member->fileName(), TESTDIR . '/');
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SCOPE: {
|
|
Packit |
0bf95d |
for my $i (6 .. 9) {
|
|
Packit |
0bf95d |
$memberName = $members[$i]->fileName();
|
|
Packit |
0bf95d |
$memberName =~ s/\.txt/2.txt/;
|
|
Packit |
0bf95d |
$members[$i]->fileName($memberName);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
is(scalar($zip->membersMatching('2.txt')), 4);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- write zip out and test it.
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- Make sure that we haven't renamed files (this happened!)
|
|
Packit |
0bf95d |
is(scalar($zip->membersMatching('2\.txt$')), 4);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- Now try extracting everyone
|
|
Packit |
0bf95d |
@members = $zip->members();
|
|
Packit |
0bf95d |
is($zip->extractMember($members[0]), AZ_OK); #DM
|
|
Packit |
0bf95d |
is($zip->extractMember($members[1]), AZ_OK); #NFM
|
|
Packit |
0bf95d |
is($zip->extractMember($members[2]), AZ_OK);
|
|
Packit |
0bf95d |
is($zip->extractMember($members[3]), AZ_OK); #NFM
|
|
Packit |
0bf95d |
is($zip->extractMember($members[4]), AZ_OK);
|
|
Packit |
0bf95d |
is($zip->extractMember($members[5]), AZ_OK);
|
|
Packit |
0bf95d |
is($zip->extractMember($members[6]), AZ_OK);
|
|
Packit |
0bf95d |
is($zip->extractMember($members[7]), AZ_OK);
|
|
Packit |
0bf95d |
is($zip->extractMember($members[8]), AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- count dirs
|
|
Packit |
0bf95d |
{
|
|
Packit |
0bf95d |
my @dirs = grep { $_->isDirectory() } @members;
|
|
Packit |
0bf95d |
is(scalar(@dirs), 1);
|
|
Packit |
0bf95d |
is($dirs[0], $members[0]);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- count binary and text files
|
|
Packit |
0bf95d |
{
|
|
Packit |
0bf95d |
my @binaryFiles = grep { $_->isBinaryFile() } @members;
|
|
Packit |
0bf95d |
my @textFiles = grep { $_->isTextFile() } @members;
|
|
Packit |
0bf95d |
is(scalar(@binaryFiles), 5);
|
|
Packit |
0bf95d |
is(scalar(@textFiles), 4);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- Try writing zip file to file handle
|
|
Packit |
0bf95d |
{
|
|
Packit |
0bf95d |
my $fh;
|
|
Packit |
0bf95d |
if ($catWorks) {
|
|
Packit |
0bf95d |
unlink(OUTPUTZIP);
|
|
Packit |
0bf95d |
$fh = FileHandle->new(CATPIPE . OUTPUTZIP);
|
|
Packit |
0bf95d |
binmode($fh);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip('cat does not work on this platform', 1) unless $catWorks;
|
|
Packit |
0bf95d |
ok($fh);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# $status = $zip->writeToFileHandle($fh, 0) if ($catWorks);
|
|
Packit |
0bf95d |
$status = $zip->writeToFileHandle($fh) if ($catWorks);
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip('cat does not work on this platform', 1) unless $catWorks;
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
$fh->close() if ($catWorks);
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- Change the contents of a string member
|
|
Packit |
0bf95d |
is(ref($members[2]), 'Archive::Zip::StringMember');
|
|
Packit |
0bf95d |
$members[2]->contents("This is my new contents\n");
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- write zip out and test it.
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- Change the contents of a file member
|
|
Packit |
0bf95d |
is(ref($members[1]), 'Archive::Zip::NewFileMember');
|
|
Packit |
0bf95d |
$members[1]->contents("This is my new contents\n");
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- write zip out and test it.
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- Change the contents of a zip member
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
is(ref($members[7]), 'Archive::Zip::ZipFileMember');
|
|
Packit |
0bf95d |
$members[7]->contents("This is my new contents\n");
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- write zip out and test it.
|
|
Packit |
0bf95d |
$status = $zip->writeToFileNamed(OUTPUTZIP);
|
|
Packit |
0bf95d |
is($status, AZ_OK);
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
SKIP: {
|
|
Packit |
0bf95d |
skip("No 'unzip' program to test against", 1) unless HAVEUNZIP;
|
|
Packit |
0bf95d |
($status, $zipout) = testZip();
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# STDERR->print("status= $status, out=$zipout\n");
|
|
Packit |
0bf95d |
skip("test zip doesn't work", 1) if $testZipDoesntWork;
|
|
Packit |
0bf95d |
is($status, 0);
|
|
Packit |
0bf95d |
}
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------- now clean up
|
|
Packit |
0bf95d |
# END { system("rm -rf " . TESTDIR . " " . OUTPUTZIP . " " . INPUTZIP) }
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
#--------------------- STILL UNTESTED IN THIS SCRIPT ---------------------
|
|
Packit |
0bf95d |
|
|
Packit |
0bf95d |
# sub setChunkSize # Archive::Zip
|
|
Packit |
0bf95d |
# sub _formatError # Archive::Zip
|
|
Packit |
0bf95d |
# sub _error # Archive::Zip
|
|
Packit |
0bf95d |
# sub _subclassResponsibility # Archive::Zip
|
|
Packit |
0bf95d |
# sub diskNumber # Archive::Zip::Archive
|
|
Packit |
0bf95d |
# sub diskNumberWithStartOfCentralDirectory # Archive::Zip::Archive
|
|
Packit |
0bf95d |
# sub numberOfCentralDirectoriesOnThisDisk # Archive::Zip::Archive
|
|
Packit |
0bf95d |
# sub numberOfCentralDirectories # Archive::Zip::Archive
|
|
Packit |
0bf95d |
# sub centralDirectoryOffsetWRTStartingDiskNumber # Archive::Zip::Archive
|
|
Packit |
0bf95d |
# sub extraField # Archive::Zip::Member
|
|
Packit |
0bf95d |
# sub isEncrypted # Archive::Zip::Member
|
|
Packit |
0bf95d |
# sub isTextFile # Archive::Zip::Member
|
|
Packit |
0bf95d |
# sub isBinaryFile # Archive::Zip::Member
|
|
Packit |
0bf95d |
# sub isDirectory # Archive::Zip::Member
|
|
Packit |
0bf95d |
# sub lastModTime # Archive::Zip::Member
|
|
Packit |
0bf95d |
# sub _writeDataDescriptor # Archive::Zip::Member
|
|
Packit |
0bf95d |
# sub isDirectory # Archive::Zip::DirectoryMember
|
|
Packit |
0bf95d |
# sub _becomeDirectory # Archive::Zip::DirectoryMember
|
|
Packit |
0bf95d |
# sub diskNumberStart # Archive::Zip::ZipFileMember
|