encode_decode_test.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  1. <?php
  2. require_once('test_base.php');
  3. require_once('test_util.php');
  4. use Google\Protobuf\RepeatedField;
  5. use Google\Protobuf\GPBType;
  6. use Foo\TestEnum;
  7. use Foo\TestMessage;
  8. use Foo\TestMessage\Sub;
  9. use Foo\TestPackedMessage;
  10. use Foo\TestRandomFieldOrder;
  11. use Foo\TestUnpackedMessage;
  12. class EncodeDecodeTest extends TestBase
  13. {
  14. public function testEncode()
  15. {
  16. $from = new TestMessage();
  17. $this->expectEmptyFields($from);
  18. $this->setFields($from);
  19. $this->expectFields($from);
  20. $data = $from->serializeToString();
  21. $this->assertSame(bin2hex(TestUtil::getGoldenTestMessage()),
  22. bin2hex($data));
  23. }
  24. public function testDecode()
  25. {
  26. $to = new TestMessage();
  27. $to->mergeFromString(TestUtil::getGoldenTestMessage());
  28. $this->expectFields($to);
  29. }
  30. public function testEncodeDecode()
  31. {
  32. $from = new TestMessage();
  33. $this->expectEmptyFields($from);
  34. $this->setFields($from);
  35. $this->expectFields($from);
  36. $data = $from->serializeToString();
  37. $to = new TestMessage();
  38. $to->mergeFromString($data);
  39. $this->expectFields($to);
  40. }
  41. public function testEncodeDecodeEmpty()
  42. {
  43. $from = new TestMessage();
  44. $this->expectEmptyFields($from);
  45. $data = $from->serializeToString();
  46. $to = new TestMessage();
  47. $to->mergeFromString($data);
  48. $this->expectEmptyFields($to);
  49. }
  50. public function testEncodeDecodeOneof()
  51. {
  52. $m = new TestMessage();
  53. $m->setOneofInt32(1);
  54. $data = $m->serializeToString();
  55. $n = new TestMessage();
  56. $n->mergeFromString($data);
  57. $this->assertSame(1, $n->getOneofInt32());
  58. $m->setOneofFloat(2.0);
  59. $data = $m->serializeToString();
  60. $n = new TestMessage();
  61. $n->mergeFromString($data);
  62. $this->assertSame(2.0, $n->getOneofFloat());
  63. $m->setOneofString('abc');
  64. $data = $m->serializeToString();
  65. $n = new TestMessage();
  66. $n->mergeFromString($data);
  67. $this->assertSame('abc', $n->getOneofString());
  68. $sub_m = new Sub();
  69. $sub_m->setA(1);
  70. $m->setOneofMessage($sub_m);
  71. $data = $m->serializeToString();
  72. $n = new TestMessage();
  73. $n->mergeFromString($data);
  74. $this->assertSame(1, $n->getOneofMessage()->getA());
  75. // Encode default value
  76. $m->setOneofEnum(TestEnum::ZERO);
  77. $data = $m->serializeToString();
  78. $n = new TestMessage();
  79. $n->mergeFromString($data);
  80. $this->assertSame("oneof_enum", $n->getMyOneof());
  81. $this->assertSame(TestEnum::ZERO, $n->getOneofEnum());
  82. $m->setOneofString("");
  83. $data = $m->serializeToString();
  84. $n = new TestMessage();
  85. $n->mergeFromString($data);
  86. $this->assertSame("oneof_string", $n->getMyOneof());
  87. $this->assertSame("", $n->getOneofString());
  88. $sub_m = new Sub();
  89. $m->setOneofMessage($sub_m);
  90. $data = $m->serializeToString();
  91. $n = new TestMessage();
  92. $n->mergeFromString($data);
  93. $this->assertSame("oneof_message", $n->getMyOneof());
  94. $this->assertFalse(is_null($n->getOneofMessage()));
  95. }
  96. public function testPackedEncode()
  97. {
  98. $from = new TestPackedMessage();
  99. TestUtil::setTestPackedMessage($from);
  100. $this->assertSame(TestUtil::getGoldenTestPackedMessage(),
  101. $from->serializeToString());
  102. }
  103. public function testPackedDecodePacked()
  104. {
  105. $to = new TestPackedMessage();
  106. $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
  107. TestUtil::assertTestPackedMessage($to);
  108. }
  109. public function testPackedDecodeUnpacked()
  110. {
  111. $to = new TestPackedMessage();
  112. $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
  113. TestUtil::assertTestPackedMessage($to);
  114. }
  115. public function testUnpackedEncode()
  116. {
  117. $from = new TestUnpackedMessage();
  118. TestUtil::setTestPackedMessage($from);
  119. $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(),
  120. $from->serializeToString());
  121. }
  122. public function testUnpackedDecodePacked()
  123. {
  124. $to = new TestUnpackedMessage();
  125. $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
  126. TestUtil::assertTestPackedMessage($to);
  127. }
  128. public function testUnpackedDecodeUnpacked()
  129. {
  130. $to = new TestUnpackedMessage();
  131. $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
  132. TestUtil::assertTestPackedMessage($to);
  133. }
  134. public function testDecodeInt64()
  135. {
  136. // Read 64 testing
  137. $testVals = array(
  138. '10' => '100a',
  139. '100' => '1064',
  140. '800' => '10a006',
  141. '6400' => '108032',
  142. '70400' => '1080a604',
  143. '774400' => '1080a22f',
  144. '9292800' => '108098b704',
  145. '74342400' => '1080c0b923',
  146. '743424000' => '108080bfe202',
  147. '8177664000' => '108080b5bb1e',
  148. '65421312000' => '108080a8dbf301',
  149. '785055744000' => '108080e0c7ec16',
  150. '9420668928000' => '10808080dd969202',
  151. '103627358208000' => '10808080fff9c717',
  152. '1139900940288000' => '10808080f5bd978302',
  153. '13678811283456000' => '10808080fce699a618',
  154. '109430490267648000' => '10808080e0b7ceb1c201',
  155. '984874412408832000' => '10808080e0f5c1bed50d',
  156. );
  157. $msg = new TestMessage();
  158. foreach ($testVals as $original => $encoded) {
  159. $msg->setOptionalInt64($original);
  160. $data = $msg->serializeToString();
  161. $this->assertSame($encoded, bin2hex($data));
  162. $msg->setOptionalInt64(0);
  163. $msg->mergeFromString($data);
  164. $this->assertEquals($original, $msg->getOptionalInt64());
  165. }
  166. }
  167. public function testDecodeToExistingMessage()
  168. {
  169. $m1 = new TestMessage();
  170. $this->setFields($m1);
  171. $this->expectFields($m1);
  172. $m2 = new TestMessage();
  173. $this->setFields2($m2);
  174. $data = $m2->serializeToString();
  175. $m1->mergeFromString($data);
  176. $this->expectFieldsMerged($m1);
  177. }
  178. public function testDecodeFieldNonExist()
  179. {
  180. $data = hex2bin('c80501');
  181. $m = new TestMessage();
  182. $m->mergeFromString($data);
  183. }
  184. public function testEncodeNegativeInt32()
  185. {
  186. $m = new TestMessage();
  187. $m->setOptionalInt32(-1);
  188. $data = $m->serializeToString();
  189. $this->assertSame("08ffffffffffffffffff01", bin2hex($data));
  190. }
  191. public function testDecodeNegativeInt32()
  192. {
  193. $m = new TestMessage();
  194. $this->assertEquals(0, $m->getOptionalInt32());
  195. $m->mergeFromString(hex2bin("08ffffffffffffffffff01"));
  196. $this->assertEquals(-1, $m->getOptionalInt32());
  197. $m = new TestMessage();
  198. $this->assertEquals(0, $m->getOptionalInt32());
  199. $m->mergeFromString(hex2bin("08ffffffff0f"));
  200. $this->assertEquals(-1, $m->getOptionalInt32());
  201. }
  202. public function testRandomFieldOrder()
  203. {
  204. $m = new TestRandomFieldOrder();
  205. $data = $m->serializeToString();
  206. $this->assertSame("", $data);
  207. }
  208. /**
  209. * @expectedException Exception
  210. */
  211. public function testDecodeInvalidInt32()
  212. {
  213. $m = new TestMessage();
  214. $m->mergeFromString(hex2bin('08'));
  215. }
  216. /**
  217. * @expectedException Exception
  218. */
  219. public function testDecodeInvalidSubMessage()
  220. {
  221. $m = new TestMessage();
  222. $m->mergeFromString(hex2bin('9A010108'));
  223. }
  224. /**
  225. * @expectedException Exception
  226. */
  227. public function testDecodeInvalidInt64()
  228. {
  229. $m = new TestMessage();
  230. $m->mergeFromString(hex2bin('10'));
  231. }
  232. /**
  233. * @expectedException Exception
  234. */
  235. public function testDecodeInvalidUInt32()
  236. {
  237. $m = new TestMessage();
  238. $m->mergeFromString(hex2bin('18'));
  239. }
  240. /**
  241. * @expectedException Exception
  242. */
  243. public function testDecodeInvalidUInt64()
  244. {
  245. $m = new TestMessage();
  246. $m->mergeFromString(hex2bin('20'));
  247. }
  248. /**
  249. * @expectedException Exception
  250. */
  251. public function testDecodeInvalidSInt32()
  252. {
  253. $m = new TestMessage();
  254. $m->mergeFromString(hex2bin('28'));
  255. }
  256. /**
  257. * @expectedException Exception
  258. */
  259. public function testDecodeInvalidSInt64()
  260. {
  261. $m = new TestMessage();
  262. $m->mergeFromString(hex2bin('30'));
  263. }
  264. /**
  265. * @expectedException Exception
  266. */
  267. public function testDecodeInvalidFixed32()
  268. {
  269. $m = new TestMessage();
  270. $m->mergeFromString(hex2bin('3D'));
  271. }
  272. /**
  273. * @expectedException Exception
  274. */
  275. public function testDecodeInvalidFixed64()
  276. {
  277. $m = new TestMessage();
  278. $m->mergeFromString(hex2bin('41'));
  279. }
  280. /**
  281. * @expectedException Exception
  282. */
  283. public function testDecodeInvalidSFixed32()
  284. {
  285. $m = new TestMessage();
  286. $m->mergeFromString(hex2bin('4D'));
  287. }
  288. /**
  289. * @expectedException Exception
  290. */
  291. public function testDecodeInvalidSFixed64()
  292. {
  293. $m = new TestMessage();
  294. $m->mergeFromString(hex2bin('51'));
  295. }
  296. /**
  297. * @expectedException Exception
  298. */
  299. public function testDecodeInvalidFloat()
  300. {
  301. $m = new TestMessage();
  302. $m->mergeFromString(hex2bin('5D'));
  303. }
  304. /**
  305. * @expectedException Exception
  306. */
  307. public function testDecodeInvalidDouble()
  308. {
  309. $m = new TestMessage();
  310. $m->mergeFromString(hex2bin('61'));
  311. }
  312. /**
  313. * @expectedException Exception
  314. */
  315. public function testDecodeInvalidBool()
  316. {
  317. $m = new TestMessage();
  318. $m->mergeFromString(hex2bin('68'));
  319. }
  320. /**
  321. * @expectedException Exception
  322. */
  323. public function testDecodeInvalidStringLengthMiss()
  324. {
  325. $m = new TestMessage();
  326. $m->mergeFromString(hex2bin('72'));
  327. }
  328. /**
  329. * @expectedException Exception
  330. */
  331. public function testDecodeInvalidStringDataMiss()
  332. {
  333. $m = new TestMessage();
  334. $m->mergeFromString(hex2bin('7201'));
  335. }
  336. /**
  337. * @expectedException Exception
  338. */
  339. public function testDecodeInvalidBytesLengthMiss()
  340. {
  341. $m = new TestMessage();
  342. $m->mergeFromString(hex2bin('7A'));
  343. }
  344. /**
  345. * @expectedException Exception
  346. */
  347. public function testDecodeInvalidBytesDataMiss()
  348. {
  349. $m = new TestMessage();
  350. $m->mergeFromString(hex2bin('7A01'));
  351. }
  352. /**
  353. * @expectedException Exception
  354. */
  355. public function testDecodeInvalidEnum()
  356. {
  357. $m = new TestMessage();
  358. $m->mergeFromString(hex2bin('8001'));
  359. }
  360. /**
  361. * @expectedException Exception
  362. */
  363. public function testDecodeInvalidMessageLengthMiss()
  364. {
  365. $m = new TestMessage();
  366. $m->mergeFromString(hex2bin('8A01'));
  367. }
  368. /**
  369. * @expectedException Exception
  370. */
  371. public function testDecodeInvalidMessageDataMiss()
  372. {
  373. $m = new TestMessage();
  374. $m->mergeFromString(hex2bin('8A0101'));
  375. }
  376. /**
  377. * @expectedException Exception
  378. */
  379. public function testDecodeInvalidPackedMessageLength()
  380. {
  381. $m = new TestPackedMessage();
  382. $m->mergeFromString(hex2bin('D205'));
  383. }
  384. public function testUnknown()
  385. {
  386. // Test preserve unknown for varint.
  387. $m = new TestMessage();
  388. $from = hex2bin('F80601'); // TODO(teboring): Add a util to encode
  389. // varint for better readability
  390. $m->mergeFromString($from);
  391. $to = $m->serializeToString();
  392. $this->assertSame(bin2hex($from), bin2hex($to));
  393. // Test preserve unknown for 64-bit.
  394. $m = new TestMessage();
  395. $from = hex2bin('F9060000000000000000');
  396. $m->mergeFromString($from);
  397. $to = $m->serializeToString();
  398. $this->assertSame(bin2hex($from), bin2hex($to));
  399. // Test preserve unknown for length delimited.
  400. $m = new TestMessage();
  401. $from = hex2bin('FA0600');
  402. $m->mergeFromString($from);
  403. $to = $m->serializeToString();
  404. $this->assertSame(bin2hex($from), bin2hex($to));
  405. // Test preserve unknown for 32-bit.
  406. $m = new TestMessage();
  407. $from = hex2bin('FD0600000000');
  408. $m->mergeFromString($from);
  409. $to = $m->serializeToString();
  410. $this->assertSame(bin2hex($from), bin2hex($to));
  411. // Test discard unknown in message.
  412. $m = new TestMessage();
  413. $from = hex2bin('F80601');
  414. $m->mergeFromString($from);
  415. $m->discardUnknownFields();
  416. $to = $m->serializeToString();
  417. $this->assertSame("", bin2hex($to));
  418. // Test discard unknown for singular message field.
  419. $m = new TestMessage();
  420. $from = hex2bin('8A0103F80601');
  421. $m->mergeFromString($from);
  422. $m->discardUnknownFields();
  423. $to = $m->serializeToString();
  424. $this->assertSame("8a0100", bin2hex($to));
  425. // Test discard unknown for repeated message field.
  426. $m = new TestMessage();
  427. $from = hex2bin('FA0203F80601');
  428. $m->mergeFromString($from);
  429. $m->discardUnknownFields();
  430. $to = $m->serializeToString();
  431. $this->assertSame("fa0200", bin2hex($to));
  432. // Test discard unknown for map message value field.
  433. $m = new TestMessage();
  434. $from = hex2bin("BA050708011203F80601");
  435. $m->mergeFromString($from);
  436. $m->discardUnknownFields();
  437. $to = $m->serializeToString();
  438. $this->assertSame("ba050408011200", bin2hex($to));
  439. // Test discard unknown for singular message field.
  440. $m = new TestMessage();
  441. $from = hex2bin('9A0403F80601');
  442. $m->mergeFromString($from);
  443. $m->discardUnknownFields();
  444. $to = $m->serializeToString();
  445. $this->assertSame("9a0400", bin2hex($to));
  446. }
  447. public function testJsonEncode()
  448. {
  449. $from = new TestMessage();
  450. $this->setFields($from);
  451. $data = $from->serializeToJsonString();
  452. $to = new TestMessage();
  453. $to->mergeFromJsonString($data);
  454. $this->expectFields($to);
  455. }
  456. }