Archive-Zip

 view release on metacpan or  search on metacpan

t/02_main.t  view on Meta::CPAN

#!/usr/bin/perl

# See https://github.com/redhotpenguin/perl-Archive-Zip/blob/master/t/README.md
# for a short documentation on the Archive::Zip test infrastructure.

use strict;

BEGIN { $^W = 1; }

use File::Path;
use Test::More;

use Archive::Zip qw(:ERROR_CODES :CONSTANTS);

use lib 't';
use common;

#####################################################################
# Testing Utility Functions

#--------- check CRC
is(TESTSTRINGCRC, 0xac373f32, 'Testing CRC matches expected');

{
    my @errors = ();
    local $Archive::Zip::ErrorHandler = sub { push @errors, @_ };
    eval { Archive::Zip::Member::_unixToDosTime(0) };
    ok($errors[0] =~ /Tried to add member with zero or undef value for time/,
        'Got expected _unixToDosTime error');
}

#--------- check time conversion

foreach my $unix_time (
    315576062,  315576064,  315580000,  315600000,
    316000000,  320000000,  400000000,  500000000,
    600000000,  700000000,  800000000,  900000000,
    1000000000, 1100000000, 1200000000, int(time() / 2) * 2,
  ) {
    my $dos_time   = Archive::Zip::Member::_unixToDosTime($unix_time);
    my $round_trip = Archive::Zip::Member::_dosToUnixTime($dos_time);
    is($unix_time, $round_trip, 'Got expected DOS DateTime value');
}

#####################################################################
# Testing Archives

# Enjoy the non-indented freedom!
for my $desiredZip64Mode (ZIP64_AS_NEEDED, ZIP64_EOCD, ZIP64_HEADERS) {

next unless ZIP64_SUPPORTED || $desiredZip64Mode == ZIP64_AS_NEEDED;

# Re-create test directory for each loop iteration
rmtree([testPath()], 0, 0);
mkdir(testPath()) or die;

#--------- empty file
# new	# Archive::Zip
# new	# Archive::Zip::Archive
my $zip = Archive::Zip->new();
isa_ok($zip, 'Archive::Zip');

$zip->desiredZip64Mode($desiredZip64Mode);

# members	# Archive::Zip::Archive
my @members = $zip->members;
is(scalar(@members), 0, '->members is 0');

# numberOfMembers	# Archive::Zip::Archive
my $numberOfMembers = $zip->numberOfMembers();
is($numberOfMembers, 0, '->numberofMembers is 0');

# writeToFileNamed	# Archive::Zip::Archive
azok($zip->writeToFileNamed(OUTPUTZIP), '->writeToFileNamed ok');

azuztok(refzip => "emptyzip.zip");

#--------- add a directory
my $memberName = testPath(PATH_ZIPDIR);
my $dirName    = testPath();

# addDirectory	# Archive::Zip::Archive
# new	# Archive::Zip::Member
my $member = $zip->addDirectory($memberName);
ok(defined($member));
is($member->fileName(), $memberName);

# On some (Windows systems) the modification time is
# corrupted. Save this to check later.
my $dirTime = $member->lastModFileDateTime();

# members	# Archive::Zip::Archive
@members = $zip->members();
is(scalar(@members), 1);
is($members[0],      $member);

# numberOfMembers	# Archive::Zip::Archive
$numberOfMembers = $zip->numberOfMembers();
is($numberOfMembers, 1);

# writeToFileNamed	# Archive::Zip::Archive
azok($zip->writeToFileNamed(OUTPUTZIP));

# Does the modification time get corrupted?
is(($zip->members)[0]->lastModFileDateTime(), $dirTime);

azuztok();

#--------- extract the directory by name
rmdir($dirName) or die;
azok($zip->extractMember($memberName));
ok(-d $dirName);

#--------- extract the directory by identity
rmdir($dirName) or die;
azok($zip->extractMember($member));
ok(-d $dirName);

#--------- add a string member, uncompressed
$memberName = testPath('string.txt', PATH_ZIPFILE);

# addString	# Archive::Zip::Archive
# newFromString	# Archive::Zip::Member
$member = $zip->addString(TESTSTRING, $memberName);
ok(defined($member));

is($member->fileName(), $memberName);

# members	# Archive::Zip::Archive
@members = $zip->members();
is(scalar(@members), 2);
is($members[1],      $member);

# numberOfMembers	# Archive::Zip::Archive
$numberOfMembers = $zip->numberOfMembers();
is($numberOfMembers, 2);

# writeToFileNamed	# Archive::Zip::Archive
azok($zip->writeToFileNamed(OUTPUTZIP));

azuztok();

is($member->crc32(), TESTSTRINGCRC);

is($member->crc32String(), sprintf("%08x", TESTSTRINGCRC));

#--------- extract it by name
azok($zip->extractMember($memberName));
ok  (-f $memberName);
is  (readFile($memberName), TESTSTRING);

#--------- now compress it and re-test
my $oldCompressionMethod =
  $member->desiredCompressionMethod(COMPRESSION_DEFLATED);
is($oldCompressionMethod, COMPRESSION_STORED, 'old compression method OK');

# writeToFileNamed	# Archive::Zip::Archive
azok($zip->writeToFileNamed(OUTPUTZIP), 'writeToFileNamed returns AZ_OK');
is  ($member->crc32(),            TESTSTRINGCRC);
is  ($member->uncompressedSize(), TESTSTRINGLENGTH);

azuztok();

#--------- extract it by name
azok($zip->extractMember($memberName));



( run in 1.408 second using v1.01-cache-2.11-cpan-39bf76dae61 )