Blame t/02_main.t

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