1
0
mirror of https://github.com/Ne-Lexa/php-zip.git synced 2025-08-04 06:27:23 +02:00

Improved Windows compatibility, fix #54

This commit is contained in:
wapplay
2020-07-11 23:04:33 +03:00
parent 0655e282e9
commit c10c425f7e
13 changed files with 300 additions and 149 deletions

View File

@@ -34,7 +34,7 @@ class ZipFileTest extends ZipTestCase
$this->setExpectedException(ZipException::class, 'does not exist');
$zipFile = new ZipFile();
$zipFile->openFile(uniqid('', true));
$zipFile->openFile(uniqid('', false));
}
/**
@@ -42,12 +42,16 @@ class ZipFileTest extends ZipTestCase
*/
public function testOpenFileCantOpen()
{
$this->setExpectedException(ZipException::class, 'can\'t open');
if (static::skipTestForWindows()) {
return;
}
if (static::skipTestForRootUser()) {
return;
}
$this->setExpectedException(ZipException::class, 'can\'t open');
static::assertNotFalse(file_put_contents($this->outputFilename, 'content'));
static::assertTrue(chmod($this->outputFilename, 0222));
@@ -1031,7 +1035,12 @@ class ZipFileTest extends ZipTestCase
$zipFile->extractTo($this->outputDirname, null, [], $extractedEntries);
foreach ($entries as $entryName => $contents) {
$fullExtractedFilename = $this->outputDirname . \DIRECTORY_SEPARATOR . $entryName;
$name = $entryName;
if (\DIRECTORY_SEPARATOR === '\\') {
$name = str_replace('/', '\\', $name);
}
$fullExtractedFilename = $this->outputDirname . \DIRECTORY_SEPARATOR . $name;
static::assertTrue(
isset($extractedEntries[$fullExtractedFilename]),
@@ -1393,14 +1402,18 @@ class ZipFileTest extends ZipTestCase
/**
* @throws ZipException
*/
public function testAddFileCantOpen()
public function testAddFileCannotOpen()
{
$this->setExpectedException(InvalidArgumentException::class, 'is not readable');
if (static::skipTestForWindows()) {
return;
}
if (static::skipTestForRootUser()) {
return;
}
$this->setExpectedException(InvalidArgumentException::class, 'is not readable');
static::assertNotFalse(file_put_contents($this->outputFilename, ''));
static::assertTrue(chmod($this->outputFilename, 0244));
@@ -1438,7 +1451,7 @@ class ZipFileTest extends ZipTestCase
$this->setExpectedException(InvalidArgumentException::class, 'does not exist');
$zipFile = new ZipFile();
$zipFile->addDir(uniqid('', true));
$zipFile->addDir(uniqid('', false));
}
/**
@@ -1471,7 +1484,7 @@ class ZipFileTest extends ZipTestCase
$this->setExpectedException(InvalidArgumentException::class, 'does not exist');
$zipFile = new ZipFile();
$zipFile->addDirRecursive(uniqid('', true));
$zipFile->addDirRecursive(uniqid('', false));
}
/**
@@ -1711,7 +1724,9 @@ class ZipFileTest extends ZipTestCase
*/
public function testSaveAsFileNotWritable()
{
$this->setExpectedException(InvalidArgumentException::class, 'can not open from write');
if (static::skipTestForWindows()) {
return;
}
if (static::skipTestForRootUser()) {
return;
@@ -1722,6 +1737,8 @@ class ZipFileTest extends ZipTestCase
$this->outputFilename = $this->outputDirname . \DIRECTORY_SEPARATOR . basename($this->outputFilename);
$this->setExpectedExceptionRegExp(InvalidArgumentException::class, '~Cannot open ".*?" for writing.~');
$zipFile = new ZipFile();
$zipFile->saveAsFile($this->outputFilename);
}
@@ -1877,7 +1894,7 @@ class ZipFileTest extends ZipTestCase
*/
public function testAddEmptyDirNullName()
{
$this->setExpectedException(InvalidArgumentException::class, 'Dir name is null');
$this->setExpectedException(InvalidArgumentException::class, 'Entry name is null');
$zipFile = new ZipFile();
$zipFile->addEmptyDir(null);
@@ -1888,7 +1905,7 @@ class ZipFileTest extends ZipTestCase
*/
public function testAddEmptyDirEmptyName()
{
$this->setExpectedException(InvalidArgumentException::class, 'Empty dir name');
$this->setExpectedException(InvalidArgumentException::class, 'Empty entry name');
$zipFile = new ZipFile();
$zipFile->addEmptyDir('');
@@ -1947,12 +1964,21 @@ class ZipFileTest extends ZipTestCase
$zipFile = new ZipFile();
$zipFile['file'] = 'content';
$zipFile['file2'] = 'content2';
$zipFile->saveAsFile($this->outputFilename);
$zipFile->close();
$zipFile->openFromString(file_get_contents($this->outputFilename));
$zipFile['file2'] = 'content 2';
$zipFile->rewrite();
static::assertSame(\count($zipFile), 2);
static::assertTrue(isset($zipFile['file']));
static::assertTrue(isset($zipFile['file2']));
$zipFile['file3'] = 'content3';
$zipFile = $zipFile->rewrite();
static::assertSame(\count($zipFile), 3);
static::assertTrue(isset($zipFile['file']));
static::assertTrue(isset($zipFile['file2']));
static::assertTrue(isset($zipFile['file3']));
$zipFile->close();
}
/**
@@ -1966,6 +1992,87 @@ class ZipFileTest extends ZipTestCase
$zipFile->rewrite();
}
/**
* Checks the ability to overwrite an open zip file with a relative path.
*
* @throws ZipException
*/
public function testRewriteRelativeFile()
{
$zipFile = new ZipFile();
$zipFile['entry.txt'] = 'test';
$zipFile->saveAsFile($this->outputFilename);
$zipFile->close();
$outputDirname = \dirname($this->outputFilename);
static::assertTrue(chdir($outputDirname));
$relativeFilename = basename($this->outputFilename);
$zipFile->openFile($this->outputFilename);
$zipFile['entry2.txt'] = 'test';
$zipFile->saveAsFile($relativeFilename);
$zipFile->close();
self::assertCorrectZipArchive($this->outputFilename);
}
/**
* Checks the ability to overwrite an open zip file with a relative path.
*
* @throws ZipException
*/
public function testRewriteDifferentWinDirectorySeparator()
{
if (\DIRECTORY_SEPARATOR !== '\\') {
static::markTestSkipped('Windows test only');
return;
}
$zipFile = new ZipFile();
$zipFile['entry.txt'] = 'test';
$zipFile->saveAsFile($this->outputFilename);
$zipFile->close();
$alternativeOutputFilename = str_replace('\\', '/', $this->outputFilename);
self::assertCorrectZipArchive($alternativeOutputFilename);
$zipFile->openFile($this->outputFilename);
$zipFile['entry2.txt'] = 'test';
$zipFile->saveAsFile($alternativeOutputFilename);
$zipFile->close();
self::assertCorrectZipArchive($alternativeOutputFilename);
$zipFile->openFile($this->outputFilename);
static::assertCount(2, $zipFile);
$zipFile->close();
}
/**
* @throws ZipException
*/
public function testRewriteRelativeFile2()
{
$this->outputFilename = basename($this->outputFilename);
$zipFile = new ZipFile();
$zipFile['entry.txt'] = 'test';
$zipFile->saveAsFile($this->outputFilename);
$zipFile->close();
$absoluteOutputFilename = getcwd() . \DIRECTORY_SEPARATOR . $this->outputFilename;
self::assertCorrectZipArchive($absoluteOutputFilename);
$zipFile->openFile($this->outputFilename);
$zipFile['entry2.txt'] = 'test';
$zipFile->saveAsFile($absoluteOutputFilename);
$zipFile->close();
self::assertCorrectZipArchive($absoluteOutputFilename);
}
/**
* @throws ZipException
*/