From 08c890ba24143e6bff24b8ebd437ede047985403 Mon Sep 17 00:00:00 2001
From: Ne-Lexa <alexey@nelexa.ru>
Date: Fri, 10 Mar 2017 19:03:59 +0300
Subject: [PATCH] Add tests

---
 src/PhpZip/ZipFile.php       | 11 +++--
 tests/PhpZip/ZipFileTest.php | 91 +++++++++++++++++++++++++++++++++++-
 2 files changed, 96 insertions(+), 6 deletions(-)

diff --git a/src/PhpZip/ZipFile.php b/src/PhpZip/ZipFile.php
index 8d924a9..acbe97d 100644
--- a/src/PhpZip/ZipFile.php
+++ b/src/PhpZip/ZipFile.php
@@ -498,8 +498,7 @@ class ZipFile implements \Countable, \ArrayAccess, \Iterator
             } else {
                 $compressionMethod = self::METHOD_STORED;
             }
-        }
-        elseif (!in_array($compressionMethod, self::$allowCompressionMethods, true)) {
+        } elseif (!in_array($compressionMethod, self::$allowCompressionMethods, true)) {
             throw new ZipUnsupportMethod('Unsupported method ' . $compressionMethod);
         }
 
@@ -860,12 +859,12 @@ class ZipFile implements \Countable, \ArrayAccess, \Iterator
         $filename = (string)$filename;
 
         $tempFilename = $filename . '.temp' . uniqid();
-        if (!($handle = fopen($tempFilename, 'w+b'))) {
+        if (!($handle = @fopen($tempFilename, 'w+b'))) {
             throw new InvalidArgumentException("File " . $tempFilename . ' can not open from write.');
         }
         $this->saveAsStream($handle);
 
-        if (!rename($tempFilename, $filename)) {
+        if (!@rename($tempFilename, $filename)) {
             throw new ZipException('Can not move ' . $tempFilename . ' to ' . $filename);
         }
     }
@@ -999,6 +998,10 @@ class ZipFile implements \Countable, \ArrayAccess, \Iterator
         if ($entryName === null) {
             throw new InvalidArgumentException('entryName is null');
         }
+        $entryName = (string)$entryName;
+        if (strlen($entryName) === 0) {
+            throw new InvalidArgumentException('entryName is empty');
+        }
         if ($entryName[strlen($entryName) - 1] === '/') {
             $this->addEmptyDir($entryName);
         } else {
diff --git a/tests/PhpZip/ZipFileTest.php b/tests/PhpZip/ZipFileTest.php
index 7834f42..714cfea 100644
--- a/tests/PhpZip/ZipFileTest.php
+++ b/tests/PhpZip/ZipFileTest.php
@@ -531,6 +531,24 @@ class ZipFileTest extends ZipTestCase
         $zipFile->close();
     }
 
+    /**
+     * @expectedException \PhpZip\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Glob pattern is empty
+     */
+    public function testDeleteFromGlobFailNull(){
+        $zipFile = new ZipFile();
+        $zipFile->deleteFromGlob(null);
+    }
+
+    /**
+     * @expectedException \PhpZip\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Glob pattern is empty
+     */
+    public function testDeleteFromGlobFailEmpty(){
+        $zipFile = new ZipFile();
+        $zipFile->deleteFromGlob('');
+    }
+
     /**
      * Delete entries from regex pattern
      */
@@ -558,6 +576,24 @@ class ZipFileTest extends ZipTestCase
         $zipFile->close();
     }
 
+    /**
+     * @expectedException \PhpZip\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Regex pattern is empty.
+     */
+    public function testDeleteFromRegexFailNull(){
+        $zipFile = new ZipFile();
+        $zipFile->deleteFromRegex(null);
+    }
+
+    /**
+     * @expectedException \PhpZip\Exception\InvalidArgumentException
+     * @expectedExceptionMessage Regex pattern is empty.
+     */
+    public function testDeleteFromRegexFailEmpty(){
+        $zipFile = new ZipFile();
+        $zipFile->deleteFromRegex('');
+    }
+
     /**
      * Delete all entries
      */
@@ -1015,6 +1051,26 @@ class ZipFileTest extends ZipTestCase
         $zipFile->close();
     }
 
+    /**
+     * @expectedException \PhpZip\Exception\InvalidArgumentException
+     * @expectedExceptionMessage entryName is null
+     */
+    public function testAddFromArrayAccessNullName()
+    {
+        $zipFile = new ZipFile();
+        $zipFile[null] = 'content';
+    }
+
+    /**
+     * @expectedException \PhpZip\Exception\InvalidArgumentException
+     * @expectedExceptionMessage entryName is empty
+     */
+    public function testAddFromArrayAccessEmptyName()
+    {
+        $zipFile = new ZipFile();
+        $zipFile[''] = 'content';
+    }
+
     /**
      * @expectedException \PhpZip\Exception\InvalidArgumentException
      * @expectedExceptionMessage Contents is null
@@ -1191,6 +1247,35 @@ class ZipFileTest extends ZipTestCase
         $zipFile->addFile($this->outputFilename);
     }
 
+    /**
+     * @expectedException \PhpZip\Exception\InvalidArgumentException
+     * @expectedExceptionMessage handle is not resource
+     */
+    public function testSaveAsStreamBadStream()
+    {
+        $zipFile = new ZipFile();
+        $zipFile->saveAsStream("bad stream");
+    }
+
+    /**
+     * @expectedException \PhpZip\Exception\InvalidArgumentException
+     * @expectedExceptionMessage can not open from write
+     */
+    public function testSaveAsFileNotWritable()
+    {
+        $this->outputFilename = sys_get_temp_dir() . '/zipExtractTest';
+        if (is_dir($this->outputFilename)) {
+            FilesUtil::removeDir($this->outputFilename);
+        }
+        self::assertTrue(mkdir($this->outputFilename, 0444, true));
+        self::assertTrue(chmod($this->outputFilename, 0444));
+
+        $this->outputFilename .= '/' . uniqid() . '.zip';
+
+        $zipFile = new ZipFile();
+        $zipFile->saveAsFile($this->outputFilename);
+    }
+
     /**
      * Test `ZipFile` implemented \ArrayAccess, \Countable and |iterator.
      */
@@ -1280,7 +1365,8 @@ class ZipFileTest extends ZipTestCase
      * @expectedException \PhpZip\Exception\InvalidArgumentException
      * @expectedExceptionMessage DirName empty
      */
-    public function testAddEmptyDirNullName(){
+    public function testAddEmptyDirNullName()
+    {
         $zipFile = new ZipFile();
         $zipFile->addEmptyDir(null);
     }
@@ -1289,7 +1375,8 @@ class ZipFileTest extends ZipTestCase
      * @expectedException \PhpZip\Exception\InvalidArgumentException
      * @expectedExceptionMessage DirName empty
      */
-    public function testAddEmptyDirEmptyName(){
+    public function testAddEmptyDirEmptyName()
+    {
         $zipFile = new ZipFile();
         $zipFile->addEmptyDir("");
     }