encode_decode_test.php 36 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192
  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\TestAny;
  7. use Foo\TestEnum;
  8. use Foo\TestMessage;
  9. use Foo\TestMessage\Sub;
  10. use Foo\TestPackedMessage;
  11. use Foo\TestRandomFieldOrder;
  12. use Foo\TestUnpackedMessage;
  13. use Google\Protobuf\Any;
  14. use Google\Protobuf\DoubleValue;
  15. use Google\Protobuf\FieldMask;
  16. use Google\Protobuf\FloatValue;
  17. use Google\Protobuf\Int32Value;
  18. use Google\Protobuf\UInt32Value;
  19. use Google\Protobuf\Int64Value;
  20. use Google\Protobuf\UInt64Value;
  21. use Google\Protobuf\BoolValue;
  22. use Google\Protobuf\StringValue;
  23. use Google\Protobuf\BytesValue;
  24. use Google\Protobuf\Value;
  25. use Google\Protobuf\ListValue;
  26. use Google\Protobuf\Struct;
  27. use Google\Protobuf\GPBEmpty;
  28. class EncodeDecodeTest extends TestBase
  29. {
  30. public function testDecodeJsonSimple()
  31. {
  32. $m = new TestMessage();
  33. $m->mergeFromJsonString("{\"optionalInt32\":1}");
  34. $this->assertEquals(1, $m->getOptionalInt32());
  35. }
  36. public function testDecodeTopLevelBoolValue()
  37. {
  38. $m = new BoolValue();
  39. $m->mergeFromJsonString("true");
  40. $this->assertEquals(true, $m->getValue());
  41. $m->mergeFromJsonString("false");
  42. $this->assertEquals(false, $m->getValue());
  43. }
  44. public function testEncodeTopLevelBoolValue()
  45. {
  46. $m = new BoolValue();
  47. $m->setValue(true);
  48. $this->assertSame("true", $m->serializeToJsonString());
  49. }
  50. public function testDecodeTopLevelDoubleValue()
  51. {
  52. $m = new DoubleValue();
  53. $m->mergeFromJsonString("1.5");
  54. $this->assertEquals(1.5, $m->getValue());
  55. }
  56. public function testEncodeTopLevelDoubleValue()
  57. {
  58. $m = new DoubleValue();
  59. $m->setValue(1.5);
  60. $this->assertSame("1.5", $m->serializeToJsonString());
  61. }
  62. public function testDecodeTopLevelFloatValue()
  63. {
  64. $m = new FloatValue();
  65. $m->mergeFromJsonString("1.5");
  66. $this->assertEquals(1.5, $m->getValue());
  67. }
  68. public function testEncodeTopLevelFloatValue()
  69. {
  70. $m = new FloatValue();
  71. $m->setValue(1.5);
  72. $this->assertSame("1.5", $m->serializeToJsonString());
  73. }
  74. public function testDecodeTopLevelInt32Value()
  75. {
  76. $m = new Int32Value();
  77. $m->mergeFromJsonString("1");
  78. $this->assertEquals(1, $m->getValue());
  79. }
  80. public function testEncodeTopLevelInt32Value()
  81. {
  82. $m = new Int32Value();
  83. $m->setValue(1);
  84. $this->assertSame("1", $m->serializeToJsonString());
  85. }
  86. public function testDecodeTopLevelUInt32Value()
  87. {
  88. $m = new UInt32Value();
  89. $m->mergeFromJsonString("1");
  90. $this->assertEquals(1, $m->getValue());
  91. }
  92. public function testEncodeTopLevelUInt32Value()
  93. {
  94. $m = new UInt32Value();
  95. $m->setValue(1);
  96. $this->assertSame("1", $m->serializeToJsonString());
  97. }
  98. public function testDecodeTopLevelInt64Value()
  99. {
  100. $m = new Int64Value();
  101. $m->mergeFromJsonString("1");
  102. $this->assertEquals(1, $m->getValue());
  103. }
  104. public function testDecodeTopLevelInt64ValueAsString()
  105. {
  106. $m = new Int64Value();
  107. $m->mergeFromJsonString("\"1\"");
  108. $this->assertEquals(1, $m->getValue());
  109. }
  110. public function testEncodeTopLevelInt64Value()
  111. {
  112. $m = new Int64Value();
  113. $m->setValue(1);
  114. $this->assertSame("\"1\"", $m->serializeToJsonString());
  115. }
  116. public function testDecodeTopLevelUInt64Value()
  117. {
  118. $m = new UInt64Value();
  119. $m->mergeFromJsonString("1");
  120. $this->assertEquals(1, $m->getValue());
  121. }
  122. public function testDecodeTopLevelUInt64ValueAsString()
  123. {
  124. $m = new UInt64Value();
  125. $m->mergeFromJsonString("\"1\"");
  126. $this->assertEquals(1, $m->getValue());
  127. }
  128. public function testEncodeTopLevelUInt64Value()
  129. {
  130. $m = new UInt64Value();
  131. $m->setValue(1);
  132. $this->assertSame("\"1\"", $m->serializeToJsonString());
  133. }
  134. public function testDecodeTopLevelStringValue()
  135. {
  136. $m = new StringValue();
  137. $m->mergeFromJsonString("\"a\"");
  138. $this->assertSame("a", $m->getValue());
  139. }
  140. public function testEncodeTopLevelStringValue()
  141. {
  142. $m = new StringValue();
  143. $m->setValue("a");
  144. $this->assertSame("\"a\"", $m->serializeToJsonString());
  145. }
  146. public function testDecodeTopLevelBytesValue()
  147. {
  148. $m = new BytesValue();
  149. $m->mergeFromJsonString("\"YQ==\"");
  150. $this->assertSame("a", $m->getValue());
  151. }
  152. public function testEncodeTopLevelBytesValue()
  153. {
  154. $m = new BytesValue();
  155. $m->setValue("a");
  156. $this->assertSame("\"YQ==\"", $m->serializeToJsonString());
  157. }
  158. public function generateRandomString($length = 10) {
  159. $randomString = str_repeat("+", $length);
  160. for ($i = 0; $i < $length; $i++) {
  161. $randomString[$i] = rand(0, 255);
  162. }
  163. return $randomString;
  164. }
  165. public function testEncodeTopLevelLongBytesValue()
  166. {
  167. $m = new BytesValue();
  168. $data = $this->generateRandomString(12007);
  169. $m->setValue($data);
  170. $expected = "\"" . base64_encode($data) . "\"";
  171. $this->assertSame(strlen($expected), strlen($m->serializeToJsonString()));
  172. }
  173. public function testEncode()
  174. {
  175. $from = new TestMessage();
  176. $this->expectEmptyFields($from);
  177. $this->setFields($from);
  178. $this->expectFields($from);
  179. $data = $from->serializeToString();
  180. $this->assertSame(bin2hex(TestUtil::getGoldenTestMessage()),
  181. bin2hex($data));
  182. }
  183. public function testDecode()
  184. {
  185. $to = new TestMessage();
  186. $to->mergeFromString(TestUtil::getGoldenTestMessage());
  187. $this->expectFields($to);
  188. }
  189. public function testEncodeDecode()
  190. {
  191. $from = new TestMessage();
  192. $this->expectEmptyFields($from);
  193. $this->setFields($from);
  194. $this->expectFields($from);
  195. $data = $from->serializeToString();
  196. $to = new TestMessage();
  197. $to->mergeFromString($data);
  198. $this->expectFields($to);
  199. }
  200. public function testEncodeDecodeEmpty()
  201. {
  202. $from = new TestMessage();
  203. $this->expectEmptyFields($from);
  204. $data = $from->serializeToString();
  205. $to = new TestMessage();
  206. $to->mergeFromString($data);
  207. $this->expectEmptyFields($to);
  208. }
  209. public function testEncodeDecodeOneof()
  210. {
  211. $m = new TestMessage();
  212. $m->setOneofInt32(1);
  213. $data = $m->serializeToString();
  214. $n = new TestMessage();
  215. $n->mergeFromString($data);
  216. $this->assertSame(1, $n->getOneofInt32());
  217. $m->setOneofFloat(2.0);
  218. $data = $m->serializeToString();
  219. $n = new TestMessage();
  220. $n->mergeFromString($data);
  221. $this->assertSame(2.0, $n->getOneofFloat());
  222. $m->setOneofString('abc');
  223. $data = $m->serializeToString();
  224. $n = new TestMessage();
  225. $n->mergeFromString($data);
  226. $this->assertSame('abc', $n->getOneofString());
  227. $sub_m = new Sub();
  228. $sub_m->setA(1);
  229. $m->setOneofMessage($sub_m);
  230. $data = $m->serializeToString();
  231. $n = new TestMessage();
  232. $n->mergeFromString($data);
  233. $this->assertSame(1, $n->getOneofMessage()->getA());
  234. // Encode default value
  235. $m->setOneofEnum(TestEnum::ZERO);
  236. $data = $m->serializeToString();
  237. $n = new TestMessage();
  238. $n->mergeFromString($data);
  239. $this->assertSame("oneof_enum", $n->getMyOneof());
  240. $this->assertSame(TestEnum::ZERO, $n->getOneofEnum());
  241. $m->setOneofString("");
  242. $data = $m->serializeToString();
  243. $n = new TestMessage();
  244. $n->mergeFromString($data);
  245. $this->assertSame("oneof_string", $n->getMyOneof());
  246. $this->assertSame("", $n->getOneofString());
  247. $sub_m = new Sub();
  248. $m->setOneofMessage($sub_m);
  249. $data = $m->serializeToString();
  250. $n = new TestMessage();
  251. $n->mergeFromString($data);
  252. $this->assertSame("oneof_message", $n->getMyOneof());
  253. $this->assertFalse(is_null($n->getOneofMessage()));
  254. }
  255. public function testJsonEncodeDecodeOneof()
  256. {
  257. $m = new TestMessage();
  258. $m->setOneofEnum(TestEnum::ONE);
  259. $data = $m->serializeToJsonString();
  260. $n = new TestMessage();
  261. $n->mergeFromJsonString($data);
  262. $this->assertSame("oneof_enum", $n->getMyOneof());
  263. $this->assertSame(TestEnum::ONE, $n->getOneofEnum());
  264. $m->setOneofString("a");
  265. $data = $m->serializeToJsonString();
  266. $n = new TestMessage();
  267. $n->mergeFromJsonString($data);
  268. $this->assertSame("oneof_string", $n->getMyOneof());
  269. $this->assertSame("a", $n->getOneofString());
  270. $m->setOneofBytes("bbbb");
  271. $data = $m->serializeToJsonString();
  272. $n = new TestMessage();
  273. $n->mergeFromJsonString($data);
  274. $this->assertSame("oneof_bytes", $n->getMyOneof());
  275. $this->assertSame("bbbb", $n->getOneofBytes());
  276. $sub_m = new Sub();
  277. $m->setOneofMessage($sub_m);
  278. $data = $m->serializeToJsonString();
  279. $n = new TestMessage();
  280. $n->mergeFromJsonString($data);
  281. $this->assertSame("oneof_message", $n->getMyOneof());
  282. $this->assertFalse(is_null($n->getOneofMessage()));
  283. }
  284. public function testPackedEncode()
  285. {
  286. $from = new TestPackedMessage();
  287. TestUtil::setTestPackedMessage($from);
  288. $this->assertSame(TestUtil::getGoldenTestPackedMessage(),
  289. $from->serializeToString());
  290. }
  291. public function testPackedDecodePacked()
  292. {
  293. $to = new TestPackedMessage();
  294. $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
  295. TestUtil::assertTestPackedMessage($to);
  296. $this->assertTrue(true);
  297. }
  298. public function testPackedDecodeUnpacked()
  299. {
  300. $to = new TestPackedMessage();
  301. $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
  302. TestUtil::assertTestPackedMessage($to);
  303. $this->assertTrue(true);
  304. }
  305. public function testUnpackedEncode()
  306. {
  307. $from = new TestUnpackedMessage();
  308. TestUtil::setTestPackedMessage($from);
  309. $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(),
  310. $from->serializeToString());
  311. }
  312. public function testUnpackedDecodePacked()
  313. {
  314. $to = new TestUnpackedMessage();
  315. $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
  316. TestUtil::assertTestPackedMessage($to);
  317. $this->assertTrue(true);
  318. }
  319. public function testUnpackedDecodeUnpacked()
  320. {
  321. $to = new TestUnpackedMessage();
  322. $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
  323. TestUtil::assertTestPackedMessage($to);
  324. $this->assertTrue(true);
  325. }
  326. public function testDecodeInt64()
  327. {
  328. // Read 64 testing
  329. $testVals = array(
  330. '10' => '100a',
  331. '100' => '1064',
  332. '800' => '10a006',
  333. '6400' => '108032',
  334. '70400' => '1080a604',
  335. '774400' => '1080a22f',
  336. '9292800' => '108098b704',
  337. '74342400' => '1080c0b923',
  338. '743424000' => '108080bfe202',
  339. '8177664000' => '108080b5bb1e',
  340. '65421312000' => '108080a8dbf301',
  341. '785055744000' => '108080e0c7ec16',
  342. '9420668928000' => '10808080dd969202',
  343. '103627358208000' => '10808080fff9c717',
  344. '1139900940288000' => '10808080f5bd978302',
  345. '13678811283456000' => '10808080fce699a618',
  346. '109430490267648000' => '10808080e0b7ceb1c201',
  347. '984874412408832000' => '10808080e0f5c1bed50d',
  348. );
  349. $msg = new TestMessage();
  350. foreach ($testVals as $original => $encoded) {
  351. $msg->setOptionalInt64($original);
  352. $data = $msg->serializeToString();
  353. $this->assertSame($encoded, bin2hex($data));
  354. $msg->setOptionalInt64(0);
  355. $msg->mergeFromString($data);
  356. $this->assertEquals($original, $msg->getOptionalInt64());
  357. }
  358. }
  359. public function testDecodeToExistingMessage()
  360. {
  361. $m1 = new TestMessage();
  362. $this->setFields($m1);
  363. $this->expectFields($m1);
  364. $m2 = new TestMessage();
  365. $this->setFields2($m2);
  366. $data = $m2->serializeToString();
  367. $m1->mergeFromString($data);
  368. $this->expectFieldsMerged($m1);
  369. }
  370. public function testDecodeFieldNonExist()
  371. {
  372. $data = hex2bin('c80501');
  373. $m = new TestMessage();
  374. $m->mergeFromString($data);
  375. $this->assertTrue(true);
  376. }
  377. public function testEncodeNegativeInt32()
  378. {
  379. $m = new TestMessage();
  380. $m->setOptionalInt32(-1);
  381. $data = $m->serializeToString();
  382. $this->assertSame("08ffffffffffffffffff01", bin2hex($data));
  383. }
  384. public function testDecodeNegativeInt32()
  385. {
  386. $m = new TestMessage();
  387. $this->assertEquals(0, $m->getOptionalInt32());
  388. $m->mergeFromString(hex2bin("08ffffffffffffffffff01"));
  389. $this->assertEquals(-1, $m->getOptionalInt32());
  390. $m = new TestMessage();
  391. $this->assertEquals(0, $m->getOptionalInt32());
  392. $m->mergeFromString(hex2bin("08ffffffff0f"));
  393. $this->assertEquals(-1, $m->getOptionalInt32());
  394. }
  395. public function testRandomFieldOrder()
  396. {
  397. $m = new TestRandomFieldOrder();
  398. $data = $m->serializeToString();
  399. $this->assertSame("", $data);
  400. }
  401. /**
  402. * @expectedException Exception
  403. */
  404. public function testDecodeInvalidInt32()
  405. {
  406. $m = new TestMessage();
  407. $m->mergeFromString(hex2bin('08'));
  408. }
  409. /**
  410. * @expectedException Exception
  411. */
  412. public function testDecodeInvalidSubMessage()
  413. {
  414. $m = new TestMessage();
  415. $m->mergeFromString(hex2bin('9A010108'));
  416. }
  417. /**
  418. * @expectedException Exception
  419. */
  420. public function testDecodeInvalidInt64()
  421. {
  422. $m = new TestMessage();
  423. $m->mergeFromString(hex2bin('10'));
  424. }
  425. /**
  426. * @expectedException Exception
  427. */
  428. public function testDecodeInvalidUInt32()
  429. {
  430. $m = new TestMessage();
  431. $m->mergeFromString(hex2bin('18'));
  432. }
  433. /**
  434. * @expectedException Exception
  435. */
  436. public function testDecodeInvalidUInt64()
  437. {
  438. $m = new TestMessage();
  439. $m->mergeFromString(hex2bin('20'));
  440. }
  441. /**
  442. * @expectedException Exception
  443. */
  444. public function testDecodeInvalidSInt32()
  445. {
  446. $m = new TestMessage();
  447. $m->mergeFromString(hex2bin('28'));
  448. }
  449. /**
  450. * @expectedException Exception
  451. */
  452. public function testDecodeInvalidSInt64()
  453. {
  454. $m = new TestMessage();
  455. $m->mergeFromString(hex2bin('30'));
  456. }
  457. /**
  458. * @expectedException Exception
  459. */
  460. public function testDecodeInvalidFixed32()
  461. {
  462. $m = new TestMessage();
  463. $m->mergeFromString(hex2bin('3D'));
  464. }
  465. /**
  466. * @expectedException Exception
  467. */
  468. public function testDecodeInvalidFixed64()
  469. {
  470. $m = new TestMessage();
  471. $m->mergeFromString(hex2bin('41'));
  472. }
  473. /**
  474. * @expectedException Exception
  475. */
  476. public function testDecodeInvalidSFixed32()
  477. {
  478. $m = new TestMessage();
  479. $m->mergeFromString(hex2bin('4D'));
  480. }
  481. /**
  482. * @expectedException Exception
  483. */
  484. public function testDecodeInvalidSFixed64()
  485. {
  486. $m = new TestMessage();
  487. $m->mergeFromString(hex2bin('51'));
  488. }
  489. /**
  490. * @expectedException Exception
  491. */
  492. public function testDecodeInvalidFloat()
  493. {
  494. $m = new TestMessage();
  495. $m->mergeFromString(hex2bin('5D'));
  496. }
  497. /**
  498. * @expectedException Exception
  499. */
  500. public function testDecodeInvalidDouble()
  501. {
  502. $m = new TestMessage();
  503. $m->mergeFromString(hex2bin('61'));
  504. }
  505. /**
  506. * @expectedException Exception
  507. */
  508. public function testDecodeInvalidBool()
  509. {
  510. $m = new TestMessage();
  511. $m->mergeFromString(hex2bin('68'));
  512. }
  513. /**
  514. * @expectedException Exception
  515. */
  516. public function testDecodeInvalidStringLengthMiss()
  517. {
  518. $m = new TestMessage();
  519. $m->mergeFromString(hex2bin('72'));
  520. }
  521. /**
  522. * @expectedException Exception
  523. */
  524. public function testDecodeInvalidStringDataMiss()
  525. {
  526. $m = new TestMessage();
  527. $m->mergeFromString(hex2bin('7201'));
  528. }
  529. /**
  530. * @expectedException Exception
  531. */
  532. public function testDecodeInvalidBytesLengthMiss()
  533. {
  534. $m = new TestMessage();
  535. $m->mergeFromString(hex2bin('7A'));
  536. }
  537. /**
  538. * @expectedException Exception
  539. */
  540. public function testDecodeInvalidBytesDataMiss()
  541. {
  542. $m = new TestMessage();
  543. $m->mergeFromString(hex2bin('7A01'));
  544. }
  545. /**
  546. * @expectedException Exception
  547. */
  548. public function testDecodeInvalidEnum()
  549. {
  550. $m = new TestMessage();
  551. $m->mergeFromString(hex2bin('8001'));
  552. }
  553. /**
  554. * @expectedException Exception
  555. */
  556. public function testDecodeInvalidMessageLengthMiss()
  557. {
  558. $m = new TestMessage();
  559. $m->mergeFromString(hex2bin('8A01'));
  560. }
  561. /**
  562. * @expectedException Exception
  563. */
  564. public function testDecodeInvalidMessageDataMiss()
  565. {
  566. $m = new TestMessage();
  567. $m->mergeFromString(hex2bin('8A0101'));
  568. }
  569. /**
  570. * @expectedException Exception
  571. */
  572. public function testDecodeInvalidPackedMessageLength()
  573. {
  574. $m = new TestPackedMessage();
  575. $m->mergeFromString(hex2bin('D205'));
  576. }
  577. public function testUnknown()
  578. {
  579. // Test preserve unknown for varint.
  580. $m = new TestMessage();
  581. $from = hex2bin('F80601'); // TODO(teboring): Add a util to encode
  582. // varint for better readability
  583. $m->mergeFromString($from);
  584. $to = $m->serializeToString();
  585. $this->assertSame(bin2hex($from), bin2hex($to));
  586. // Test preserve unknown for 64-bit.
  587. $m = new TestMessage();
  588. $from = hex2bin('F9060000000000000000');
  589. $m->mergeFromString($from);
  590. $to = $m->serializeToString();
  591. $this->assertSame(bin2hex($from), bin2hex($to));
  592. // Test preserve unknown for length delimited.
  593. $m = new TestMessage();
  594. $from = hex2bin('FA0600');
  595. $m->mergeFromString($from);
  596. $to = $m->serializeToString();
  597. $this->assertSame(bin2hex($from), bin2hex($to));
  598. // Test preserve unknown for 32-bit.
  599. $m = new TestMessage();
  600. $from = hex2bin('FD0600000000');
  601. $m->mergeFromString($from);
  602. $to = $m->serializeToString();
  603. $this->assertSame(bin2hex($from), bin2hex($to));
  604. // Test discard unknown in message.
  605. $m = new TestMessage();
  606. $from = hex2bin('F80601');
  607. $m->mergeFromString($from);
  608. $m->discardUnknownFields();
  609. $to = $m->serializeToString();
  610. $this->assertSame("", bin2hex($to));
  611. // Test discard unknown for singular message field.
  612. $m = new TestMessage();
  613. $from = hex2bin('8A0103F80601');
  614. $m->mergeFromString($from);
  615. $m->discardUnknownFields();
  616. $to = $m->serializeToString();
  617. $this->assertSame("8a0100", bin2hex($to));
  618. // Test discard unknown for repeated message field.
  619. $m = new TestMessage();
  620. $from = hex2bin('FA0203F80601');
  621. $m->mergeFromString($from);
  622. $m->discardUnknownFields();
  623. $to = $m->serializeToString();
  624. $this->assertSame("fa0200", bin2hex($to));
  625. // Test discard unknown for map message value field.
  626. $m = new TestMessage();
  627. $from = hex2bin("BA050708011203F80601");
  628. $m->mergeFromString($from);
  629. $m->discardUnknownFields();
  630. $to = $m->serializeToString();
  631. $this->assertSame("ba050408011200", bin2hex($to));
  632. // Test discard unknown for singular message field.
  633. $m = new TestMessage();
  634. $from = hex2bin('9A0403F80601');
  635. $m->mergeFromString($from);
  636. $m->discardUnknownFields();
  637. $to = $m->serializeToString();
  638. $this->assertSame("9a0400", bin2hex($to));
  639. }
  640. public function testJsonUnknown()
  641. {
  642. // Test unknown number
  643. $m = new TestMessage();
  644. $m->mergeFromJsonString("{\"unknown\":1,
  645. \"optionalInt32\":1}", true);
  646. $this->assertSame(1, $m->getOptionalInt32());
  647. // Test unknown bool
  648. $m = new TestMessage();
  649. $m->mergeFromJsonString("{\"unknown\":true,
  650. \"optionalInt32\":1}", true);
  651. $this->assertSame(1, $m->getOptionalInt32());
  652. // Test unknown string
  653. $m = new TestMessage();
  654. $m->mergeFromJsonString("{\"unknown\":\"abc\",
  655. \"optionalInt32\":1}", true);
  656. $this->assertSame(1, $m->getOptionalInt32());
  657. // Test unknown null
  658. $m = new TestMessage();
  659. $m->mergeFromJsonString("{\"unknown\":null,
  660. \"optionalInt32\":1}", true);
  661. $this->assertSame(1, $m->getOptionalInt32());
  662. // Test unknown array
  663. $m = new TestMessage();
  664. $m->mergeFromJsonString("{\"unknown\":[],
  665. \"optionalInt32\":1}", true);
  666. $this->assertSame(1, $m->getOptionalInt32());
  667. // Test unknown number array
  668. $m = new TestMessage();
  669. $m->mergeFromJsonString("{\"unknown\":[1],
  670. \"optionalInt32\":1}", true);
  671. $this->assertSame(1, $m->getOptionalInt32());
  672. // Test unknown bool array
  673. $m = new TestMessage();
  674. $m->mergeFromJsonString("{\"unknown\":[true],
  675. \"optionalInt32\":1}", true);
  676. $this->assertSame(1, $m->getOptionalInt32());
  677. // Test unknown string array
  678. $m = new TestMessage();
  679. $m->mergeFromJsonString("{\"unknown\":[\"a\"],
  680. \"optionalInt32\":1}", true);
  681. $this->assertSame(1, $m->getOptionalInt32());
  682. // Test unknown null array
  683. $m = new TestMessage();
  684. $m->mergeFromJsonString("{\"unknown\":[null],
  685. \"optionalInt32\":1}", true);
  686. $this->assertSame(1, $m->getOptionalInt32());
  687. // Test unknown array array
  688. $m = new TestMessage();
  689. $m->mergeFromJsonString("{\"unknown\":[[]],
  690. \"optionalInt32\":1}", true);
  691. $this->assertSame(1, $m->getOptionalInt32());
  692. // Test unknown object array
  693. $m = new TestMessage();
  694. $m->mergeFromJsonString("{\"unknown\":[{}],
  695. \"optionalInt32\":1}", true);
  696. $this->assertSame(1, $m->getOptionalInt32());
  697. // Test unknown double value array
  698. $m = new TestMessage();
  699. $m->mergeFromJsonString("{\"unknown\":[1, 2],
  700. \"optionalInt32\":1}", true);
  701. $this->assertSame(1, $m->getOptionalInt32());
  702. // Test unknown object
  703. $m = new TestMessage();
  704. $m->mergeFromJsonString("{\"unknown\":{},
  705. \"optionalInt32\":1}", true);
  706. $this->assertSame(1, $m->getOptionalInt32());
  707. // Test unknown number object
  708. $m = new TestMessage();
  709. $m->mergeFromJsonString("{\"unknown\":{\"a\":1},
  710. \"optionalInt32\":1}", true);
  711. $this->assertSame(1, $m->getOptionalInt32());
  712. // Test unknown bool object
  713. $m = new TestMessage();
  714. $m->mergeFromJsonString("{\"unknown\":{\"a\":true},
  715. \"optionalInt32\":1}", true);
  716. $this->assertSame(1, $m->getOptionalInt32());
  717. // Test unknown string object
  718. $m = new TestMessage();
  719. $m->mergeFromJsonString("{\"unknown\":{\"a\":\"a\"},
  720. \"optionalInt32\":1}", true);
  721. $this->assertSame(1, $m->getOptionalInt32());
  722. // Test unknown null object
  723. $m = new TestMessage();
  724. $m->mergeFromJsonString("{\"unknown\":{\"a\":null},
  725. \"optionalInt32\":1}", true);
  726. $this->assertSame(1, $m->getOptionalInt32());
  727. // Test unknown array object
  728. $m = new TestMessage();
  729. $m->mergeFromJsonString("{\"unknown\":{\"a\":[]},
  730. \"optionalInt32\":1}", true);
  731. $this->assertSame(1, $m->getOptionalInt32());
  732. // Test unknown object object
  733. $m = new TestMessage();
  734. $m->mergeFromJsonString("{\"unknown\":{\"a\":{}},
  735. \"optionalInt32\":1}", true);
  736. $this->assertSame(1, $m->getOptionalInt32());
  737. // Test unknown double value object
  738. $m = new TestMessage();
  739. $m->mergeFromJsonString("{\"unknown\":{\"a\":1, \"b\":1},
  740. \"optionalInt32\":1}", true);
  741. $this->assertSame(1, $m->getOptionalInt32());
  742. }
  743. public function testJsonEncode()
  744. {
  745. $from = new TestMessage();
  746. $this->setFields($from);
  747. $data = $from->serializeToJsonString();
  748. $to = new TestMessage();
  749. $to->mergeFromJsonString($data);
  750. $this->expectFields($to);
  751. }
  752. public function testDecodeDuration()
  753. {
  754. $m = new Google\Protobuf\Duration();
  755. $m->mergeFromJsonString("\"1234.5678s\"");
  756. $this->assertEquals(1234, $m->getSeconds());
  757. $this->assertEquals(567800000, $m->getNanos());
  758. }
  759. public function testEncodeDuration()
  760. {
  761. $m = new Google\Protobuf\Duration();
  762. $m->setSeconds(1234);
  763. $m->setNanos(999999999);
  764. $this->assertEquals("\"1234.999999999s\"", $m->serializeToJsonString());
  765. }
  766. public function testDecodeTimestamp()
  767. {
  768. $m = new Google\Protobuf\Timestamp();
  769. $m->mergeFromJsonString("\"2000-01-01T00:00:00.123456789Z\"");
  770. $this->assertEquals(946684800, $m->getSeconds());
  771. $this->assertEquals(123456789, $m->getNanos());
  772. }
  773. public function testEncodeTimestamp()
  774. {
  775. $m = new Google\Protobuf\Timestamp();
  776. $m->setSeconds(946684800);
  777. $m->setNanos(123456789);
  778. $this->assertEquals("\"2000-01-01T00:00:00.123456789Z\"",
  779. $m->serializeToJsonString());
  780. }
  781. public function testDecodeTopLevelValue()
  782. {
  783. $m = new Value();
  784. $m->mergeFromJsonString("\"a\"");
  785. $this->assertSame("a", $m->getStringValue());
  786. $m = new Value();
  787. $m->mergeFromJsonString("1.5");
  788. $this->assertSame(1.5, $m->getNumberValue());
  789. $m = new Value();
  790. $m->mergeFromJsonString("true");
  791. $this->assertSame(true, $m->getBoolValue());
  792. $m = new Value();
  793. $m->mergeFromJsonString("null");
  794. $this->assertSame("null_value", $m->getKind());
  795. $m = new Value();
  796. $m->mergeFromJsonString("[1]");
  797. $this->assertSame("list_value", $m->getKind());
  798. $m = new Value();
  799. $m->mergeFromJsonString("{\"a\":1}");
  800. $this->assertSame("struct_value", $m->getKind());
  801. }
  802. public function testEncodeTopLevelValue()
  803. {
  804. $m = new Value();
  805. $m->setStringValue("a");
  806. $this->assertSame("\"a\"", $m->serializeToJsonString());
  807. $m = new Value();
  808. $m->setNumberValue(1.5);
  809. $this->assertSame("1.5", $m->serializeToJsonString());
  810. $m = new Value();
  811. $m->setBoolValue(true);
  812. $this->assertSame("true", $m->serializeToJsonString());
  813. $m = new Value();
  814. $m->setNullValue(0);
  815. $this->assertSame("null", $m->serializeToJsonString());
  816. }
  817. public function testDecodeTopLevelListValue()
  818. {
  819. $m = new ListValue();
  820. $m->mergeFromJsonString("[1]");
  821. $this->assertSame(1.0, $m->getValues()[0]->getNumberValue());
  822. }
  823. public function testEncodeTopLevelListValue()
  824. {
  825. $m = new ListValue();
  826. $arr = $m->getValues();
  827. $sub = new Value();
  828. $sub->setNumberValue(1.5);
  829. $arr[] = $sub;
  830. $this->assertSame("[1.5]", $m->serializeToJsonString());
  831. }
  832. public function testEncodeEmptyListValue()
  833. {
  834. $m = new Struct();
  835. $m->setFields(['test' => (new Value())->setListValue(new ListValue())]);
  836. $this->assertSame('{"test":[]}', $m->serializeToJsonString());
  837. }
  838. public function testDecodeTopLevelStruct()
  839. {
  840. $m = new Struct();
  841. $m->mergeFromJsonString("{\"a\":{\"b\":1}}");
  842. $this->assertSame(1.0, $m->getFields()["a"]
  843. ->getStructValue()
  844. ->getFields()["b"]->getNumberValue());
  845. }
  846. public function testEncodeTopLevelStruct()
  847. {
  848. $m = new Struct();
  849. $map = $m->getFields();
  850. $sub = new Value();
  851. $sub->setNumberValue(1.5);
  852. $map["a"] = $sub;
  853. $this->assertSame("{\"a\":1.5}", $m->serializeToJsonString());
  854. }
  855. public function testEncodeEmptyStruct()
  856. {
  857. $m = new Struct();
  858. $m->setFields(['test' => (new Value())->setStructValue(new Struct())]);
  859. $this->assertSame('{"test":{}}', $m->serializeToJsonString());
  860. }
  861. public function testDecodeTopLevelAny()
  862. {
  863. // Make sure packed message has been created at least once.
  864. $packed = new TestMessage();
  865. $m1 = new Any();
  866. $m1->mergeFromJsonString(
  867. "{\"optionalInt32\": 1, " .
  868. "\"@type\":\"type.googleapis.com/foo.TestMessage\"}");
  869. $this->assertSame("type.googleapis.com/foo.TestMessage",
  870. $m1->getTypeUrl());
  871. $this->assertSame("0801", bin2hex($m1->getValue()));
  872. $m2 = new Any();
  873. $m2->mergeFromJsonString(
  874. "{\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
  875. "\"optionalInt32\": 1}");
  876. $this->assertSame("type.googleapis.com/foo.TestMessage",
  877. $m2->getTypeUrl());
  878. $this->assertSame("0801", bin2hex($m2->getValue()));
  879. $m3 = new Any();
  880. $m3->mergeFromJsonString(
  881. "{\"optionalInt32\": 1, " .
  882. "\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
  883. "\"optionalInt64\": 2}");
  884. $this->assertSame("type.googleapis.com/foo.TestMessage",
  885. $m3->getTypeUrl());
  886. $this->assertSame("08011002", bin2hex($m3->getValue()));
  887. }
  888. public function testDecodeAny()
  889. {
  890. // Make sure packed message has been created at least once.
  891. $packed = new TestMessage();
  892. $m1 = new TestAny();
  893. $m1->mergeFromJsonString(
  894. "{\"any\": {\"optionalInt32\": 1, " .
  895. "\"@type\":\"type.googleapis.com/foo.TestMessage\"}}");
  896. $this->assertSame("type.googleapis.com/foo.TestMessage",
  897. $m1->getAny()->getTypeUrl());
  898. $this->assertSame("0801", bin2hex($m1->getAny()->getValue()));
  899. $m2 = new TestAny();
  900. $m2->mergeFromJsonString(
  901. "{\"any\":{\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
  902. "\"optionalInt32\": 1}}");
  903. $this->assertSame("type.googleapis.com/foo.TestMessage",
  904. $m2->getAny()->getTypeUrl());
  905. $this->assertSame("0801", bin2hex($m2->getAny()->getValue()));
  906. $m3 = new TestAny();
  907. $m3->mergeFromJsonString(
  908. "{\"any\":{\"optionalInt32\": 1, " .
  909. "\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
  910. "\"optionalInt64\": 2}}");
  911. $this->assertSame("type.googleapis.com/foo.TestMessage",
  912. $m3->getAny()->getTypeUrl());
  913. $this->assertSame("08011002", bin2hex($m3->getAny()->getValue()));
  914. }
  915. public function testDecodeAnyWithWellKnownPacked()
  916. {
  917. // Make sure packed message has been created at least once.
  918. $packed = new Int32Value();
  919. $m1 = new TestAny();
  920. $m1->mergeFromJsonString(
  921. "{\"any\":" .
  922. " {\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
  923. " \"value\":1}}");
  924. $this->assertSame("type.googleapis.com/google.protobuf.Int32Value",
  925. $m1->getAny()->getTypeUrl());
  926. $this->assertSame("0801", bin2hex($m1->getAny()->getValue()));
  927. }
  928. /**
  929. * @expectedException Exception
  930. */
  931. public function testDecodeAnyWithUnknownPacked()
  932. {
  933. $m = new TestAny();
  934. $m->mergeFromJsonString(
  935. "{\"any\":" .
  936. " {\"@type\":\"type.googleapis.com/unknown\"," .
  937. " \"value\":1}}");
  938. }
  939. public function testEncodeTopLevelAny()
  940. {
  941. // Test a normal message.
  942. $packed = new TestMessage();
  943. $packed->setOptionalInt32(123);
  944. $packed->setOptionalString("abc");
  945. $m = new Any();
  946. $m->pack($packed);
  947. $expected1 =
  948. "{\"@type\":\"type.googleapis.com/foo.TestMessage\"," .
  949. "\"optional_int32\":123,\"optional_string\":\"abc\"}";
  950. $expected2 =
  951. "{\"@type\":\"type.googleapis.com/foo.TestMessage\"," .
  952. "\"optionalInt32\":123,\"optionalString\":\"abc\"}";
  953. $result = $m->serializeToJsonString();
  954. $this->assertTrue($expected1 === $result || $expected2 === $result);
  955. // Test a well known message.
  956. $packed = new Int32Value();
  957. $packed->setValue(123);
  958. $m = new Any();
  959. $m->pack($packed);
  960. $this->assertSame(
  961. "{\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
  962. "\"value\":123}",
  963. $m->serializeToJsonString());
  964. // Test an Any message.
  965. $outer = new Any();
  966. $outer->pack($m);
  967. $this->assertSame(
  968. "{\"@type\":\"type.googleapis.com/google.protobuf.Any\"," .
  969. "\"value\":{\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
  970. "\"value\":123}}",
  971. $outer->serializeToJsonString());
  972. // Test a Timestamp message.
  973. $packed = new Google\Protobuf\Timestamp();
  974. $packed->setSeconds(946684800);
  975. $packed->setNanos(123456789);
  976. $m = new Any();
  977. $m->pack($packed);
  978. $this->assertSame(
  979. "{\"@type\":\"type.googleapis.com/google.protobuf.Timestamp\"," .
  980. "\"value\":\"2000-01-01T00:00:00.123456789Z\"}",
  981. $m->serializeToJsonString());
  982. }
  983. public function testDecodeTopLevelFieldMask()
  984. {
  985. $m = new TestMessage();
  986. $m->setMapStringString(['a'=>'abcdefg']);
  987. $data1 = $m->serializeToJsonString();
  988. $n = new TestMessage();
  989. $n->mergeFromJsonString($data1);
  990. $data2 = $n->serializeToJsonString();
  991. $this->assertSame($data1, $data2);
  992. $m = new FieldMask();
  993. $m->mergeFromJsonString("\"foo.barBaz,qux\"");
  994. $this->assertSame("foo.bar_baz", $m->getPaths()[0]);
  995. $this->assertSame("qux", $m->getPaths()[1]);
  996. }
  997. public function testEncodeTopLevelFieldMask()
  998. {
  999. $m = new FieldMask();
  1000. $m->setPaths(["foo.bar_baz", "qux"]);
  1001. $this->assertSame("\"foo.barBaz,qux\"", $m->serializeToJsonString());
  1002. }
  1003. public function testDecodeEmptyFieldMask()
  1004. {
  1005. $m = new FieldMask();
  1006. $m->mergeFromJsonString("\"\"");
  1007. $this->assertEquals("", $m->serializeToString());
  1008. }
  1009. public function testJsonDecodeMapWithDefaultValueKey()
  1010. {
  1011. $m = new TestMessage();
  1012. $m->getMapInt32Int32()[0] = 0;
  1013. $this->assertSame("{\"mapInt32Int32\":{\"0\":0}}",
  1014. $m->serializeToJsonString());
  1015. $m = new TestMessage();
  1016. $m->getMapStringString()[""] = "";
  1017. $this->assertSame("{\"mapStringString\":{\"\":\"\"}}",
  1018. $m->serializeToJsonString());
  1019. }
  1020. public function testJsonDecodeNumericStringMapKey()
  1021. {
  1022. $m = new TestMessage();
  1023. $m->getMapStringString()["1"] = "1";
  1024. $data = $m->serializeToJsonString();
  1025. $this->assertSame("{\"mapStringString\":{\"1\":\"1\"}}", $data);
  1026. $n = new TestMessage();
  1027. $n->mergeFromJsonString($data);
  1028. }
  1029. }