AbstractUnicodeExtraFieldTest.php 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. <?php
  2. /** @noinspection PhpUndefinedMethodInspection */
  3. namespace PhpZip\Tests\Extra\Fields;
  4. use PHPUnit\Framework\TestCase;
  5. use PhpZip\Exception\ZipException;
  6. use PhpZip\Model\Extra\Fields\AbstractUnicodeExtraField;
  7. /**
  8. * Class AbstractUnicodeExtraFieldTest.
  9. */
  10. abstract class AbstractUnicodeExtraFieldTest extends TestCase
  11. {
  12. /**
  13. * @return string|AbstractUnicodeExtraField
  14. *
  15. * @psalm-var class-string<\PhpZip\Model\Extra\Fields\AbstractUnicodeExtraField>
  16. */
  17. abstract protected function getUnicodeExtraFieldClassName();
  18. /**
  19. * @dataProvider provideExtraField
  20. *
  21. * @param int $crc32
  22. * @param string $unicodePath
  23. * @param string $originalPath
  24. * @param string $binaryData
  25. *
  26. * @throws ZipException
  27. */
  28. public function testExtraField($crc32, $unicodePath, $originalPath, $binaryData)
  29. {
  30. $crc32 = (int) $crc32; // for php 32-bit
  31. $className = $this->getUnicodeExtraFieldClassName();
  32. /** @var AbstractUnicodeExtraField $extraField */
  33. $extraField = new $className($crc32, $unicodePath);
  34. static::assertSame($extraField->getCrc32(), $crc32);
  35. static::assertSame($extraField->getUnicodeValue(), $unicodePath);
  36. static::assertSame(crc32($originalPath), $crc32);
  37. static::assertSame($binaryData, $extraField->packLocalFileData());
  38. static::assertSame($binaryData, $extraField->packCentralDirData());
  39. static::assertEquals($className::unpackLocalFileData($binaryData), $extraField);
  40. static::assertEquals($className::unpackCentralDirData($binaryData), $extraField);
  41. }
  42. /**
  43. * @return array
  44. */
  45. abstract public function provideExtraField();
  46. public function testSetter()
  47. {
  48. $className = $this->getUnicodeExtraFieldClassName();
  49. $entryName = '11111';
  50. /** @var AbstractUnicodeExtraField $extraField */
  51. $extraField = new $className(crc32($entryName), '22222');
  52. static::assertSame($extraField->getHeaderId(), $className::HEADER_ID);
  53. static::assertSame($extraField->getCrc32(), crc32($entryName));
  54. static::assertSame($extraField->getUnicodeValue(), '22222');
  55. $crc32 = 1234567;
  56. $extraField->setCrc32($crc32);
  57. static::assertSame($extraField->getCrc32(), $crc32);
  58. $extraField->setUnicodeValue('44444');
  59. static::assertSame($extraField->getUnicodeValue(), '44444');
  60. }
  61. /**
  62. * @throws ZipException
  63. */
  64. public function testUnicodeErrorParse()
  65. {
  66. $this->expectException(
  67. ZipException::class
  68. );
  69. $this->expectExceptionMessage(
  70. 'Unicode path extra data must have at least 5 bytes.'
  71. );
  72. $className = $this->getUnicodeExtraFieldClassName();
  73. $className::unpackLocalFileData('');
  74. }
  75. /**
  76. * @throws ZipException
  77. */
  78. public function testUnknownVersionParse()
  79. {
  80. $this->expectException(
  81. ZipException::class
  82. );
  83. $this->expectExceptionMessage(
  84. 'Unsupported version [2] for Unicode path extra data.'
  85. );
  86. $className = $this->getUnicodeExtraFieldClassName();
  87. $className::unpackLocalFileData("\x02\x04a\xD28\xC3\xA4\\\xC3\xBC.txt");
  88. }
  89. }