NtfsExtraFieldTest.php 8.3 KB

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