From 5ec656fde4e832a0e7a8ee5cab94a4ebaa9d710b Mon Sep 17 00:00:00 2001 From: Ne-Lexa Date: Tue, 21 Jan 2020 14:10:47 +0300 Subject: [PATCH 1/7] Implemented the ability to override the instance of ZipContainer. ZipContainer will be cloned before writing the zip file. Tested custom ZipWriter, ZipReader, ZipContainer and ZipFile. --- .travis.yml | 6 +- README.RU.md | 1 + README.md | 1 + composer.json | 1 + phpunit.xml | 6 + src/IO/ZipWriter.php | 4 +- src/ZipFile.php | 17 ++- tests/CustomZipFormatTest.php | 60 +++++++++ tests/Internal/Epub/EpubFile.php | 98 ++++++++++++++ tests/Internal/Epub/EpubInfo.php | 159 +++++++++++++++++++++++ tests/Internal/Epub/EpubReader.php | 21 +++ tests/Internal/Epub/EpubWriter.php | 66 ++++++++++ tests/Internal/Epub/EpubZipContainer.php | 22 ++++ tests/ZipFileTest.php | 17 +++ tests/resources/Advanced-v1.0.0.epub | Bin 0 -> 203101 bytes 15 files changed, 472 insertions(+), 7 deletions(-) create mode 100644 tests/CustomZipFormatTest.php create mode 100644 tests/Internal/Epub/EpubFile.php create mode 100644 tests/Internal/Epub/EpubInfo.php create mode 100644 tests/Internal/Epub/EpubReader.php create mode 100644 tests/Internal/Epub/EpubWriter.php create mode 100644 tests/Internal/Epub/EpubZipContainer.php create mode 100644 tests/resources/Advanced-v1.0.0.epub diff --git a/.travis.yml b/.travis.yml index 692fcd6..cf612be 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,15 +2,15 @@ language: php env: global: - - ZIPALIGN_INSTALL=false - COVERAGE=false - - PHPUNIT_FLAGS="-v -c phpunit.xml --testsuite only_fast_tests" + - PHPUNIT_FLAGS="-v -c phpunit.xml" matrix: include: - php: 5.5 os: linux dist: trusty + env: ZIPALIGN_INSTALL=false - php: 5.6 os: linux @@ -40,7 +40,7 @@ matrix: - php: 7.4 os: linux dist: bionic - env: COVERAGE=true ZIPALIGN_INSTALL=true PHPUNIT_FLAGS="-v -c phpunit.xml --testsuite only_fast_tests --coverage-clover=coverage.clover" + env: COVERAGE=true ZIPALIGN_INSTALL=true PHPUNIT_FLAGS="-v -c phpunit.xml --coverage-clover=coverage.clover" before_install: - if [[ $COVERAGE != true ]]; then phpenv config-rm xdebug.ini || true; fi diff --git a/README.RU.md b/README.RU.md index aa0333d..0b90797 100644 --- a/README.RU.md +++ b/README.RU.md @@ -3,6 +3,7 @@ `PhpZip` - php библиотека для продвинутой работы с ZIP-архивами. [![Build Status](https://travis-ci.org/Ne-Lexa/php-zip.svg?branch=master)](https://travis-ci.org/Ne-Lexa/php-zip) +[![Code Coverage](https://scrutinizer-ci.com/g/Ne-Lexa/php-zip/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Ne-Lexa/php-zip/?branch=master) [![Latest Stable Version](https://poser.pugx.org/nelexa/zip/v/stable)](https://packagist.org/packages/nelexa/zip) [![Total Downloads](https://poser.pugx.org/nelexa/zip/downloads)](https://packagist.org/packages/nelexa/zip) [![Minimum PHP Version](http://img.shields.io/badge/php-%3E%3D%205.5-8892BF.svg)](https://php.net/) diff --git a/README.md b/README.md index fa712f9..44ea792 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,7 @@ `PhpZip` is a php-library for extended work with ZIP-archives. [![Build Status](https://travis-ci.org/Ne-Lexa/php-zip.svg?branch=master)](https://travis-ci.org/Ne-Lexa/php-zip) +[![Code Coverage](https://scrutinizer-ci.com/g/Ne-Lexa/php-zip/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/Ne-Lexa/php-zip/?branch=master) [![Latest Stable Version](https://poser.pugx.org/nelexa/zip/v/stable)](https://packagist.org/packages/nelexa/zip) [![Total Downloads](https://poser.pugx.org/nelexa/zip/downloads)](https://packagist.org/packages/nelexa/zip) [![Minimum PHP Version](http://img.shields.io/badge/php-%3E%3D%205.5-8892BF.svg)](https://php.net/) diff --git a/composer.json b/composer.json index d360777..7e75f36 100644 --- a/composer.json +++ b/composer.json @@ -31,6 +31,7 @@ "ext-bz2": "*", "ext-openssl": "*", "ext-fileinfo": "*", + "ext-xml": "*", "guzzlehttp/psr7": "^1.6", "phpunit/phpunit": "^4.8|^5.7", "symfony/var-dumper": "^3.0|^4.0|^5.0" diff --git a/phpunit.xml b/phpunit.xml index 046df3b..cbb13f5 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -22,6 +22,12 @@ + + + large + + + src diff --git a/src/IO/ZipWriter.php b/src/IO/ZipWriter.php index 5b0a332..b5cc8a8 100644 --- a/src/IO/ZipWriter.php +++ b/src/IO/ZipWriter.php @@ -39,7 +39,9 @@ class ZipWriter */ public function __construct(ZipContainer $container) { - $this->zipContainer = $container; + // we clone the container so that the changes made to + // it do not affect the data in the ZipFile class + $this->zipContainer = clone $container; } /** diff --git a/src/ZipFile.php b/src/ZipFile.php index fa0e637..6bbee69 100644 --- a/src/ZipFile.php +++ b/src/ZipFile.php @@ -20,6 +20,7 @@ use PhpZip\IO\ZipReader; use PhpZip\IO\ZipWriter; use PhpZip\Model\Data\ZipFileData; use PhpZip\Model\Data\ZipNewData; +use PhpZip\Model\ImmutableZipContainer; use PhpZip\Model\ZipContainer; use PhpZip\Model\ZipEntry; use PhpZip\Model\ZipEntryMatcher; @@ -68,7 +69,7 @@ class ZipFile implements ZipFileInterface */ public function __construct() { - $this->zipContainer = new ZipContainer(); + $this->zipContainer = $this->createZipContainer(null); } /** @@ -90,6 +91,16 @@ class ZipFile implements ZipFileInterface return new ZipWriter($this->zipContainer); } + /** + * @param ImmutableZipContainer|null $sourceContainer + * + * @return ZipContainer + */ + protected function createZipContainer(ImmutableZipContainer $sourceContainer = null) + { + return new ZipContainer($sourceContainer); + } + /** * Open zip archive from file. * @@ -151,7 +162,7 @@ class ZipFile implements ZipFileInterface public function openFromStream($handle, array $options = []) { $this->reader = $this->createZipReader($handle, $options); - $this->zipContainer = new ZipContainer($this->reader->read()); + $this->zipContainer = $this->createZipContainer($this->reader->read()); return $this; } @@ -1769,7 +1780,7 @@ class ZipFile implements ZipFileInterface if ($this->reader !== null) { $this->reader->close(); $this->reader = null; - $this->zipContainer = new ZipContainer(); + $this->zipContainer = $this->createZipContainer(null); } } diff --git a/tests/CustomZipFormatTest.php b/tests/CustomZipFormatTest.php new file mode 100644 index 0000000..09dc137 --- /dev/null +++ b/tests/CustomZipFormatTest.php @@ -0,0 +1,60 @@ +openFile(__DIR__ . '/resources/Advanced-v1.0.0.epub'); + self::assertSame($epubFile->getRootFile(), 'EPUB/package.opf'); + self::assertSame($epubFile->getMimeType(), 'application/epub+zip'); + $epubInfo = $epubFile->getEpubInfo(); + self::assertSame($epubInfo->toArray(), [ + 'title' => 'Advanced Accessibility Tests: Extended Descriptions', + 'creator' => 'DAISY Consortium Transition to EPUB 3 and DIAGRAM Standards WG', + 'language' => 'en-US', + 'publisher' => 'DAISY Consortium and DIAGRAM Center', + 'description' => 'Tests for accessible extended descriptions of images in EPUBs', + 'rights' => 'This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike (CC BY-NC-SA) license.', + 'date' => '2019-01-03', + 'subject' => 'extended-descriptions', + ]); + $epubFile->deleteFromName('mimetype'); + self::assertFalse($epubFile->hasEntry('mimetype')); + + try { + $epubFile->getMimeType(); + self::fail('deleted mimetype'); + } catch (ZipEntryNotFoundException $e) { + self::assertSame('Zip Entry "mimetype" was not found in the archive.', $e->getMessage()); + } + $epubFile->saveAsFile($this->outputFilename); + self::assertFalse($epubFile->hasEntry('mimetype')); + $epubFile->close(); + + self::assertCorrectZipArchive($this->outputFilename); + + $epubFile->openFile($this->outputFilename); + // file appended in EpubWriter before write + self::assertTrue($epubFile->hasEntry('mimetype')); + $epubFile->close(); + } +} diff --git a/tests/Internal/Epub/EpubFile.php b/tests/Internal/Epub/EpubFile.php new file mode 100644 index 0000000..a30cb76 --- /dev/null +++ b/tests/Internal/Epub/EpubFile.php @@ -0,0 +1,98 @@ +zipContainer); + } + + /** + * @param resource $inputStream + * @param array $options + * + * @return ZipReader + */ + protected function createZipReader($inputStream, array $options = []) + { + return new EpubReader($inputStream, $options); + } + + /** + * @param ImmutableZipContainer|null $sourceContainer + * + * @return ZipContainer + */ + protected function createZipContainer(ImmutableZipContainer $sourceContainer = null) + { + return new EpubZipContainer($sourceContainer); + } + + /** + * @param ZipEntry $zipEntry + */ + protected function addZipEntry(ZipEntry $zipEntry) + { + $zipEntry->setCreatedOS(ZipPlatform::OS_DOS); + $zipEntry->setExtractedOS(ZipPlatform::OS_UNIX); + parent::addZipEntry($zipEntry); + } + + /** + * @throws ZipEntryNotFoundException + * + * @return string + */ + public function getMimeType() + { + return $this->zipContainer->getMimeType(); + } + + public function getEpubInfo() + { + return new EpubInfo($this->getEntryContents($this->getRootFile())); + } + + /** + * @throws ZipException + * + * @return string + */ + public function getRootFile() + { + $entryName = 'META-INF/container.xml'; + $contents = $this->getEntryContents($entryName); + $doc = new \DOMDocument(); + $doc->loadXML($contents); + $xpath = new \DOMXPath($doc); + $rootFile = $xpath->evaluate('string(//@full-path)'); + + if ($rootFile === '') { + throw new ZipException('Incorrect ' . $entryName . ' file format'); + } + + return $rootFile; + } +} diff --git a/tests/Internal/Epub/EpubInfo.php b/tests/Internal/Epub/EpubInfo.php new file mode 100644 index 0000000..e1e1b78 --- /dev/null +++ b/tests/Internal/Epub/EpubInfo.php @@ -0,0 +1,159 @@ +loadXML($xmlContents); + $xpath = new \DOMXpath($doc); + $xpath->registerNamespace('root', 'http://www.idpf.org/2007/opf'); + $metaDataNodeList = $xpath->query('//root:metadata'); + + if (\count($metaDataNodeList) !== 1) { + throw new ZipException('Invalid .opf file format'); + } + $metaDataNode = $metaDataNodeList->item(0); + + $title = $xpath->evaluate('string(//dc:title)', $metaDataNode); + $creator = $xpath->evaluate('string(//dc:creator)', $metaDataNode); + $language = $xpath->evaluate('string(//dc:language)', $metaDataNode); + $publisher = $xpath->evaluate('string(//dc:publisher)', $metaDataNode); + $description = $xpath->evaluate('string(//dc:description)', $metaDataNode); + $rights = $xpath->evaluate('string(//dc:rights)', $metaDataNode); + $date = $xpath->evaluate('string(//dc:date)', $metaDataNode); + $subject = $xpath->evaluate('string(//dc:subject)', $metaDataNode); + + $this->title = empty($title) ? null : $title; + $this->creator = empty($creator) ? null : $creator; + $this->language = empty($language) ? null : $language; + $this->publisher = empty($publisher) ? null : $publisher; + $this->description = empty($description) ? null : $description; + $this->rights = empty($rights) ? null : $rights; + $this->date = empty($date) ? null : $date; + $this->subject = empty($subject) ? null : $subject; + } + + /** + * @return string|null + */ + public function getTitle() + { + return $this->title; + } + + /** + * @return string|null + */ + public function getCreator() + { + return $this->creator; + } + + /** + * @return string|null + */ + public function getLanguage() + { + return $this->language; + } + + /** + * @return string|null + */ + public function getPublisher() + { + return $this->publisher; + } + + /** + * @return string|null + */ + public function getDescription() + { + return $this->description; + } + + /** + * @return string|null + */ + public function getRights() + { + return $this->rights; + } + + /** + * @return string|null + */ + public function getDate() + { + return $this->date; + } + + /** + * @return string|null + */ + public function getSubject() + { + return $this->subject; + } + + /** + * @return array + */ + public function toArray() + { + return [ + 'title' => $this->title, + 'creator' => $this->creator, + 'language' => $this->language, + 'publisher' => $this->publisher, + 'description' => $this->description, + 'rights' => $this->rights, + 'date' => $this->date, + 'subject' => $this->subject, + ]; + } +} diff --git a/tests/Internal/Epub/EpubReader.php b/tests/Internal/Epub/EpubReader.php new file mode 100644 index 0000000..ba909bb --- /dev/null +++ b/tests/Internal/Epub/EpubReader.php @@ -0,0 +1,21 @@ +zipContainer->hasEntry('mimetype')) { + $zipEntry = new ZipEntry('mimetype'); + $zipEntry->setCreatedOS(ZipPlatform::OS_DOS); + $zipEntry->setExtractedOS(ZipPlatform::OS_DOS); + $zipEntry->setCompressionMethod(ZipCompressionMethod::STORED); + $zipEntry->setData(new ZipNewData($zipEntry, 'application/epub+zip')); + $this->zipContainer->addEntry($zipEntry); + } + + $this->sortEntries(); + } + + private function sortEntries() + { + $this->zipContainer->sortByEntry( + static function (ZipEntry $a, ZipEntry $b) { + if (strcasecmp($a->getName(), 'mimetype') === 0) { + return -1; + } + + if (strcasecmp($b->getName(), 'mimetype') === 0) { + return 1; + } + + if ($a->isDirectory() && $b->isDirectory()) { + return strcmp($a->getName(), $b->getName()); + } + + if ($a->isDirectory()) { + return -1; + } + + if ($b->isDirectory()) { + return 1; + } + + return strcmp($a->getName(), $b->getName()); + } + ); + } +} diff --git a/tests/Internal/Epub/EpubZipContainer.php b/tests/Internal/Epub/EpubZipContainer.php new file mode 100644 index 0000000..29fff15 --- /dev/null +++ b/tests/Internal/Epub/EpubZipContainer.php @@ -0,0 +1,22 @@ +getEntry('mimetype')->getData()->getDataAsString(); + } +} diff --git a/tests/ZipFileTest.php b/tests/ZipFileTest.php index 9c99f4b..b3c83c4 100644 --- a/tests/ZipFileTest.php +++ b/tests/ZipFileTest.php @@ -2418,4 +2418,21 @@ class ZipFileTest extends ZipTestCase static::assertSame($zipFile->getEntry($newEntryName)->getCompressionMethod(), ZipCompressionMethod::STORED); $zipFile->close(); } + + /** + * @throws ZipEntryNotFoundException + * @throws ZipException + */ + public function testCloneZipContainerInZipWriter() + { + $zipFile = new ZipFile(); + $zipFile['file 1'] = 'contents'; + $zipEntryBeforeWrite = $zipFile->getEntry('file 1'); + $zipFile->saveAsFile($this->outputFilename); + $zipAfterBeforeWrite = $zipFile->getEntry('file 1'); + + static::assertEquals($zipAfterBeforeWrite, $zipEntryBeforeWrite); + + $zipFile->close(); + } } diff --git a/tests/resources/Advanced-v1.0.0.epub b/tests/resources/Advanced-v1.0.0.epub new file mode 100644 index 0000000000000000000000000000000000000000..d12f9967e72c6d1b27b3175ed4e290bab4b29ed3 GIT binary patch literal 203101 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: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 Date: Wed, 22 Jan 2020 12:48:15 +0300 Subject: [PATCH 2/7] Fixed problem with cloning a zip container. --- src/Model/Data/ZipNewData.php | 48 ++++++++++++- src/Model/ImmutableZipContainer.php | 16 +++++ src/Model/ZipContainer.php | 7 +- tests/CustomZipFormatTest.php | 70 ++++++++++++++++++- tests/Internal/CustomZip/CustomZipWriter.php | 39 +++++++++++ .../CustomZip/ZipFileCustomWriter.php | 20 ++++++ .../CustomZip/ZipFileWithBeforeSave.php | 28 ++++++++ tests/ZipEntryTest.php | 49 +++++++++++++ tests/ZipEventTest.php | 41 ----------- tests/ZipFileTest.php | 14 ++++ 10 files changed, 285 insertions(+), 47 deletions(-) create mode 100644 tests/Internal/CustomZip/CustomZipWriter.php create mode 100644 tests/Internal/CustomZip/ZipFileCustomWriter.php create mode 100644 tests/Internal/CustomZip/ZipFileWithBeforeSave.php delete mode 100644 tests/ZipEventTest.php diff --git a/src/Model/Data/ZipNewData.php b/src/Model/Data/ZipNewData.php index 4b1dd0e..68f76f6 100644 --- a/src/Model/Data/ZipNewData.php +++ b/src/Model/Data/ZipNewData.php @@ -4,18 +4,27 @@ namespace PhpZip\Model\Data; use PhpZip\Model\ZipData; use PhpZip\Model\ZipEntry; +use PhpZip\ZipFile; /** - * Class ZipNewData. + * The class contains a streaming resource with new content added to the ZIP archive. */ class ZipNewData implements ZipData { - /** @var resource */ - private $stream; + /** + * A static variable allows closing the stream in the destructor + * only if it is its sole holder. + * + * @var array array of resource ids and the number of class clones + */ + private static $guardClonedStream = []; /** @var ZipEntry */ private $zipEntry; + /** @var resource */ + private $stream; + /** * ZipStringData constructor. * @@ -38,6 +47,12 @@ class ZipNewData implements ZipData } elseif (\is_resource($data)) { $this->stream = $data; } + + $resourceId = (int) $this->stream; + self::$guardClonedStream[$resourceId] = + isset(self::$guardClonedStream[$resourceId]) ? + self::$guardClonedStream[$resourceId] + 1 : + 0; } /** @@ -79,8 +94,35 @@ class ZipNewData implements ZipData stream_copy_to_stream($stream, $outStream); } + /** + * @see https://php.net/manual/en/language.oop5.cloning.php + */ + public function __clone() + { + $resourceId = (int) $this->stream; + self::$guardClonedStream[$resourceId] = + isset(self::$guardClonedStream[$resourceId]) ? + self::$guardClonedStream[$resourceId] + 1 : + 1; + } + + /** + * The stream will be closed when closing the zip archive. + * + * The method implements protection against closing the stream of the cloned object. + * + * @see ZipFile::close() + */ public function __destruct() { + $resourceId = (int) $this->stream; + + if (isset(self::$guardClonedStream[$resourceId]) && self::$guardClonedStream[$resourceId] > 0) { + self::$guardClonedStream[$resourceId]--; + + return; + } + if (\is_resource($this->stream)) { fclose($this->stream); } diff --git a/src/Model/ImmutableZipContainer.php b/src/Model/ImmutableZipContainer.php index 72e0d33..69722a0 100644 --- a/src/Model/ImmutableZipContainer.php +++ b/src/Model/ImmutableZipContainer.php @@ -53,4 +53,20 @@ class ImmutableZipContainer implements \Countable { return \count($this->entries); } + + /** + * When an object is cloned, PHP 5 will perform a shallow copy of all of the object's properties. + * Any properties that are references to other variables, will remain references. + * Once the cloning is complete, if a __clone() method is defined, + * then the newly created object's __clone() method will be called, to allow any necessary properties that need to + * be changed. NOT CALLABLE DIRECTLY. + * + * @see https://php.net/manual/en/language.oop5.cloning.php + */ + public function __clone() + { + foreach ($this->entries as $key => $value) { + $this->entries[$key] = clone $value; + } + } } diff --git a/src/Model/ZipContainer.php b/src/Model/ZipContainer.php index f3c2d9c..6cfe87e 100644 --- a/src/Model/ZipContainer.php +++ b/src/Model/ZipContainer.php @@ -12,7 +12,12 @@ use PhpZip\Exception\ZipException; */ class ZipContainer extends ImmutableZipContainer { - /** @var ImmutableZipContainer|null */ + /** + * @var ImmutableZipContainer|null The source container contains zip entries from + * an open zip archive. The source container makes + * it possible to undo changes in the archive. + * When cloning, this container is not cloned. + */ private $sourceContainer; /** diff --git a/tests/CustomZipFormatTest.php b/tests/CustomZipFormatTest.php index 09dc137..020162f 100644 --- a/tests/CustomZipFormatTest.php +++ b/tests/CustomZipFormatTest.php @@ -4,12 +4,16 @@ namespace PhpZip\Tests; use PhpZip\Exception\ZipEntryNotFoundException; use PhpZip\Exception\ZipException; +use PhpZip\Model\Extra\Fields\NewUnixExtraField; +use PhpZip\Model\Extra\Fields\NtfsExtraField; +use PhpZip\Tests\Internal\CustomZip\ZipFileCustomWriter; +use PhpZip\Tests\Internal\CustomZip\ZipFileWithBeforeSave; use PhpZip\Tests\Internal\Epub\EpubFile; +use PhpZip\ZipFile; /** * Checks the ability to create own file-type class, reader, writer and container. - * - * @see http://www.epubtest.org/test-books source epub files + **. * * @internal * @@ -19,6 +23,8 @@ final class CustomZipFormatTest extends ZipTestCase { /** * @throws ZipException + * + * @see http://www.epubtest.org/test-books source epub files */ public function testEpub() { @@ -57,4 +63,64 @@ final class CustomZipFormatTest extends ZipTestCase self::assertTrue($epubFile->hasEntry('mimetype')); $epubFile->close(); } + + /** + * @throws \Exception + */ + public function testBeforeSaveInZipWriter() + { + $zipFile = new ZipFileCustomWriter(); + for ($i = 0; $i < 10; $i++) { + $zipFile['file ' . $i] = 'contents file ' . $i; + } + $this->existsExtraFields($zipFile, false); + $zipFile->saveAsFile($this->outputFilename); + $this->existsExtraFields($zipFile, false); + $zipFile->close(); + + self::assertCorrectZipArchive($this->outputFilename); + + $zipFile->openFile($this->outputFilename); + $this->existsExtraFields($zipFile, true); + $zipFile->close(); + } + + /** + * @throws \Exception + */ + public function testBeforeSaveInZipFile() + { + $zipFile = new ZipFileWithBeforeSave(); + for ($i = 0; $i < 10; $i++) { + $zipFile['file ' . $i] = 'contents file ' . $i; + } + $this->existsExtraFields($zipFile, false); + $zipFile->saveAsFile($this->outputFilename); + $this->existsExtraFields($zipFile, true); + $zipFile->close(); + + self::assertCorrectZipArchive($this->outputFilename); + + $zipFile->openFile($this->outputFilename); + $this->existsExtraFields($zipFile, true); + $zipFile->close(); + } + + /** + * @param ZipFile $zipFile + * @param bool $exists + */ + private function existsExtraFields(ZipFile $zipFile, $exists) + { + foreach ($zipFile->getEntries() as $entry) { + $localExtras = $entry->getLocalExtraFields(); + $cdExtras = $entry->getCdExtraFields(); + + self::assertSame(isset($localExtras[NtfsExtraField::HEADER_ID]), $exists); + self::assertSame(isset($cdExtras[NtfsExtraField::HEADER_ID]), $exists); + + self::assertSame(isset($localExtras[NewUnixExtraField::HEADER_ID]), $exists); + self::assertSame(isset($cdExtras[NewUnixExtraField::HEADER_ID]), $exists); + } + } } diff --git a/tests/Internal/CustomZip/CustomZipWriter.php b/tests/Internal/CustomZip/CustomZipWriter.php new file mode 100644 index 0000000..4d91ee5 --- /dev/null +++ b/tests/Internal/CustomZip/CustomZipWriter.php @@ -0,0 +1,39 @@ +zipContainer); + } + + protected function beforeWrite() + { + parent::beforeWrite(); + $now = new \DateTimeImmutable(); + $ntfsTimeExtra = NtfsExtraField::create($now, $now->modify('-1 day'), $now->modify('-10 day')); + $unixExtra = new NewUnixExtraField(); + + foreach ($this->zipContainer->getEntries() as $entry) { + $entry->addExtraField($ntfsTimeExtra); + $entry->addExtraField($unixExtra); + } + } +} diff --git a/tests/Internal/CustomZip/ZipFileCustomWriter.php b/tests/Internal/CustomZip/ZipFileCustomWriter.php new file mode 100644 index 0000000..6c143b0 --- /dev/null +++ b/tests/Internal/CustomZip/ZipFileCustomWriter.php @@ -0,0 +1,20 @@ +zipContainer); + } +} diff --git a/tests/Internal/CustomZip/ZipFileWithBeforeSave.php b/tests/Internal/CustomZip/ZipFileWithBeforeSave.php new file mode 100644 index 0000000..98d470f --- /dev/null +++ b/tests/Internal/CustomZip/ZipFileWithBeforeSave.php @@ -0,0 +1,28 @@ +modify('-1 day'), $now->modify('-10 day')); + $unixExtra = new NewUnixExtraField(); + + foreach ($this->zipContainer->getEntries() as $entry) { + $entry->addExtraField($ntfsTimeExtra); + $entry->addExtraField($unixExtra); + } + } +} diff --git a/tests/ZipEntryTest.php b/tests/ZipEntryTest.php index de9ab52..28ed7c4 100644 --- a/tests/ZipEntryTest.php +++ b/tests/ZipEntryTest.php @@ -304,6 +304,55 @@ class ZipEntryTest extends TestCase static::assertNull($zipEntry->getData()); } + /** + * @throws \Exception + */ + public function testZipNewDataGuardClone() + { + $resource = fopen('php://temp', 'r+b'); + static::assertNotFalse($resource); + fwrite($resource, random_bytes(1024)); + rewind($resource); + + $zipEntry = new ZipEntry('entry'); + $zipEntry2 = new ZipEntry('entry2'); + + $zipData = new ZipNewData($zipEntry, $resource); + $zipData2 = new ZipNewData($zipEntry2, $resource); + $cloneData = clone $zipData; + $cloneData2 = clone $cloneData; + + static::assertSame($zipData->getDataAsStream(), $resource); + static::assertSame($zipData2->getDataAsStream(), $resource); + static::assertSame($cloneData->getDataAsStream(), $resource); + static::assertSame($cloneData2->getDataAsStream(), $resource); + + $validResource = \is_resource($resource); + static::assertTrue($validResource); + + unset($cloneData); + $validResource = \is_resource($resource); + static::assertTrue($validResource); + + unset($zipData); + $validResource = \is_resource($resource); + static::assertTrue($validResource); + + unset($zipData2); + $validResource = \is_resource($resource); + static::assertTrue($validResource); + + $reflectionClass = new \ReflectionClass($cloneData2); + static::assertSame( + $reflectionClass->getStaticProperties()['guardClonedStream'][(int) $resource], + 0 + ); + + unset($cloneData2); + $validResource = \is_resource($resource); + static::assertFalse($validResource); + } + /** * @dataProvider providePlatform * diff --git a/tests/ZipEventTest.php b/tests/ZipEventTest.php deleted file mode 100644 index 63cd426..0000000 --- a/tests/ZipEventTest.php +++ /dev/null @@ -1,41 +0,0 @@ -openFile(__DIR__ . '/resources/apk.zip'); - static::assertTrue(isset($zipFile['META-INF/MANIFEST.MF'])); - static::assertTrue(isset($zipFile['META-INF/CERT.SF'])); - static::assertTrue(isset($zipFile['META-INF/CERT.RSA'])); - // the "META-INF/" folder will be deleted when saved - // in the ZipFileExtended::onBeforeSave() method - $zipFile->saveAsFile($this->outputFilename); - static::assertFalse(isset($zipFile['META-INF/MANIFEST.MF'])); - static::assertFalse(isset($zipFile['META-INF/CERT.SF'])); - static::assertFalse(isset($zipFile['META-INF/CERT.RSA'])); - $zipFile->close(); - - static::assertCorrectZipArchive($this->outputFilename); - - $zipFile->openFile($this->outputFilename); - static::assertFalse(isset($zipFile['META-INF/MANIFEST.MF'])); - static::assertFalse(isset($zipFile['META-INF/CERT.SF'])); - static::assertFalse(isset($zipFile['META-INF/CERT.RSA'])); - $zipFile->close(); - } -} diff --git a/tests/ZipFileTest.php b/tests/ZipFileTest.php index b3c83c4..a864fec 100644 --- a/tests/ZipFileTest.php +++ b/tests/ZipFileTest.php @@ -2435,4 +2435,18 @@ class ZipFileTest extends ZipTestCase $zipFile->close(); } + + /** + * @throws ZipException + */ + public function testMultiSave() + { + $zipFile = new ZipFile(); + $zipFile['file 1'] = 'contents'; + for ($i = 0; $i < 10; $i++) { + $zipFile->saveAsFile($this->outputFilename); + self::assertCorrectZipArchive($this->outputFilename); + } + $zipFile->close(); + } } From 47161bdb0229a5655c65f07f840097fc778defba Mon Sep 17 00:00:00 2001 From: Ne-Lexa Date: Wed, 22 Jan 2020 12:48:47 +0300 Subject: [PATCH 3/7] zip extra fields tests --- .../Fields/AbstractUnicodeExtraFieldTest.php | 101 ++++++++ .../Fields/ApkAlignmentExtraFieldTest.php | 106 ++++++++ tests/Extra/Fields/AsiExtraFieldTest.php | 101 ++++++++ .../ExtendedTimestampExtraFieldTest.php | 158 +++++++++++ .../Extra/Fields/JarMarkerExtraFieldTest.php | 55 ++++ tests/Extra/Fields/NewUnixExtraFieldTest.php | 97 +++++++ tests/Extra/Fields/NtfsExtraFieldTest.php | 245 ++++++++++++++++++ tests/Extra/Fields/OldUnixExtraFieldTest.php | 156 +++++++++++ .../Fields/UnicodeCommentExtraFieldTest.php | 42 +++ .../Fields/UnicodePathExtraFieldTest.php | 56 ++++ .../Fields/UnrecognizedExtraFieldTest.php | 57 ++++ .../Extra/Fields/WinZipAesExtraFieldTest.php | 240 +++++++++++++++++ tests/Extra/Fields/Zip64ExtraFieldTest.php | 132 ++++++++++ 13 files changed, 1546 insertions(+) create mode 100644 tests/Extra/Fields/AbstractUnicodeExtraFieldTest.php create mode 100644 tests/Extra/Fields/ApkAlignmentExtraFieldTest.php create mode 100644 tests/Extra/Fields/AsiExtraFieldTest.php create mode 100644 tests/Extra/Fields/ExtendedTimestampExtraFieldTest.php create mode 100644 tests/Extra/Fields/JarMarkerExtraFieldTest.php create mode 100644 tests/Extra/Fields/NewUnixExtraFieldTest.php create mode 100644 tests/Extra/Fields/NtfsExtraFieldTest.php create mode 100644 tests/Extra/Fields/OldUnixExtraFieldTest.php create mode 100644 tests/Extra/Fields/UnicodeCommentExtraFieldTest.php create mode 100644 tests/Extra/Fields/UnicodePathExtraFieldTest.php create mode 100644 tests/Extra/Fields/UnrecognizedExtraFieldTest.php create mode 100644 tests/Extra/Fields/WinZipAesExtraFieldTest.php create mode 100644 tests/Extra/Fields/Zip64ExtraFieldTest.php diff --git a/tests/Extra/Fields/AbstractUnicodeExtraFieldTest.php b/tests/Extra/Fields/AbstractUnicodeExtraFieldTest.php new file mode 100644 index 0000000..2dd5ee4 --- /dev/null +++ b/tests/Extra/Fields/AbstractUnicodeExtraFieldTest.php @@ -0,0 +1,101 @@ + + */ + abstract protected function getUnicodeExtraFieldClassName(); + + /** + * @dataProvider provideExtraField + * + * @param int $crc32 + * @param string $unicodePath + * @param string $originalPath + * @param string $binaryData + * + * @throws ZipException + */ + public function testExtraField($crc32, $unicodePath, $originalPath, $binaryData) + { + $crc32 = (int) $crc32; // for php 32-bit + + $className = $this->getUnicodeExtraFieldClassName(); + + /** @var AbstractUnicodeExtraField $extraField */ + $extraField = new $className($crc32, $unicodePath); + static::assertSame($extraField->getCrc32(), $crc32); + static::assertSame($extraField->getUnicodeValue(), $unicodePath); + static::assertSame(crc32($originalPath), $crc32); + + static::assertSame($binaryData, $extraField->packLocalFileData()); + static::assertSame($binaryData, $extraField->packCentralDirData()); + static::assertEquals($className::unpackLocalFileData($binaryData), $extraField); + static::assertEquals($className::unpackCentralDirData($binaryData), $extraField); + } + + /** + * @return array + */ + abstract public function provideExtraField(); + + public function testSetter() + { + $className = $this->getUnicodeExtraFieldClassName(); + $entryName = '11111'; + + /** @var AbstractUnicodeExtraField $extraField */ + $extraField = new $className(crc32($entryName), '22222'); + static::assertSame($extraField->getHeaderId(), $className::HEADER_ID); + static::assertSame($extraField->getCrc32(), crc32($entryName)); + static::assertSame($extraField->getUnicodeValue(), '22222'); + + $crc32 = 1234567; + $extraField->setCrc32($crc32); + static::assertSame($extraField->getCrc32(), $crc32); + $extraField->setUnicodeValue('44444'); + static::assertSame($extraField->getUnicodeValue(), '44444'); + } + + /** + * @throws ZipException + */ + public function testUnicodeErrorParse() + { + $this->setExpectedException( + ZipException::class, + 'Unicode path extra data must have at least 5 bytes.' + ); + + $className = $this->getUnicodeExtraFieldClassName(); + $className::unpackLocalFileData(''); + } + + /** + * @throws ZipException + */ + public function testUnknownVersionParse() + { + $this->setExpectedException( + ZipException::class, + 'Unsupported version [2] for Unicode path extra data.' + ); + + $className = $this->getUnicodeExtraFieldClassName(); + $className::unpackLocalFileData("\x02\x04a\xD28\xC3\xA4\\\xC3\xBC.txt"); + } +} diff --git a/tests/Extra/Fields/ApkAlignmentExtraFieldTest.php b/tests/Extra/Fields/ApkAlignmentExtraFieldTest.php new file mode 100644 index 0000000..ddc68f5 --- /dev/null +++ b/tests/Extra/Fields/ApkAlignmentExtraFieldTest.php @@ -0,0 +1,106 @@ +getHeaderId(), ApkAlignmentExtraField::HEADER_ID); + self::assertSame($extraField->getMultiple(), $multiple); + self::assertSame($extraField->getPadding(), $padding); + + self::assertSame($extraField->packLocalFileData(), $binaryData); + self::assertSame($extraField->packCentralDirData(), $binaryData); + + self::assertEquals(ApkAlignmentExtraField::unpackLocalFileData($binaryData), $extraField); + self::assertEquals(ApkAlignmentExtraField::unpackCentralDirData($binaryData), $extraField); + + self::assertSame((string) $extraField, $toString); + } + + /** + * @return array + */ + public function provideExtraField() + { + return [ + [ + ApkAlignmentExtraField::ALIGNMENT_BYTES, + 0, + "\x04\x00", + '0xd935 APK Alignment: Multiple=4 Padding=0', + ], + [ + ApkAlignmentExtraField::ALIGNMENT_BYTES, + 1, + "\x04\x00\x00", + '0xd935 APK Alignment: Multiple=4 Padding=1', + ], + [ + ApkAlignmentExtraField::ALIGNMENT_BYTES, + 2, + "\x04\x00\x00\x00", + '0xd935 APK Alignment: Multiple=4 Padding=2', + ], + [ + ApkAlignmentExtraField::ALIGNMENT_BYTES, + 3, + "\x04\x00\x00\x00\x00", + '0xd935 APK Alignment: Multiple=4 Padding=3', + ], + [ + ApkAlignmentExtraField::COMMON_PAGE_ALIGNMENT_BYTES, + 4023, + "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", + '0xd935 APK Alignment: Multiple=4096 Padding=4023', + ], + ]; + } + + public function testSetter() + { + $extraField = new ApkAlignmentExtraField(ApkAlignmentExtraField::ALIGNMENT_BYTES, 3); + $extraField->setMultiple(ApkAlignmentExtraField::COMMON_PAGE_ALIGNMENT_BYTES); + self::assertSame($extraField->getMultiple(), ApkAlignmentExtraField::COMMON_PAGE_ALIGNMENT_BYTES); + $extraField->setPadding(1); + self::assertSame(1, $extraField->getPadding()); + } + + /** + * @throws ZipException + */ + public function testInvalidParse() + { + $this->setExpectedException( + ZipException::class, + 'Minimum 6 bytes of the extensible data block/field used for alignment of uncompressed entries.' + ); + + ApkAlignmentExtraField::unpackLocalFileData("\x04"); + } +} diff --git a/tests/Extra/Fields/AsiExtraFieldTest.php b/tests/Extra/Fields/AsiExtraFieldTest.php new file mode 100644 index 0000000..5360e87 --- /dev/null +++ b/tests/Extra/Fields/AsiExtraFieldTest.php @@ -0,0 +1,101 @@ +getHeaderId(), AsiExtraField::HEADER_ID); + + self::assertSame($asiExtraField->getMode(), $mode); + self::assertSame($asiExtraField->getUserId(), $uid); + self::assertSame($asiExtraField->getGroupId(), $uid); + self::assertSame($asiExtraField->getLink(), $link); + + self::assertSame($asiExtraField->packLocalFileData(), $binaryData); + self::assertSame($asiExtraField->packCentralDirData(), $binaryData); + + self::assertEquals(AsiExtraField::unpackLocalFileData($binaryData), $asiExtraField); + self::assertEquals(AsiExtraField::unpackCentralDirData($binaryData), $asiExtraField); + } + + /** + * @return array + */ + public function provideExtraField() + { + return [ + [ + 040755, + AsiExtraField::USER_GID_PID, + AsiExtraField::USER_GID_PID, + '', + "#\x06\\\xF6\xEDA\x00\x00\x00\x00\xE8\x03\xE8\x03", + ], + [ + 0100644, + 0, + 0, + 'sites-enabled/example.conf', + "_\xB8\xC7b\xA4\x81\x1A\x00\x00\x00\x00\x00\x00\x00sites-enabled/example.conf", + ], + ]; + } + + public function testSetter() + { + $extraField = new AsiExtraField(0777); + $extraField->setMode(0100666); + self::assertSame(0100666, $extraField->getMode()); + $extraField->setUserId(700); + self::assertSame(700, $extraField->getUserId()); + $extraField->setGroupId(500); + self::assertSame(500, $extraField->getGroupId()); + $extraField->setLink('link.txt'); + self::assertSame($extraField->getLink(), 'link.txt'); + self::assertSame(0120666, $extraField->getMode()); + + // dir mode + $extraField->setMode(0755); + self::assertSame(0120755, $extraField->getMode()); + $extraField->setLink(''); + self::assertSame($extraField->getLink(), ''); + self::assertSame(0100755, $extraField->getMode()); + } + + /** + * @throws Crc32Exception + */ + public function testInvalidParse() + { + $this->setExpectedException( + Crc32Exception::class, + 'Asi Unix Extra Filed Data (expected CRC32 value' + ); + + AsiExtraField::unpackLocalFileData("\x01\x06\\\xF6\xEDA\x00\x00\x00\x00\xE8\x03\xE8\x03"); + } +} diff --git a/tests/Extra/Fields/ExtendedTimestampExtraFieldTest.php b/tests/Extra/Fields/ExtendedTimestampExtraFieldTest.php new file mode 100644 index 0000000..0da3af5 --- /dev/null +++ b/tests/Extra/Fields/ExtendedTimestampExtraFieldTest.php @@ -0,0 +1,158 @@ +getHeaderId(), ExtendedTimestampExtraField::HEADER_ID); + self::assertSame($localExtraField->getFlags(), $flags); + self::assertSame($localExtraField->getModifyTime(), $modifyTime); + self::assertSame($localExtraField->getAccessTime(), $accessTime); + self::assertSame($localExtraField->getCreateTime(), $createTime); + self::assertSame($localExtraField->packLocalFileData(), $localData); + self::assertEquals(ExtendedTimestampExtraField::unpackLocalFileData($localData), $localExtraField); + + $extTimeField = ExtendedTimestampExtraField::create($modifyTime, $accessTime, $createTime); + self::assertEquals($extTimeField, $localExtraField); + + $accessTime = null; + $createTime = null; + $cdExtraField = new ExtendedTimestampExtraField($flags, $modifyTime, $accessTime, $createTime); + self::assertSame($cdExtraField->getHeaderId(), ExtendedTimestampExtraField::HEADER_ID); + self::assertSame($cdExtraField->getFlags(), $flags); + self::assertSame($cdExtraField->getModifyTime(), $modifyTime); + self::assertSame($cdExtraField->getAccessTime(), $accessTime); + self::assertSame($cdExtraField->getCreateTime(), $createTime); + self::assertSame($cdExtraField->packCentralDirData(), $cdData); + self::assertEquals(ExtendedTimestampExtraField::unpackCentralDirData($cdData), $cdExtraField); + self::assertSame($localExtraField->packCentralDirData(), $cdData); + } + + /** + * @return array + */ + public function provideExtraField() + { + return [ + [ + ExtendedTimestampExtraField::MODIFY_TIME_BIT | + ExtendedTimestampExtraField::ACCESS_TIME_BIT | + ExtendedTimestampExtraField::CREATE_TIME_BIT, + 911512006, + 911430000, + 893709400, + "\x07\xC6\x91T6pQS6X\xECD5", + "\x07\xC6\x91T6", + ], + [ + ExtendedTimestampExtraField::MODIFY_TIME_BIT | + ExtendedTimestampExtraField::ACCESS_TIME_BIT, + 1492955702, + 1492955638, + null, + "\x036\xB2\xFCX\xF6\xB1\xFCX", + "\x036\xB2\xFCX", + ], + [ + ExtendedTimestampExtraField::MODIFY_TIME_BIT, + 1470494391, + null, + null, + "\x01\xB7\xF6\xA5W", + "\x01\xB7\xF6\xA5W", + ], + ]; + } + + /** + * @throws \Exception + */ + public function testSetter() + { + $mtime = time(); + $atime = null; + $ctime = null; + + $field = ExtendedTimestampExtraField::create($mtime, $atime, $ctime); + self::assertSame($field->getFlags(), ExtendedTimestampExtraField::MODIFY_TIME_BIT); + self::assertSame($field->getModifyTime(), $mtime); + self::assertEquals($field->getModifyDateTime(), new \DateTimeImmutable('@' . $mtime)); + self::assertSame($field->getAccessTime(), $atime); + self::assertSame($field->getCreateTime(), $ctime); + + $atime = strtotime('-1 min'); + $field->setAccessTime($atime); + self::assertSame( + $field->getFlags(), + ExtendedTimestampExtraField::MODIFY_TIME_BIT | + ExtendedTimestampExtraField::ACCESS_TIME_BIT + ); + self::assertSame($field->getModifyTime(), $mtime); + self::assertSame($field->getAccessTime(), $atime); + self::assertEquals($field->getAccessDateTime(), new \DateTimeImmutable('@' . $atime)); + self::assertSame($field->getCreateTime(), $ctime); + + $ctime = strtotime('-1 hour'); + $field->setCreateTime($ctime); + self::assertSame( + $field->getFlags(), + ExtendedTimestampExtraField::MODIFY_TIME_BIT | + ExtendedTimestampExtraField::ACCESS_TIME_BIT | + ExtendedTimestampExtraField::CREATE_TIME_BIT + ); + self::assertSame($field->getModifyTime(), $mtime); + self::assertSame($field->getAccessTime(), $atime); + self::assertSame($field->getCreateTime(), $ctime); + self::assertEquals($field->getCreateDateTime(), new \DateTimeImmutable('@' . $ctime)); + + $field->setCreateTime(null); + self::assertNull($field->getCreateTime()); + self::assertNull($field->getCreateDateTime()); + self::assertSame( + $field->getFlags(), + ExtendedTimestampExtraField::MODIFY_TIME_BIT | + ExtendedTimestampExtraField::ACCESS_TIME_BIT + ); + + $field->setAccessTime(null); + self::assertNull($field->getAccessTime()); + self::assertNull($field->getAccessDateTime()); + self::assertSame($field->getFlags(), ExtendedTimestampExtraField::MODIFY_TIME_BIT); + + $field->setModifyTime(null); + self::assertNull($field->getModifyTime()); + self::assertNull($field->getModifyDateTime()); + self::assertSame($field->getFlags(), 0); + } +} diff --git a/tests/Extra/Fields/JarMarkerExtraFieldTest.php b/tests/Extra/Fields/JarMarkerExtraFieldTest.php new file mode 100644 index 0000000..2067215 --- /dev/null +++ b/tests/Extra/Fields/JarMarkerExtraFieldTest.php @@ -0,0 +1,55 @@ +packLocalFileData()); + self::assertSame('', $jarField->packCentralDirData()); + self::assertEquals(JarMarkerExtraField::unpackLocalFileData(''), $jarField); + self::assertEquals(JarMarkerExtraField::unpackCentralDirData(''), $jarField); + } + + /** + * @throws ZipException + */ + public function testInvalidUnpackLocalData() + { + $this->setExpectedException( + ZipException::class, + "JarMarker doesn't expect any data" + ); + + JarMarkerExtraField::unpackLocalFileData("\x02\x00\00"); + } + + /** + * @throws ZipException + */ + public function testInvalidUnpackCdData() + { + $this->setExpectedException( + ZipException::class, + "JarMarker doesn't expect any data" + ); + + JarMarkerExtraField::unpackCentralDirData("\x02\x00\00"); + } +} diff --git a/tests/Extra/Fields/NewUnixExtraFieldTest.php b/tests/Extra/Fields/NewUnixExtraFieldTest.php new file mode 100644 index 0000000..02cf159 --- /dev/null +++ b/tests/Extra/Fields/NewUnixExtraFieldTest.php @@ -0,0 +1,97 @@ +getHeaderId(), NewUnixExtraField::HEADER_ID); + self::assertSame($extraField->getVersion(), $version); + self::assertSame($extraField->getGid(), $gid); + self::assertSame($extraField->getUid(), $uid); + + self::assertEquals(NewUnixExtraField::unpackLocalFileData($binaryData), $extraField); + self::assertEquals(NewUnixExtraField::unpackCentralDirData($binaryData), $extraField); + + self::assertSame($extraField->packLocalFileData(), $binaryData); + self::assertSame($extraField->packCentralDirData(), $binaryData); + } + + /** + * @return array + */ + public function provideExtraField() + { + return [ + [ + 1, + NewUnixExtraField::USER_GID_PID, + NewUnixExtraField::USER_GID_PID, + "\x01\x04\xE8\x03\x00\x00\x04\xE8\x03\x00\x00", + ], + [ + 1, + 501, + 20, + "\x01\x04\xF5\x01\x00\x00\x04\x14\x00\x00\x00", + ], + [ + 1, + 500, + 495, + "\x01\x04\xF4\x01\x00\x00\x04\xEF\x01\x00\x00", + ], + [ + 1, + 11252, + 10545, + "\x01\x04\xF4+\x00\x00\x041)\x00\x00", + ], + [ + 1, + 1721, + 1721, + "\x01\x04\xB9\x06\x00\x00\x04\xB9\x06\x00\x00", + ], + ]; + } + + public function testSetter() + { + $extraField = new NewUnixExtraField(1, 1000, 1000); + self::assertSame(1, $extraField->getVersion()); + self::assertSame(1000, $extraField->getUid()); + self::assertSame(1000, $extraField->getGid()); + + $extraField->setUid(0); + self::assertSame(0, $extraField->getUid()); + self::assertSame(1000, $extraField->getGid()); + + $extraField->setGid(0); + self::assertSame(0, $extraField->getUid()); + self::assertSame(0, $extraField->getGid()); + } +} diff --git a/tests/Extra/Fields/NtfsExtraFieldTest.php b/tests/Extra/Fields/NtfsExtraFieldTest.php new file mode 100644 index 0000000..822a51f --- /dev/null +++ b/tests/Extra/Fields/NtfsExtraFieldTest.php @@ -0,0 +1,245 @@ +getHeaderId(), NtfsExtraField::HEADER_ID); + + self::assertEquals($extraField->getModifyDateTime()->getTimestamp(), (int) $modifyTimestamp); + self::assertEquals($extraField->getAccessDateTime()->getTimestamp(), (int) $accessTimestamp); + self::assertEquals($extraField->getCreateDateTime()->getTimestamp(), (int) $createTimestamp); + + self::assertEquals(NtfsExtraField::unpackLocalFileData($binaryData), $extraField); + self::assertEquals(NtfsExtraField::unpackCentralDirData($binaryData), $extraField); + + self::assertSame($extraField->packLocalFileData(), $binaryData); + self::assertSame($extraField->packCentralDirData(), $binaryData); + + $extraFieldFromDateTime = NtfsExtraField::create( + $extraField->getModifyDateTime(), + $extraField->getAccessDateTime(), + $extraField->getCreateDateTime() + ); + + self::assertEqualsIntegerWithDelta($extraFieldFromDateTime->getModifyNtfsTime(), $extraField->getModifyNtfsTime(), 100); + self::assertEqualsIntegerWithDelta($extraFieldFromDateTime->getAccessNtfsTime(), $extraField->getAccessNtfsTime(), 100); + self::assertEqualsIntegerWithDelta($extraFieldFromDateTime->getCreateNtfsTime(), $extraField->getCreateNtfsTime(), 100); + } + + /** + * @return array + */ + public function provideExtraField() + { + return [ + [ + 129853553114795379, + 129853553114795379, + 129853552641022547, + 1340881711.4795379, + 1340881711.4795379, + 1340881664.1022547, + "\x00\x00\x00\x00\x01\x00\x18\x00s\xCD:Z\x1EU\xCD\x01s\xCD:Z\x1EU\xCD\x01S\x9A\xFD=\x1EU\xCD\x01", + ], + [ + 131301570250000000, + 131865940850000000, + 131840940680000000, + 1485683425.000000, + 1542120485.000000, + 1539620468.000000, + "\x00\x00\x00\x00\x01\x00\x18\x00\x80\xC63\x1D\x15z\xD2\x01\x80@V\xE2_{\xD4\x01\x00\xB2\x15\x14\xA3d\xD4\x01", + ], + [ + 132181086710000000, + 132181086710000000, + 132181086710000000, + 1573635071.000000, + 1573635071.000000, + 1573635071.000000, + "\x00\x00\x00\x00\x01\x00\x18\x00\x80\xE9_\x7F\xFF\x99\xD5\x01\x80\xE9_\x7F\xFF\x99\xD5\x01\x80\xE9_\x7F\xFF\x99\xD5\x01", + ], + ]; + } + + /** + * @param int $expected + * @param int $actual + * @param int $delta + * @param string $message + */ + private static function assertEqualsIntegerWithDelta( + $expected, + $actual, + $delta, + $message = '' + ) { + self::assertSame( + self::roundInt($expected, $delta), + self::roundInt($actual, $delta), + $message + ); + } + + /** + * @param int $number + * @param int $delta + * + * @return int + */ + private static function roundInt($number, $delta) + { + return (int) (floor($number / $delta) * $delta); + } + + /** + * @dataProvider provideExtraField + * + * @param int $mtimeNtfs + * @param int $atimeNtfs + * @param int $ctimeNtfs + * @param float $mtimeTimestamp + * @param float $atimeTimestamp + * @param float $ctimeTimestamp + * + * @noinspection PhpTooManyParametersInspection + * @noinspection PhpUnitDeprecationsInspection + */ + public function testConverter( + $mtimeNtfs, + $atimeNtfs, + $ctimeNtfs, + $mtimeTimestamp, + $atimeTimestamp, + $ctimeTimestamp + ) { + self::assertEquals(NtfsExtraField::ntfsTimeToTimestamp($mtimeNtfs), $mtimeTimestamp, '', 0.00001); + self::assertEquals(NtfsExtraField::ntfsTimeToTimestamp($atimeNtfs), $atimeTimestamp, '', 0.00001); + self::assertEquals(NtfsExtraField::ntfsTimeToTimestamp($ctimeNtfs), $ctimeTimestamp, '', 0.00001); + + self::assertEqualsIntegerWithDelta(NtfsExtraField::timestampToNtfsTime($mtimeTimestamp), $mtimeNtfs, 10); + self::assertEqualsIntegerWithDelta(NtfsExtraField::timestampToNtfsTime($atimeTimestamp), $atimeNtfs, 10); + self::assertEqualsIntegerWithDelta(NtfsExtraField::timestampToNtfsTime($ctimeTimestamp), $ctimeNtfs, 10); + } + + /** + * @throws \Exception + */ + public function testSetter() + { + $timeZone = new \DateTimeZone('UTC'); + $initDateTime = new \DateTimeImmutable('-1 min', $timeZone); + $mtimeDateTime = new \DateTimeImmutable('-1 hour', $timeZone); + $atimeDateTime = new \DateTimeImmutable('-1 day', $timeZone); + $ctimeDateTime = new \DateTimeImmutable('-1 year', $timeZone); + + $extraField = NtfsExtraField::create($initDateTime, $initDateTime, $initDateTime); + self::assertEquals( + $extraField->getModifyDateTime()->getTimestamp(), + $initDateTime->getTimestamp() + ); + self::assertEquals( + $extraField->getAccessDateTime()->getTimestamp(), + $initDateTime->getTimestamp() + ); + self::assertEquals( + $extraField->getCreateDateTime()->getTimestamp(), + $initDateTime->getTimestamp() + ); + + $extraField->setModifyDateTime($mtimeDateTime); + self::assertEquals( + $extraField->getModifyDateTime()->getTimestamp(), + $mtimeDateTime->getTimestamp() + ); + self::assertEquals( + $extraField->getAccessDateTime()->getTimestamp(), + $initDateTime->getTimestamp() + ); + self::assertEquals( + $extraField->getCreateDateTime()->getTimestamp(), + $initDateTime->getTimestamp() + ); + + $extraField->setAccessDateTime($atimeDateTime); + self::assertEquals( + $extraField->getModifyDateTime()->getTimestamp(), + $mtimeDateTime->getTimestamp() + ); + self::assertEquals( + $extraField->getAccessDateTime()->getTimestamp(), + $atimeDateTime->getTimestamp() + ); + self::assertEquals( + $extraField->getCreateDateTime()->getTimestamp(), + $initDateTime->getTimestamp() + ); + + $extraField->setCreateDateTime($ctimeDateTime); + self::assertEquals( + $extraField->getModifyDateTime()->getTimestamp(), + $mtimeDateTime->getTimestamp() + ); + self::assertEquals( + $extraField->getAccessDateTime()->getTimestamp(), + $atimeDateTime->getTimestamp() + ); + self::assertEquals( + $extraField->getCreateDateTime()->getTimestamp(), + $ctimeDateTime->getTimestamp() + ); + + $newModifyNtfsTime = $extraField->getCreateNtfsTime(); + $newAccessNtfsTime = $extraField->getModifyNtfsTime(); + $newCreateNtfsTime = $extraField->getAccessNtfsTime(); + $extraField->setModifyNtfsTime($newModifyNtfsTime); + $extraField->setAccessNtfsTime($newAccessNtfsTime); + $extraField->setCreateNtfsTime($newCreateNtfsTime); + self::assertSame($extraField->getModifyNtfsTime(), $newModifyNtfsTime); + self::assertSame($extraField->getAccessNtfsTime(), $newAccessNtfsTime); + self::assertSame($extraField->getCreateNtfsTime(), $newCreateNtfsTime); + } +} diff --git a/tests/Extra/Fields/OldUnixExtraFieldTest.php b/tests/Extra/Fields/OldUnixExtraFieldTest.php new file mode 100644 index 0000000..bf0d78a --- /dev/null +++ b/tests/Extra/Fields/OldUnixExtraFieldTest.php @@ -0,0 +1,156 @@ +getHeaderId(), OldUnixExtraField::HEADER_ID); + + self::assertSame($extraField->getAccessTime(), $accessTime); + self::assertSame($extraField->getModifyTime(), $modifyTime); + self::assertSame($extraField->getUid(), $uid); + self::assertSame($extraField->getGid(), $gid); + + if ($extraField->getModifyTime() !== null) { + self::assertEquals( + new \DateTimeImmutable('@' . $extraField->getModifyTime()), + $extraField->getModifyDateTime() + ); + } + + if ($extraField->getAccessTime() !== null) { + self::assertEquals( + new \DateTimeImmutable('@' . $extraField->getAccessTime()), + $extraField->getAccessDateTime() + ); + } + + self::assertEquals(OldUnixExtraField::unpackLocalFileData($localBinaryData), $extraField); + self::assertSame($extraField->packLocalFileData(), $localBinaryData); + + $uid = null; + $gid = null; + $extraField = new OldUnixExtraField($accessTime, $modifyTime, $uid, $gid); + self::assertSame($extraField->getHeaderId(), OldUnixExtraField::HEADER_ID); + + self::assertSame($extraField->getAccessTime(), $accessTime); + self::assertSame($extraField->getModifyTime(), $modifyTime); + self::assertNull($extraField->getUid()); + self::assertNull($extraField->getGid()); + + if ($extraField->getModifyTime() !== null) { + self::assertEquals( + new \DateTimeImmutable('@' . $extraField->getModifyTime()), + $extraField->getModifyDateTime() + ); + } + + if ($extraField->getAccessTime() !== null) { + self::assertEquals( + new \DateTimeImmutable('@' . $extraField->getAccessTime()), + $extraField->getAccessDateTime() + ); + } + + self::assertEquals(OldUnixExtraField::unpackCentralDirData($cdBinaryData), $extraField); + self::assertSame($extraField->packCentralDirData(), $cdBinaryData); + } + + /** + * @return array + */ + public function provideExtraField() + { + return [ + [ + 1213373265, + 1213365834, + 502, + 502, + "Q\x9BRHJ~RH\xF6\x01\xF6\x01", + "Q\x9BRHJ~RH", + ], + [ + 935520420, + 935520401, + 501, + 100, + "\xA4\xE8\xC27\x91\xE8\xC27\xF5\x01d\x00", + "\xA4\xE8\xC27\x91\xE8\xC27", + ], + [ + 1402666135, + 1402666135, + 501, + 20, + "\x97\xFC\x9AS\x97\xFC\x9AS\xF5\x01\x14\x00", + "\x97\xFC\x9AS\x97\xFC\x9AS", + ], + [ + null, + null, + null, + null, + '', + '', + ], + ]; + } + + public function testSetter() + { + $extraField = new OldUnixExtraField(null, null, null, null); + + self::assertNull($extraField->getAccessTime()); + self::assertNull($extraField->getAccessDateTime()); + self::assertNull($extraField->getModifyTime()); + self::assertNull($extraField->getModifyDateTime()); + self::assertNull($extraField->getUid()); + self::assertNull($extraField->getGid()); + + $extraField->setModifyTime(1402666135); + self::assertSame($extraField->getModifyTime(), 1402666135); + + $extraField->setAccessTime(1213365834); + self::assertSame($extraField->getAccessTime(), 1213365834); + + $extraField->setUid(500); + self::assertSame($extraField->getUid(), 500); + + $extraField->setGid(100); + self::assertSame($extraField->getGid(), 100); + } +} diff --git a/tests/Extra/Fields/UnicodeCommentExtraFieldTest.php b/tests/Extra/Fields/UnicodeCommentExtraFieldTest.php new file mode 100644 index 0000000..a637111 --- /dev/null +++ b/tests/Extra/Fields/UnicodeCommentExtraFieldTest.php @@ -0,0 +1,42 @@ +getHeaderId(), $headerId); + self::assertSame($unrecognizedExtraField->getData(), $binaryData); + + $newHeaderId = 0xDADA; + $newBinaryData = "\x05\x00"; + $unrecognizedExtraField->setHeaderId($newHeaderId); + self::assertSame($unrecognizedExtraField->getHeaderId(), $newHeaderId); + $unrecognizedExtraField->setData($newBinaryData); + self::assertSame($unrecognizedExtraField->getData(), $newBinaryData); + + self::assertSame($unrecognizedExtraField->packLocalFileData(), $newBinaryData); + self::assertSame($unrecognizedExtraField->packCentralDirData(), $newBinaryData); + } + + public function testUnpackLocalData() + { + $this->setExpectedException( + RuntimeException::class, + 'Unsupport parse' + ); + + UnrecognizedExtraField::unpackLocalFileData("\x01\x02"); + } + + public function testUnpackCentralDirData() + { + $this->setExpectedException( + RuntimeException::class, + 'Unsupport parse' + ); + + UnrecognizedExtraField::unpackCentralDirData("\x01\x02"); + } +} diff --git a/tests/Extra/Fields/WinZipAesExtraFieldTest.php b/tests/Extra/Fields/WinZipAesExtraFieldTest.php new file mode 100644 index 0000000..70e7a69 --- /dev/null +++ b/tests/Extra/Fields/WinZipAesExtraFieldTest.php @@ -0,0 +1,240 @@ +getHeaderId(), WinZipAesExtraField::HEADER_ID); + self::assertSame($extraField->getVendorVersion(), $vendorVersion); + self::assertSame($extraField->getKeyStrength(), $keyStrength); + self::assertSame($extraField->getCompressionMethod(), $compressionMethod); + self::assertSame($extraField->getVendorId(), WinZipAesExtraField::VENDOR_ID); + self::assertSame($extraField->getSaltSize(), $saltSize); + + self::assertSame($binaryData, $extraField->packLocalFileData()); + self::assertSame($binaryData, $extraField->packCentralDirData()); + self::assertEquals(WinZipAesExtraField::unpackLocalFileData($binaryData), $extraField); + self::assertEquals(WinZipAesExtraField::unpackCentralDirData($binaryData), $extraField); + } + + /** + * @return array + */ + public function provideExtraField() + { + return [ + [ + WinZipAesExtraField::VERSION_AE1, + WinZipAesExtraField::KEY_STRENGTH_128BIT, + ZipCompressionMethod::STORED, + 8, + "\x01\x00AE\x01\x00\x00", + ], + [ + WinZipAesExtraField::VERSION_AE1, + WinZipAesExtraField::KEY_STRENGTH_192BIT, + ZipCompressionMethod::DEFLATED, + 12, + "\x01\x00AE\x02\x08\x00", + ], + [ + WinZipAesExtraField::VERSION_AE2, + WinZipAesExtraField::KEY_STRENGTH_128BIT, + ZipCompressionMethod::DEFLATED, + 8, + "\x02\x00AE\x01\x08\x00", + ], + [ + WinZipAesExtraField::VERSION_AE2, + WinZipAesExtraField::KEY_STRENGTH_256BIT, + ZipCompressionMethod::STORED, + 16, + "\x02\x00AE\x03\x00\x00", + ], + [ + WinZipAesExtraField::VERSION_AE2, + WinZipAesExtraField::KEY_STRENGTH_192BIT, + ZipCompressionMethod::DEFLATED, + 12, + "\x02\x00AE\x02\x08\x00", + ], + [ + WinZipAesExtraField::VERSION_AE2, + WinZipAesExtraField::KEY_STRENGTH_256BIT, + ZipCompressionMethod::STORED, + 16, + "\x02\x00AE\x03\x00\x00", + ], + ]; + } + + /** + * @throws ZipUnsupportMethodException + */ + public function testSetter() + { + $extraField = new WinZipAesExtraField( + WinZipAesExtraField::VERSION_AE1, + WinZipAesExtraField::KEY_STRENGTH_256BIT, + ZipCompressionMethod::DEFLATED + ); + + self::assertSame($extraField->getVendorVersion(), WinZipAesExtraField::VERSION_AE1); + self::assertSame($extraField->getKeyStrength(), WinZipAesExtraField::KEY_STRENGTH_256BIT); + self::assertSame($extraField->getCompressionMethod(), ZipCompressionMethod::DEFLATED); + self::assertSame($extraField->getSaltSize(), 16); + self::assertSame($extraField->getEncryptionStrength(), 256); + self::assertSame($extraField->getEncryptionMethod(), ZipEncryptionMethod::WINZIP_AES_256); + + $extraField->setVendorVersion(WinZipAesExtraField::VERSION_AE2); + self::assertSame($extraField->getVendorVersion(), WinZipAesExtraField::VERSION_AE2); + self::assertSame($extraField->getKeyStrength(), WinZipAesExtraField::KEY_STRENGTH_256BIT); + self::assertSame($extraField->getCompressionMethod(), ZipCompressionMethod::DEFLATED); + self::assertSame($extraField->getSaltSize(), 16); + self::assertSame($extraField->getEncryptionStrength(), 256); + self::assertSame($extraField->getEncryptionMethod(), ZipEncryptionMethod::WINZIP_AES_256); + + $extraField->setKeyStrength(WinZipAesExtraField::KEY_STRENGTH_128BIT); + self::assertSame($extraField->getVendorVersion(), WinZipAesExtraField::VERSION_AE2); + self::assertSame($extraField->getKeyStrength(), WinZipAesExtraField::KEY_STRENGTH_128BIT); + self::assertSame($extraField->getCompressionMethod(), ZipCompressionMethod::DEFLATED); + self::assertSame($extraField->getSaltSize(), 8); + self::assertSame($extraField->getEncryptionStrength(), 128); + self::assertSame($extraField->getEncryptionMethod(), ZipEncryptionMethod::WINZIP_AES_128); + + $extraField->setKeyStrength(WinZipAesExtraField::KEY_STRENGTH_192BIT); + self::assertSame($extraField->getVendorVersion(), WinZipAesExtraField::VERSION_AE2); + self::assertSame($extraField->getKeyStrength(), WinZipAesExtraField::KEY_STRENGTH_192BIT); + self::assertSame($extraField->getCompressionMethod(), ZipCompressionMethod::DEFLATED); + self::assertSame($extraField->getSaltSize(), 12); + self::assertSame($extraField->getEncryptionStrength(), 192); + self::assertSame($extraField->getEncryptionMethod(), ZipEncryptionMethod::WINZIP_AES_192); + + $extraField->setCompressionMethod(ZipCompressionMethod::STORED); + self::assertSame($extraField->getVendorVersion(), WinZipAesExtraField::VERSION_AE2); + self::assertSame($extraField->getKeyStrength(), WinZipAesExtraField::KEY_STRENGTH_192BIT); + self::assertSame($extraField->getCompressionMethod(), ZipCompressionMethod::STORED); + self::assertSame($extraField->getSaltSize(), 12); + self::assertSame($extraField->getEncryptionStrength(), 192); + self::assertSame($extraField->getEncryptionMethod(), ZipEncryptionMethod::WINZIP_AES_192); + } + + /** + * @throws ZipUnsupportMethodException + */ + public function testConstructUnsupportVendorVersion() + { + $this->setExpectedException(InvalidArgumentException::class, 'Unsupport WinZip AES vendor version: 3'); + + new WinZipAesExtraField( + 3, + WinZipAesExtraField::KEY_STRENGTH_192BIT, + ZipCompressionMethod::STORED + ); + } + + /** + * @throws ZipUnsupportMethodException + */ + public function testSetterUnsupportVendorVersion() + { + $this->setExpectedException(InvalidArgumentException::class, 'Unsupport WinZip AES vendor version: 3'); + + $extraField = new WinZipAesExtraField( + WinZipAesExtraField::VERSION_AE1, + WinZipAesExtraField::KEY_STRENGTH_192BIT, + ZipCompressionMethod::STORED + ); + $extraField->setVendorVersion(3); + } + + /** + * @throws ZipUnsupportMethodException + */ + public function testConstructUnsupportCompressionMethod() + { + $this->setExpectedException(ZipUnsupportMethodException::class, 'Compression method 3 (Reduced compression factor 2) is not supported.'); + + new WinZipAesExtraField( + WinZipAesExtraField::VERSION_AE1, + WinZipAesExtraField::KEY_STRENGTH_192BIT, + 3 + ); + } + + /** + * @throws ZipUnsupportMethodException + */ + public function testSetterUnsupportCompressionMethod() + { + $this->setExpectedException(ZipUnsupportMethodException::class, 'Compression method 3 (Reduced compression factor 2) is not supported.'); + + $extraField = new WinZipAesExtraField( + WinZipAesExtraField::VERSION_AE1, + WinZipAesExtraField::KEY_STRENGTH_192BIT, + ZipCompressionMethod::STORED + ); + $extraField->setCompressionMethod(3); + } + + /** + * @throws ZipUnsupportMethodException + */ + public function testConstructUnsupportKeyStrength() + { + $this->setExpectedException(InvalidArgumentException::class, 'Key strength 16 not support value. Allow values: 1, 2, 3'); + + new WinZipAesExtraField( + WinZipAesExtraField::VERSION_AE1, + 0x10, + ZipCompressionMethod::STORED + ); + } + + /** + * @throws ZipUnsupportMethodException + */ + public function testSetterUnsupportKeyStrength() + { + $this->setExpectedException(InvalidArgumentException::class, 'Key strength 16 not support value. Allow values: 1, 2, 3'); + + new WinZipAesExtraField( + WinZipAesExtraField::VERSION_AE1, + 0x10, + ZipCompressionMethod::STORED + ); + } +} diff --git a/tests/Extra/Fields/Zip64ExtraFieldTest.php b/tests/Extra/Fields/Zip64ExtraFieldTest.php new file mode 100644 index 0000000..815128d --- /dev/null +++ b/tests/Extra/Fields/Zip64ExtraFieldTest.php @@ -0,0 +1,132 @@ +getHeaderId(), Zip64ExtraField::HEADER_ID); + self::assertSame($extraField->getUncompressedSize(), $uncompressedSize); + self::assertSame($extraField->getCompressedSize(), $compressedSize); + self::assertSame($extraField->getLocalHeaderOffset(), $localHeaderOffset); + self::assertSame($extraField->getDiskStart(), $diskStart); + + $zipEntry = new ZipEntry('entry'); + $zipEntry->setUncompressedSize($uncompressedSize !== null ? ZipConstants::ZIP64_MAGIC : 0xfffff); + $zipEntry->setCompressedSize($compressedSize !== null ? ZipConstants::ZIP64_MAGIC : 0xffff); + $zipEntry->setLocalHeaderOffset($localHeaderOffset !== null ? ZipConstants::ZIP64_MAGIC : 0xfff); + + if ($localBinaryData !== null) { + self::assertSame($localBinaryData, $extraField->packLocalFileData()); + self::assertEquals(Zip64ExtraField::unpackLocalFileData($localBinaryData, $zipEntry), $extraField); + } + + if ($cdBinaryData !== null) { + self::assertSame($cdBinaryData, $extraField->packCentralDirData()); + self::assertEquals(Zip64ExtraField::unpackCentralDirData($cdBinaryData, $zipEntry), $extraField); + } + } + + /** + * @return array + */ + public function provideExtraField() + { + return [ + [ + 0, + 2, + null, + null, + "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", + null, + ], + [ + 5368709120, + 5369580144, + null, + null, + null, + "\x00\x00\x00@\x01\x00\x00\x00pJ\x0D@\x01\x00\x00\x00", + ], + [ + null, + null, + 4945378839, + null, + null, + "\x17~\xC4&\x01\x00\x00\x00", + ], + ]; + } + + public function testSetter() + { + $extraField = new Zip64ExtraField(); + self::assertNull($extraField->getUncompressedSize()); + self::assertNull($extraField->getCompressedSize()); + self::assertNull($extraField->getLocalHeaderOffset()); + self::assertNull($extraField->getDiskStart()); + + $uncompressedSize = 12222; + $extraField->setUncompressedSize($uncompressedSize); + self::assertSame($extraField->getUncompressedSize(), $uncompressedSize); + + $compressedSize = 12222; + $extraField->setCompressedSize($uncompressedSize); + self::assertSame($extraField->getCompressedSize(), $compressedSize); + + $localHeaderOffset = 12222; + $extraField->setLocalHeaderOffset($localHeaderOffset); + self::assertSame($extraField->getLocalHeaderOffset(), $localHeaderOffset); + + $diskStart = 2; + $extraField->setDiskStart($diskStart); + self::assertSame($extraField->getDiskStart(), $diskStart); + } +} From 8dcde4707296aacb279d3f6f5eb58537efadb128 Mon Sep 17 00:00:00 2001 From: Ne-Lexa Date: Wed, 22 Jan 2020 12:49:45 +0300 Subject: [PATCH 4/7] Added a new option for extracting unix symlinks. Added new parameter to get the list of extracted files. --- src/Constants/ZipOptions.php | 41 +++++++++++++++-- src/Util/FilesUtil.php | 32 ++++--------- src/ZipFile.php | 65 ++++++++++++++++---------- src/ZipFileInterface.php | 13 ++++-- tests/SymlinkTest.php | 88 ++++++++++++++++++++++++++++++++++++ tests/ZipFileTest.php | 27 +++++++---- 6 files changed, 201 insertions(+), 65 deletions(-) create mode 100644 tests/SymlinkTest.php diff --git a/src/Constants/ZipOptions.php b/src/Constants/ZipOptions.php index 25c88a7..c5d9671 100644 --- a/src/Constants/ZipOptions.php +++ b/src/Constants/ZipOptions.php @@ -2,6 +2,9 @@ namespace PhpZip\Constants; +use PhpZip\IO\ZipReader; +use PhpZip\ZipFile; + /** * Interface ZipOptions. */ @@ -10,20 +13,50 @@ interface ZipOptions /** * Boolean option for store just file names (skip directory names). * - * @var string + * @see ZipFile::addFromFinder() */ const STORE_ONLY_FILES = 'only_files'; - /** @var string */ + /** + * Uses the specified compression method. + * + * @see ZipFile::addFromFinder() + * @see ZipFile::addSplFile() + */ const COMPRESSION_METHOD = 'compression_method'; - /** @var string */ + /** + * Set the specified record modification time. + * The value can be {@see \DateTimeInterface}, integer timestamp + * or a string of any format. + * + * @see ZipFile::addFromFinder() + * @see ZipFile::addSplFile() + */ const MODIFIED_TIME = 'mtime'; /** - * @var string + * Specifies the encoding of the record name for cases when the UTF-8 + * usage flag is not set. * + * The most commonly used encodings are compiled into the constants + * of the {@see DosCodePage} class. + * + * @see ZipFile::openFile() + * @see ZipFile::openFromString() + * @see ZipFile::openFromStream() + * @see ZipReader::getDefaultOptions() * @see DosCodePage::getCodePages() */ const CHARSET = 'charset'; + + /** + * Allows ({@see true}) or denies ({@see false}) unpacking unix symlinks. + * + * This is a potentially dangerous operation for uncontrolled zip files. + * By default is ({@see false}). + * + * @see https://josipfranjkovic.blogspot.com/2014/12/reading-local-files-from-facebooks.html + */ + const EXTRACT_SYMLINKS = 'extract_symlinks'; } diff --git a/src/Util/FilesUtil.php b/src/Util/FilesUtil.php index 6b016e8..c29c471 100644 --- a/src/Util/FilesUtil.php +++ b/src/Util/FilesUtil.php @@ -43,9 +43,10 @@ final class FilesUtil \RecursiveIteratorIterator::CHILD_FIRST ); + /** @var \SplFileInfo $fileInfo */ foreach ($files as $fileInfo) { $function = ($fileInfo->isDir() ? 'rmdir' : 'unlink'); - $function($fileInfo->getRealPath()); + $function($fileInfo->getPathname()); } rmdir($dir); } @@ -303,36 +304,19 @@ final class FilesUtil } /** - * @param string $linkPath * @param string $target + * @param string $path + * @param bool $allowSymlink * * @return bool */ - public static function symlink($target, $linkPath) + public static function symlink($target, $path, $allowSymlink) { - if (\DIRECTORY_SEPARATOR === '\\') { - $linkPath = str_replace('/', '\\', $linkPath); - $target = str_replace('/', '\\', $target); - $abs = null; - - if (!self::isAbsolutePath($target)) { - $abs = realpath(\dirname($linkPath) . \DIRECTORY_SEPARATOR . $target); - - if (\is_string($abs)) { - $target = $abs; - } - } + if (\DIRECTORY_SEPARATOR === '\\' || !$allowSymlink) { + return file_put_contents($path, $target) !== false; } - if (!symlink($target, $linkPath)) { - if (\DIRECTORY_SEPARATOR === '\\' && is_file($target)) { - return copy($target, $linkPath); - } - - return false; - } - - return true; + return symlink($target, $path); } /** diff --git a/src/ZipFile.php b/src/ZipFile.php index 6bbee69..427c6aa 100644 --- a/src/ZipFile.php +++ b/src/ZipFile.php @@ -6,6 +6,7 @@ namespace PhpZip; +use PhpZip\Constants\UnixStat; use PhpZip\Constants\ZipCompressionLevel; use PhpZip\Constants\ZipCompressionMethod; use PhpZip\Constants\ZipEncryptionMethod; @@ -374,15 +375,20 @@ class ZipFile implements ZipFileInterface * * Extract the complete archive or the given files to the specified destination. * - * @param string $destDir location where to extract the files - * @param array|string|null $entries The entries to extract. It accepts either - * a single entry name or an array of names. + * @param string $destDir location where to extract the files + * @param array|string|null $entries entries to extract + * @param array $options extract options + * @param array $extractedEntries if the extractedEntries argument + * is present, then the specified + * array will be filled with + * information about the + * extracted entries * * @throws ZipException * * @return ZipFile */ - public function extractTo($destDir, $entries = null) + public function extractTo($destDir, $entries = null, array $options = [], &$extractedEntries = []) { if (!file_exists($destDir)) { throw new ZipException(sprintf('Destination %s not found', $destDir)); @@ -396,7 +402,14 @@ class ZipFile implements ZipFileInterface throw new ZipException('Destination is not writable directory'); } - $extractedEntries = []; + if ($extractedEntries === null) { + $extractedEntries = []; + } + + $defaultOptions = [ + ZipOptions::EXTRACT_SYMLINKS => false, + ]; + $options += $defaultOptions; $zipEntries = $this->zipContainer->getEntries(); @@ -497,9 +510,8 @@ class ZipFile implements ZipFileInterface unlink($file); throw $e; - } finally { - fclose($handle); } + fclose($handle); if ($unixMode === 0) { $unixMode = 0644; @@ -514,8 +526,10 @@ class ZipFile implements ZipFileInterface } } + $allowSymlink = (bool) $options[ZipOptions::EXTRACT_SYMLINKS]; + foreach ($symlinks as $linkPath => $target) { - if (!FilesUtil::symlink($target, $linkPath)) { + if (!FilesUtil::symlink($target, $linkPath, $allowSymlink)) { unset($extractedEntries[$linkPath]); } } @@ -526,7 +540,7 @@ class ZipFile implements ZipFileInterface touch($dir, $lastMod); } -// ksort($extractedEntries); + ksort($extractedEntries); return $this; } @@ -663,9 +677,24 @@ class ZipFile implements ZipFileInterface $entryName = $file->isDir() ? rtrim($entryName, '/\\') . '/' : $entryName; $zipEntry = new ZipEntry($entryName); - $zipData = null; + $zipEntry->setCreatedOS(ZipPlatform::OS_UNIX); + $zipEntry->setExtractedOS(ZipPlatform::OS_UNIX); - if ($file->isFile()) { + $zipData = null; + $filePerms = $file->getPerms(); + + if ($file->isLink()) { + $linkTarget = $file->getLinkTarget(); + $lengthLinkTarget = \strlen($linkTarget); + + $zipEntry->setCompressionMethod(ZipCompressionMethod::STORED); + $zipEntry->setUncompressedSize($lengthLinkTarget); + $zipEntry->setCompressedSize($lengthLinkTarget); + $zipEntry->setCrc(crc32($linkTarget)); + $filePerms |= UnixStat::UNX_IFLNK; + + $zipData = new ZipNewData($zipEntry, $linkTarget); + } elseif ($file->isFile()) { if (isset($options[ZipOptions::COMPRESSION_METHOD])) { $compressionMethod = $options[ZipOptions::COMPRESSION_METHOD]; } elseif ($file->getSize() < 512) { @@ -685,21 +714,9 @@ class ZipFile implements ZipFileInterface $zipEntry->setUncompressedSize(0); $zipEntry->setCompressedSize(0); $zipEntry->setCrc(0); - } elseif ($file->isLink()) { - $linkTarget = $file->getLinkTarget(); - $lengthLinkTarget = \strlen($linkTarget); - - $zipEntry->setCompressionMethod(ZipCompressionMethod::STORED); - $zipEntry->setUncompressedSize($lengthLinkTarget); - $zipEntry->setCompressedSize($lengthLinkTarget); - $zipEntry->setCrc(crc32($linkTarget)); - - $zipData = new ZipNewData($zipEntry, $linkTarget); } - $zipEntry->setCreatedOS(ZipPlatform::OS_UNIX); - $zipEntry->setExtractedOS(ZipPlatform::OS_UNIX); - $zipEntry->setUnixMode($file->getPerms()); + $zipEntry->setUnixMode($filePerms); $timestamp = null; diff --git a/src/ZipFileInterface.php b/src/ZipFileInterface.php index 1ba1850..07108d1 100644 --- a/src/ZipFileInterface.php +++ b/src/ZipFileInterface.php @@ -292,15 +292,20 @@ interface ZipFileInterface extends \Countable, \ArrayAccess, \Iterator * * Extract the complete archive or the given files to the specified destination. * - * @param string $destDir location where to extract the files - * @param array|string|null $entries The entries to extract. It accepts either - * a single entry name or an array of names. + * @param string $destDir location where to extract the files + * @param array|string|null $entries entries to extract + * @param array $options extract options + * @param array $extractedEntries if the extractedEntries argument + * is present, then the specified + * array will be filled with + * information about the + * extracted entries * * @throws ZipException * * @return ZipFile */ - public function extractTo($destDir, $entries = null); + public function extractTo($destDir, $entries = null, array $options = [], &$extractedEntries = []); /** * Add entry from the string. diff --git a/tests/SymlinkTest.php b/tests/SymlinkTest.php new file mode 100644 index 0000000..2731607 --- /dev/null +++ b/tests/SymlinkTest.php @@ -0,0 +1,88 @@ +outputDirname)) { + self::assertTrue(mkdir($this->outputDirname, 0755, true)); + } + + $contentsFile = random_bytes(100); + $filePath = $this->outputDirname . '/file.bin'; + $symlinkPath = $this->outputDirname . '/symlink.bin'; + $symlinkTarget = basename($filePath); + self::assertNotFalse(file_put_contents($filePath, $contentsFile)); + self::assertTrue(symlink($symlinkTarget, $symlinkPath)); + + $finder = (new Finder())->in($this->outputDirname); + $zipFile = new ZipFile(); + $zipFile->addFromFinder($finder); + $zipFile->saveAsFile($this->outputFilename); + $zipFile->close(); + + self::assertCorrectZipArchive($this->outputFilename); + + FilesUtil::removeDir($this->outputDirname); + self::assertFalse(is_dir($this->outputDirname)); + self::assertTrue(mkdir($this->outputDirname, 0755, true)); + + $zipFile->openFile($this->outputFilename); + $zipFile->extractTo($this->outputDirname, null, [ + ZipOptions::EXTRACT_SYMLINKS => $allowSymlink, + ]); + $zipFile->close(); + + $splFileInfo = new \SplFileInfo($symlinkPath); + + if ($allowSymlink) { + self::assertTrue($splFileInfo->isLink()); + self::assertSame($splFileInfo->getLinkTarget(), $symlinkTarget); + } else { + self::assertFalse($splFileInfo->isLink()); + self::assertStringEqualsFile($symlinkPath, $symlinkTarget); + } + } + + /** + * @return \Generator + */ + public function provideAllowSymlink() + { + yield 'allow' => [true]; + yield 'deny' => [false]; + } +} diff --git a/tests/ZipFileTest.php b/tests/ZipFileTest.php index a864fec..b51ed12 100644 --- a/tests/ZipFileTest.php +++ b/tests/ZipFileTest.php @@ -1009,16 +1009,16 @@ class ZipFileTest extends ZipTestCase 'test1.txt' => random_bytes(255), 'test2.txt' => random_bytes(255), 'test/test 2/test3.txt' => random_bytes(255), - 'test empty/dir' => null, + 'test empty/dir/' => null, ]; $zipFile = new ZipFile(); - foreach ($entries as $entryName => $value) { - if ($value === null) { + foreach ($entries as $entryName => $contents) { + if ($contents === null) { $zipFile->addEmptyDir($entryName); } else { - $zipFile->addFromString($entryName, $value); + $zipFile->addFromString($entryName, $contents); } } $zipFile->saveAsFile($this->outputFilename); @@ -1027,19 +1027,28 @@ class ZipFileTest extends ZipTestCase static::assertTrue(mkdir($this->outputDirname, 0755, true)); $zipFile->openFile($this->outputFilename); - $zipFile->extractTo($this->outputDirname); + $zipFile->extractTo($this->outputDirname, null, [], $extractedEntries); - foreach ($entries as $entryName => $value) { + foreach ($entries as $entryName => $contents) { $fullExtractedFilename = $this->outputDirname . \DIRECTORY_SEPARATOR . $entryName; - if ($value === null) { + static::assertTrue( + isset($extractedEntries[$fullExtractedFilename]), + 'No extract info for ' . $fullExtractedFilename + ); + + if ($contents === null) { static::assertTrue(is_dir($fullExtractedFilename)); static::assertTrue(FilesUtil::isEmptyDir($fullExtractedFilename)); } else { static::assertTrue(is_file($fullExtractedFilename)); $contents = file_get_contents($fullExtractedFilename); - static::assertSame($contents, $value); + static::assertSame($contents, $contents); } + + /** @var ZipEntry $entry */ + $entry = $extractedEntries[$fullExtractedFilename]; + static::assertSame($entry->getName(), $entryName); } $zipFile->close(); } @@ -2431,7 +2440,7 @@ class ZipFileTest extends ZipTestCase $zipFile->saveAsFile($this->outputFilename); $zipAfterBeforeWrite = $zipFile->getEntry('file 1'); - static::assertEquals($zipAfterBeforeWrite, $zipEntryBeforeWrite); + static::assertSame($zipAfterBeforeWrite, $zipEntryBeforeWrite); $zipFile->close(); } From 79e77a8c887ac650c54dae49047f953e0b6f9a06 Mon Sep 17 00:00:00 2001 From: Ne-Lexa Date: Wed, 22 Jan 2020 16:07:22 +0300 Subject: [PATCH 5/7] fix close container in ZipFile::close() --- src/ZipFile.php | 3 ++- tests/Zip64Test.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/ZipFile.php b/src/ZipFile.php index 427c6aa..b265a39 100644 --- a/src/ZipFile.php +++ b/src/ZipFile.php @@ -1797,8 +1797,9 @@ class ZipFile implements ZipFileInterface if ($this->reader !== null) { $this->reader->close(); $this->reader = null; - $this->zipContainer = $this->createZipContainer(null); } + $this->zipContainer = $this->createZipContainer(null); + gc_collect_cycles(); } /** diff --git a/tests/Zip64Test.php b/tests/Zip64Test.php index a87752f..d99e91f 100644 --- a/tests/Zip64Test.php +++ b/tests/Zip64Test.php @@ -2,6 +2,7 @@ namespace PhpZip\Tests; +use PhpZip\Constants\ZipCompressionMethod; use PhpZip\Exception\ZipException; use PhpZip\ZipFile; @@ -32,7 +33,7 @@ class Zip64Test extends ZipTestCase $zipFile = new ZipFile(); for ($i = 0; $i < $countFiles; $i++) { - $zipFile[$i . '.txt'] = (string) $i; + $zipFile->addFromString($i . '.txt', (string) $i, ZipCompressionMethod::STORED); } $zipFile->saveAsFile($this->outputFilename); $zipFile->close(); From 6e33ed08ef955f7545f90574fa0d5f1542d3c7b5 Mon Sep 17 00:00:00 2001 From: Ne-Lexa Date: Wed, 22 Jan 2020 16:26:24 +0300 Subject: [PATCH 6/7] run php 7.4 in xenial --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index cf612be..7256300 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,7 +39,7 @@ matrix: - php: 7.4 os: linux - dist: bionic + dist: xenial env: COVERAGE=true ZIPALIGN_INSTALL=true PHPUNIT_FLAGS="-v -c phpunit.xml --coverage-clover=coverage.clover" before_install: From 820c63c30fdb2780eb5e1f89b2dda898afa21372 Mon Sep 17 00:00:00 2001 From: Ne-Lexa Date: Fri, 31 Jan 2020 13:42:19 +0300 Subject: [PATCH 7/7] ZipInfo tests --- src/ZipFile.php | 6 +++ tests/ZipFileTest.php | 18 +++++++ tests/ZipInfoTest.php | 118 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 tests/ZipInfoTest.php diff --git a/src/ZipFile.php b/src/ZipFile.php index b265a39..7c3d012 100644 --- a/src/ZipFile.php +++ b/src/ZipFile.php @@ -142,7 +142,9 @@ class ZipFile implements ZipFileInterface } if (!($handle = fopen('php://temp', 'r+b'))) { + // @codeCoverageIgnoreStart throw new ZipException("Can't open temp stream."); + // @codeCoverageIgnoreEnd } fwrite($handle, $data); rewind($handle); @@ -459,7 +461,9 @@ class ZipFile implements ZipFileInterface } if (!mkdir($dir, $dirMode, true) && !is_dir($dir)) { + // @codeCoverageIgnoreStart throw new \RuntimeException(sprintf('Directory "%s" was not created', $dir)); + // @codeCoverageIgnoreEnd } chmod($dir, $dirMode); } @@ -495,6 +499,7 @@ class ZipFile implements ZipFileInterface /** @noinspection PhpUsageOfSilenceOperatorInspection */ if (!($handle = @fopen($file, 'w+b'))) { + // @codeCoverageIgnoreStart throw new ZipException( sprintf( 'Cannot extract zip entry %s. File %s cannot open for write.', @@ -502,6 +507,7 @@ class ZipFile implements ZipFileInterface $file ) ); + // @codeCoverageIgnoreEnd } try { diff --git a/tests/ZipFileTest.php b/tests/ZipFileTest.php index b51ed12..0f36686 100644 --- a/tests/ZipFileTest.php +++ b/tests/ZipFileTest.php @@ -2458,4 +2458,22 @@ class ZipFileTest extends ZipTestCase } $zipFile->close(); } + + public function testNoData() + { + $this->setExpectedException(ZipException::class, 'No data for zip entry file'); + + $entryName = 'file'; + + $zipFile = new ZipFile(); + + try { + $zipFile[$entryName] = ''; + $zipEntry = $zipFile->getEntry($entryName); + $zipEntry->setData(null); + $zipFile->getEntryContents($entryName); + } finally { + $zipFile->close(); + } + } } diff --git a/tests/ZipInfoTest.php b/tests/ZipInfoTest.php new file mode 100644 index 0000000..67957d6 --- /dev/null +++ b/tests/ZipInfoTest.php @@ -0,0 +1,118 @@ +getAllInfo(); + $zipFile->close(); + + self::assertCount(2, $zipAllInfo); + self::assertContainsOnlyInstancesOf(ZipInfo::class, $zipAllInfo); + } + + /** + * @throws ZipEntryNotFoundException + * @throws ZipException + */ + public function testZipEntryInfo() + { + $zipFile = new ZipFile(); + $zipFile['entry'] = 'contents'; + $zipFile['entry 2'] = 'contents'; + $zipInfo = $zipFile->getEntryInfo('entry'); + $zipFile->close(); + + self::assertInstanceOf(ZipInfo::class, $zipInfo); + } + + /** + * @throws ZipEntryNotFoundException + * @throws ZipException + */ + public function testZipInfoEntryNotFound() + { + $this->setExpectedException( + ZipEntryNotFoundException::class, + 'Zip Entry "unknown.name" was not found in the archive.' + ); + + $zipFile = new ZipFile(); + $zipFile->getEntryInfo('unknown.name'); + } + + /** + * @throws ZipEntryNotFoundException + * @throws ZipException + */ + public function testZipInfo() + { + $zipFile = new ZipFile(); + $zipFile->openFile(__DIR__ . '/resources/Advanced-v1.0.0.epub'); + $entryName = 'META-INF/container.xml'; + $zipEntry = $zipFile->getEntry($entryName); + $zipInfo = $zipFile->getEntryInfo($entryName); + $zipFile->close(); + + self::assertSame($zipInfo->getName(), $zipEntry->getName()); + self::assertSame($zipInfo->isFolder(), $zipEntry->isDirectory()); + self::assertSame($zipInfo->getSize(), $zipEntry->getUncompressedSize()); + self::assertSame($zipInfo->getCompressedSize(), $zipEntry->getCompressedSize()); + self::assertSame($zipInfo->getMtime(), $zipEntry->getMTime()->getTimestamp()); + self::assertSame( + $zipInfo->getCtime(), + $zipEntry->getCTime() !== null ? $zipEntry->getCTime()->getTimestamp() : null + ); + self::assertSame( + $zipInfo->getAtime(), + $zipEntry->getATime() !== null ? $zipEntry->getATime()->getTimestamp() : null + ); + self::assertNotEmpty($zipInfo->getAttributes()); + self::assertSame($zipInfo->isEncrypted(), $zipEntry->isEncrypted()); + self::assertSame($zipInfo->getComment(), $zipEntry->getComment()); + self::assertSame($zipInfo->getCrc(), $zipEntry->getCrc()); + self::assertSame( + $zipInfo->getMethod(), + ZipCompressionMethod::getCompressionMethodName($zipEntry->getCompressionMethod()) + ); + self::assertSame( + $zipInfo->getMethodName(), + ZipCompressionMethod::getCompressionMethodName($zipEntry->getCompressionMethod()) + ); + self::assertSame( + $zipInfo->getEncryptionMethodName(), + ZipEncryptionMethod::getEncryptionMethodName($zipEntry->getEncryptionMethod()) + ); + self::assertSame($zipInfo->getPlatform(), ZipPlatform::getPlatformName($zipEntry->getExtractedOS())); + self::assertSame(ZipInfo::getPlatformName($zipEntry), ZipPlatform::getPlatformName($zipEntry->getExtractedOS())); + self::assertSame($zipInfo->getVersion(), $zipEntry->getExtractVersion()); + self::assertNull($zipInfo->getEncryptionMethod()); + self::assertSame($zipInfo->getCompressionLevel(), $zipEntry->getCompressionLevel()); + self::assertSame($zipInfo->getCompressionMethod(), $zipEntry->getCompressionMethod()); + self::assertNotEmpty($zipInfo->toArray()); + + self::assertSame((string) $zipInfo, 'PhpZip\Model\ZipInfo {Name="META-INF/container.xml", Size="249 bytes", Compressed size="169 bytes", Modified time="2019-04-08T14:59:08+00:00", Comment="", Method name="Deflated", Attributes="------", Platform="MS-DOS", Version=20}'); + } +}