ZipAlignTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. <?php
  2. namespace PhpZip;
  3. use PhpZip\Util\CryptoUtil;
  4. /**
  5. * Test ZipAlign
  6. */
  7. class ZipAlignTest extends ZipTestCase
  8. {
  9. public function testApkAlignedAndReSave()
  10. {
  11. $filename = __DIR__ . '/resources/test.apk';
  12. self::assertCorrectZipArchive($filename);
  13. self::doZipAlignVerify($this->outputFilename);
  14. $zipFile = new ZipFile();
  15. $zipFile->openFile($filename);
  16. $zipFile->saveAsFile($this->outputFilename);
  17. $zipFile->close();
  18. self::assertCorrectZipArchive($this->outputFilename);
  19. self::doZipAlignVerify($this->outputFilename);
  20. }
  21. public function testApkAlignedAndSetZipAlignAndReSave()
  22. {
  23. $filename = __DIR__ . '/resources/test.apk';
  24. self::assertCorrectZipArchive($filename);
  25. self::doZipAlignVerify($this->outputFilename);
  26. $zipFile = new ZipFile();
  27. $zipFile->openFile($filename);
  28. $zipFile->setZipAlign(4);
  29. $zipFile->saveAsFile($this->outputFilename);
  30. $zipFile->close();
  31. self::assertCorrectZipArchive($this->outputFilename);
  32. self::doZipAlignVerify($this->outputFilename);
  33. }
  34. /**
  35. * Test zip alignment.
  36. */
  37. public function testZipAlignSourceZip()
  38. {
  39. $zipFile = new ZipFile();
  40. for ($i = 0; $i < 100; $i++) {
  41. $zipFile->addFromString(
  42. 'entry' . $i . '.txt',
  43. CryptoUtil::randomBytes(mt_rand(100, 4096)),
  44. ZipFileInterface::METHOD_STORED
  45. );
  46. }
  47. $zipFile->saveAsFile($this->outputFilename);
  48. $zipFile->close();
  49. self::assertCorrectZipArchive($this->outputFilename);
  50. $result = self::doZipAlignVerify($this->outputFilename);
  51. if ($result === null) {
  52. return;
  53. } // zip align not installed
  54. // check not zip align
  55. self::assertFalse($result);
  56. $zipFile->openFile($this->outputFilename);
  57. $zipFile->setZipAlign(4);
  58. $zipFile->saveAsFile($this->outputFilename);
  59. $zipFile->close();
  60. self::assertCorrectZipArchive($this->outputFilename);
  61. $result = self::doZipAlignVerify($this->outputFilename, true);
  62. self::assertNotNull($result);
  63. // check zip align
  64. self::assertTrue($result);
  65. }
  66. public function testZipAlignNewFiles()
  67. {
  68. $zipFile = new ZipFile();
  69. for ($i = 0; $i < 100; $i++) {
  70. $zipFile->addFromString(
  71. 'entry' . $i . '.txt',
  72. CryptoUtil::randomBytes(mt_rand(100, 4096)),
  73. ZipFileInterface::METHOD_STORED
  74. );
  75. }
  76. $zipFile->setZipAlign(4);
  77. $zipFile->saveAsFile($this->outputFilename);
  78. $zipFile->close();
  79. self::assertCorrectZipArchive($this->outputFilename);
  80. $result = self::doZipAlignVerify($this->outputFilename);
  81. if ($result === null) {
  82. return;
  83. } // zip align not installed
  84. // check not zip align
  85. self::assertTrue($result);
  86. }
  87. public function testZipAlignFromModifiedZipArchive()
  88. {
  89. $zipFile = new ZipFile();
  90. for ($i = 0; $i < 100; $i++) {
  91. $zipFile->addFromString(
  92. 'entry' . $i . '.txt',
  93. CryptoUtil::randomBytes(mt_rand(100, 4096)),
  94. ZipFileInterface::METHOD_STORED
  95. );
  96. }
  97. $zipFile->saveAsFile($this->outputFilename);
  98. $zipFile->close();
  99. self::assertCorrectZipArchive($this->outputFilename);
  100. $result = self::doZipAlignVerify($this->outputFilename);
  101. if ($result === null) {
  102. return;
  103. } // zip align not installed
  104. // check not zip align
  105. self::assertFalse($result);
  106. $zipFile->openFile($this->outputFilename);
  107. $zipFile->deleteFromRegex("~entry2[\d]+\.txt$~s");
  108. for ($i = 0; $i < 100; $i++) {
  109. $isStored = (bool)mt_rand(0, 1);
  110. $zipFile->addFromString(
  111. 'entry_new_' . ($isStored ? 'stored' : 'deflated') . '_' . $i . '.txt',
  112. CryptoUtil::randomBytes(mt_rand(100, 4096)),
  113. $isStored ?
  114. ZipFileInterface::METHOD_STORED :
  115. ZipFileInterface::METHOD_DEFLATED
  116. );
  117. }
  118. $zipFile->setZipAlign(4);
  119. $zipFile->saveAsFile($this->outputFilename);
  120. $zipFile->close();
  121. self::assertCorrectZipArchive($this->outputFilename);
  122. $result = self::doZipAlignVerify($this->outputFilename, true);
  123. self::assertNotNull($result);
  124. // check zip align
  125. self::assertTrue($result);
  126. }
  127. }