ZipAlignTest.php 4.2 KB

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