NtfsExtraFieldTest.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <?php
  2. namespace PhpZip\Tests\Extra\Fields;
  3. use PHPUnit\Framework\TestCase;
  4. use PhpZip\Model\Extra\Fields\NtfsExtraField;
  5. /**
  6. * Class NtfsExtraFieldTest.
  7. *
  8. * @internal
  9. *
  10. * @small
  11. */
  12. final class NtfsExtraFieldTest extends TestCase
  13. {
  14. protected function setUp(): void
  15. {
  16. parent::setUp();
  17. if (\PHP_INT_SIZE === 4) {
  18. self::markTestSkipped('only 64 bit test');
  19. }
  20. }
  21. /**
  22. * @dataProvider provideExtraField
  23. *
  24. * @param int $modifyNtfsTime
  25. * @param int $accessNtfsTime
  26. * @param int $createNtfsTime
  27. * @param float $modifyTimestamp
  28. * @param float $accessTimestamp
  29. * @param float $createTimestamp
  30. * @param string $binaryData
  31. *
  32. * @throws \Exception
  33. *
  34. * @noinspection PhpTooManyParametersInspection
  35. */
  36. public function testExtraField(
  37. $modifyNtfsTime,
  38. $accessNtfsTime,
  39. $createNtfsTime,
  40. $modifyTimestamp,
  41. $accessTimestamp,
  42. $createTimestamp,
  43. $binaryData
  44. ) {
  45. $extraField = new NtfsExtraField($modifyNtfsTime, $accessNtfsTime, $createNtfsTime);
  46. self::assertSame($extraField->getHeaderId(), NtfsExtraField::HEADER_ID);
  47. self::assertEquals($extraField->getModifyDateTime()->getTimestamp(), (int) $modifyTimestamp);
  48. self::assertEquals($extraField->getAccessDateTime()->getTimestamp(), (int) $accessTimestamp);
  49. self::assertEquals($extraField->getCreateDateTime()->getTimestamp(), (int) $createTimestamp);
  50. self::assertEquals(NtfsExtraField::unpackLocalFileData($binaryData), $extraField);
  51. self::assertEquals(NtfsExtraField::unpackCentralDirData($binaryData), $extraField);
  52. self::assertSame($extraField->packLocalFileData(), $binaryData);
  53. self::assertSame($extraField->packCentralDirData(), $binaryData);
  54. $extraFieldFromDateTime = NtfsExtraField::create(
  55. $extraField->getModifyDateTime(),
  56. $extraField->getAccessDateTime(),
  57. $extraField->getCreateDateTime()
  58. );
  59. self::assertEqualsIntegerWithDelta($extraFieldFromDateTime->getModifyNtfsTime(), $extraField->getModifyNtfsTime(), 100);
  60. self::assertEqualsIntegerWithDelta($extraFieldFromDateTime->getAccessNtfsTime(), $extraField->getAccessNtfsTime(), 100);
  61. self::assertEqualsIntegerWithDelta($extraFieldFromDateTime->getCreateNtfsTime(), $extraField->getCreateNtfsTime(), 100);
  62. }
  63. /**
  64. * @return array
  65. */
  66. public function provideExtraField()
  67. {
  68. return [
  69. [
  70. 129853553114795379,
  71. 129853553114795379,
  72. 129853552641022547,
  73. 1340881711.4795379,
  74. 1340881711.4795379,
  75. 1340881664.1022547,
  76. "\x00\x00\x00\x00\x01\x00\x18\x00s\xCD:Z\x1EU\xCD\x01s\xCD:Z\x1EU\xCD\x01S\x9A\xFD=\x1EU\xCD\x01",
  77. ],
  78. [
  79. 131301570250000000,
  80. 131865940850000000,
  81. 131840940680000000,
  82. 1485683425.000000,
  83. 1542120485.000000,
  84. 1539620468.000000,
  85. "\x00\x00\x00\x00\x01\x00\x18\x00\x80\xC63\x1D\x15z\xD2\x01\x80@V\xE2_{\xD4\x01\x00\xB2\x15\x14\xA3d\xD4\x01",
  86. ],
  87. [
  88. 132181086710000000,
  89. 132181086710000000,
  90. 132181086710000000,
  91. 1573635071.000000,
  92. 1573635071.000000,
  93. 1573635071.000000,
  94. "\x00\x00\x00\x00\x01\x00\x18\x00\x80\xE9_\x7F\xFF\x99\xD5\x01\x80\xE9_\x7F\xFF\x99\xD5\x01\x80\xE9_\x7F\xFF\x99\xD5\x01",
  95. ],
  96. ];
  97. }
  98. /**
  99. * @param int $expected
  100. * @param int $actual
  101. * @param int $delta
  102. * @param string $message
  103. */
  104. private static function assertEqualsIntegerWithDelta(
  105. $expected,
  106. $actual,
  107. $delta,
  108. $message = ''
  109. ) {
  110. self::assertSame(
  111. self::roundInt($expected, $delta),
  112. self::roundInt($actual, $delta),
  113. $message
  114. );
  115. }
  116. /**
  117. * @param int $number
  118. * @param int $delta
  119. *
  120. * @return int
  121. */
  122. private static function roundInt($number, $delta)
  123. {
  124. return (int) (floor($number / $delta) * $delta);
  125. }
  126. /**
  127. * @dataProvider provideExtraField
  128. *
  129. * @param int $mtimeNtfs
  130. * @param int $atimeNtfs
  131. * @param int $ctimeNtfs
  132. * @param float $mtimeTimestamp
  133. * @param float $atimeTimestamp
  134. * @param float $ctimeTimestamp
  135. *
  136. * @noinspection PhpTooManyParametersInspection
  137. * @noinspection PhpUnitDeprecationsInspection
  138. */
  139. public function testConverter(
  140. $mtimeNtfs,
  141. $atimeNtfs,
  142. $ctimeNtfs,
  143. $mtimeTimestamp,
  144. $atimeTimestamp,
  145. $ctimeTimestamp
  146. ) {
  147. self::assertEqualsWithDelta(NtfsExtraField::ntfsTimeToTimestamp($mtimeNtfs), $mtimeTimestamp, 0.00001);
  148. self::assertEqualsWithDelta(NtfsExtraField::ntfsTimeToTimestamp($atimeNtfs), $atimeTimestamp, 0.00001);
  149. self::assertEqualsWithDelta(NtfsExtraField::ntfsTimeToTimestamp($ctimeNtfs), $ctimeTimestamp, 0.00001);
  150. self::assertEqualsIntegerWithDelta(NtfsExtraField::timestampToNtfsTime($mtimeTimestamp), $mtimeNtfs, 10);
  151. self::assertEqualsIntegerWithDelta(NtfsExtraField::timestampToNtfsTime($atimeTimestamp), $atimeNtfs, 10);
  152. self::assertEqualsIntegerWithDelta(NtfsExtraField::timestampToNtfsTime($ctimeTimestamp), $ctimeNtfs, 10);
  153. }
  154. /**
  155. * @throws \Exception
  156. */
  157. public function testSetter()
  158. {
  159. $timeZone = new \DateTimeZone('UTC');
  160. $initDateTime = new \DateTimeImmutable('-1 min', $timeZone);
  161. $mtimeDateTime = new \DateTimeImmutable('-1 hour', $timeZone);
  162. $atimeDateTime = new \DateTimeImmutable('-1 day', $timeZone);
  163. $ctimeDateTime = new \DateTimeImmutable('-1 year', $timeZone);
  164. $extraField = NtfsExtraField::create($initDateTime, $initDateTime, $initDateTime);
  165. self::assertEquals(
  166. $extraField->getModifyDateTime()->getTimestamp(),
  167. $initDateTime->getTimestamp()
  168. );
  169. self::assertEquals(
  170. $extraField->getAccessDateTime()->getTimestamp(),
  171. $initDateTime->getTimestamp()
  172. );
  173. self::assertEquals(
  174. $extraField->getCreateDateTime()->getTimestamp(),
  175. $initDateTime->getTimestamp()
  176. );
  177. $extraField->setModifyDateTime($mtimeDateTime);
  178. self::assertEquals(
  179. $extraField->getModifyDateTime()->getTimestamp(),
  180. $mtimeDateTime->getTimestamp()
  181. );
  182. self::assertEquals(
  183. $extraField->getAccessDateTime()->getTimestamp(),
  184. $initDateTime->getTimestamp()
  185. );
  186. self::assertEquals(
  187. $extraField->getCreateDateTime()->getTimestamp(),
  188. $initDateTime->getTimestamp()
  189. );
  190. $extraField->setAccessDateTime($atimeDateTime);
  191. self::assertEquals(
  192. $extraField->getModifyDateTime()->getTimestamp(),
  193. $mtimeDateTime->getTimestamp()
  194. );
  195. self::assertEquals(
  196. $extraField->getAccessDateTime()->getTimestamp(),
  197. $atimeDateTime->getTimestamp()
  198. );
  199. self::assertEquals(
  200. $extraField->getCreateDateTime()->getTimestamp(),
  201. $initDateTime->getTimestamp()
  202. );
  203. $extraField->setCreateDateTime($ctimeDateTime);
  204. self::assertEquals(
  205. $extraField->getModifyDateTime()->getTimestamp(),
  206. $mtimeDateTime->getTimestamp()
  207. );
  208. self::assertEquals(
  209. $extraField->getAccessDateTime()->getTimestamp(),
  210. $atimeDateTime->getTimestamp()
  211. );
  212. self::assertEquals(
  213. $extraField->getCreateDateTime()->getTimestamp(),
  214. $ctimeDateTime->getTimestamp()
  215. );
  216. $newModifyNtfsTime = $extraField->getCreateNtfsTime();
  217. $newAccessNtfsTime = $extraField->getModifyNtfsTime();
  218. $newCreateNtfsTime = $extraField->getAccessNtfsTime();
  219. $extraField->setModifyNtfsTime($newModifyNtfsTime);
  220. $extraField->setAccessNtfsTime($newAccessNtfsTime);
  221. $extraField->setCreateNtfsTime($newCreateNtfsTime);
  222. self::assertSame($extraField->getModifyNtfsTime(), $newModifyNtfsTime);
  223. self::assertSame($extraField->getAccessNtfsTime(), $newAccessNtfsTime);
  224. self::assertSame($extraField->getCreateNtfsTime(), $newCreateNtfsTime);
  225. }
  226. }