encode_decode_test.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  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\TestUnpackedMessage;
  11. class EncodeDecodeTest extends TestBase
  12. {
  13. public function testEncode()
  14. {
  15. $from = new TestMessage();
  16. $this->expectEmptyFields($from);
  17. $this->setFields($from);
  18. $this->expectFields($from);
  19. $data = $from->serializeToString();
  20. $this->assertSame(bin2hex(TestUtil::getGoldenTestMessage()),
  21. bin2hex($data));
  22. }
  23. public function testDecode()
  24. {
  25. $to = new TestMessage();
  26. $to->mergeFromString(TestUtil::getGoldenTestMessage());
  27. $this->expectFields($to);
  28. }
  29. public function testEncodeDecode()
  30. {
  31. $from = new TestMessage();
  32. $this->expectEmptyFields($from);
  33. $this->setFields($from);
  34. $this->expectFields($from);
  35. $data = $from->serializeToString();
  36. $to = new TestMessage();
  37. $to->mergeFromString($data);
  38. $this->expectFields($to);
  39. }
  40. public function testEncodeDecodeEmpty()
  41. {
  42. $from = new TestMessage();
  43. $this->expectEmptyFields($from);
  44. $data = $from->serializeToString();
  45. $to = new TestMessage();
  46. $to->mergeFromString($data);
  47. $this->expectEmptyFields($to);
  48. }
  49. public function testEncodeDecodeOneof()
  50. {
  51. $m = new TestMessage();
  52. $m->setOneofInt32(1);
  53. $data = $m->serializeToString();
  54. $n = new TestMessage();
  55. $n->mergeFromString($data);
  56. $this->assertSame(1, $n->getOneofInt32());
  57. $m->setOneofFloat(2.0);
  58. $data = $m->serializeToString();
  59. $n = new TestMessage();
  60. $n->mergeFromString($data);
  61. $this->assertSame(2.0, $n->getOneofFloat());
  62. $m->setOneofString('abc');
  63. $data = $m->serializeToString();
  64. $n = new TestMessage();
  65. $n->mergeFromString($data);
  66. $this->assertSame('abc', $n->getOneofString());
  67. $sub_m = new TestMessage_Sub();
  68. $sub_m->setA(1);
  69. $m->setOneofMessage($sub_m);
  70. $data = $m->serializeToString();
  71. $n = new TestMessage();
  72. $n->mergeFromString($data);
  73. $this->assertSame(1, $n->getOneofMessage()->getA());
  74. // Encode default value
  75. $m->setOneofEnum(TestEnum::ZERO);
  76. $data = $m->serializeToString();
  77. $n = new TestMessage();
  78. $n->mergeFromString($data);
  79. $this->assertSame("oneof_enum", $n->getMyOneof());
  80. }
  81. public function testPackedEncode()
  82. {
  83. $from = new TestPackedMessage();
  84. TestUtil::setTestPackedMessage($from);
  85. $this->assertSame(TestUtil::getGoldenTestPackedMessage(),
  86. $from->serializeToString());
  87. }
  88. public function testPackedDecodePacked()
  89. {
  90. $to = new TestPackedMessage();
  91. $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
  92. TestUtil::assertTestPackedMessage($to);
  93. }
  94. public function testPackedDecodeUnpacked()
  95. {
  96. $to = new TestPackedMessage();
  97. $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
  98. TestUtil::assertTestPackedMessage($to);
  99. }
  100. public function testUnpackedEncode()
  101. {
  102. $from = new TestUnpackedMessage();
  103. TestUtil::setTestPackedMessage($from);
  104. $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(),
  105. $from->serializeToString());
  106. }
  107. public function testUnpackedDecodePacked()
  108. {
  109. $to = new TestUnpackedMessage();
  110. $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
  111. TestUtil::assertTestPackedMessage($to);
  112. }
  113. public function testUnpackedDecodeUnpacked()
  114. {
  115. $to = new TestUnpackedMessage();
  116. $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
  117. TestUtil::assertTestPackedMessage($to);
  118. }
  119. public function testDecodeInt64()
  120. {
  121. // Read 64 testing
  122. $testVals = array(
  123. '10' => '100a',
  124. '100' => '1064',
  125. '800' => '10a006',
  126. '6400' => '108032',
  127. '70400' => '1080a604',
  128. '774400' => '1080a22f',
  129. '9292800' => '108098b704',
  130. '74342400' => '1080c0b923',
  131. '743424000' => '108080bfe202',
  132. '8177664000' => '108080b5bb1e',
  133. '65421312000' => '108080a8dbf301',
  134. '785055744000' => '108080e0c7ec16',
  135. '9420668928000' => '10808080dd969202',
  136. '103627358208000' => '10808080fff9c717',
  137. '1139900940288000' => '10808080f5bd978302',
  138. '13678811283456000' => '10808080fce699a618',
  139. '109430490267648000' => '10808080e0b7ceb1c201',
  140. '984874412408832000' => '10808080e0f5c1bed50d',
  141. );
  142. $msg = new TestMessage();
  143. foreach ($testVals as $original => $encoded) {
  144. $msg->setOptionalInt64($original);
  145. $data = $msg->serializeToString();
  146. $this->assertSame($encoded, bin2hex($data));
  147. $msg->setOptionalInt64(0);
  148. $msg->mergeFromString($data);
  149. $this->assertEquals($original, $msg->getOptionalInt64());
  150. }
  151. }
  152. public function testDecodeToExistingMessage()
  153. {
  154. $m1 = new TestMessage();
  155. $this->setFields($m1);
  156. $this->expectFields($m1);
  157. $m2 = new TestMessage();
  158. $this->setFields2($m2);
  159. $data = $m2->serializeToString();
  160. $m1->mergeFromString($data);
  161. $this->expectFieldsMerged($m1);
  162. }
  163. public function testDecodeFieldNonExist()
  164. {
  165. $data = hex2bin('c80501');
  166. $m = new TestMessage();
  167. $m->mergeFromString($data);
  168. }
  169. public function testEncodeNegativeInt32()
  170. {
  171. $m = new TestMessage();
  172. $m->setOptionalInt32(-1);
  173. $data = $m->serializeToString();
  174. $this->assertSame("08ffffffffffffffffff01", bin2hex($data));
  175. }
  176. public function testDecodeNegativeInt32()
  177. {
  178. $m = new TestMessage();
  179. $this->assertEquals(0, $m->getOptionalInt32());
  180. $m->mergeFromString(hex2bin("08ffffffffffffffffff01"));
  181. $this->assertEquals(-1, $m->getOptionalInt32());
  182. $m = new TestMessage();
  183. $this->assertEquals(0, $m->getOptionalInt32());
  184. $m->mergeFromString(hex2bin("08ffffffff0f"));
  185. $this->assertEquals(-1, $m->getOptionalInt32());
  186. }
  187. /**
  188. * @expectedException Exception
  189. */
  190. public function testDecodeInvalidInt32()
  191. {
  192. $m = new TestMessage();
  193. $m->mergeFromString(hex2bin('08'));
  194. }
  195. /**
  196. * @expectedException Exception
  197. */
  198. public function testDecodeInvalidSubMessage()
  199. {
  200. $m = new TestMessage();
  201. $m->mergeFromString(hex2bin('9A010108'));
  202. }
  203. /**
  204. * @expectedException Exception
  205. */
  206. public function testDecodeInvalidInt64()
  207. {
  208. $m = new TestMessage();
  209. $m->mergeFromString(hex2bin('10'));
  210. }
  211. /**
  212. * @expectedException Exception
  213. */
  214. public function testDecodeInvalidUInt32()
  215. {
  216. $m = new TestMessage();
  217. $m->mergeFromString(hex2bin('18'));
  218. }
  219. /**
  220. * @expectedException Exception
  221. */
  222. public function testDecodeInvalidUInt64()
  223. {
  224. $m = new TestMessage();
  225. $m->mergeFromString(hex2bin('20'));
  226. }
  227. /**
  228. * @expectedException Exception
  229. */
  230. public function testDecodeInvalidSInt32()
  231. {
  232. $m = new TestMessage();
  233. $m->mergeFromString(hex2bin('28'));
  234. }
  235. /**
  236. * @expectedException Exception
  237. */
  238. public function testDecodeInvalidSInt64()
  239. {
  240. $m = new TestMessage();
  241. $m->mergeFromString(hex2bin('30'));
  242. }
  243. /**
  244. * @expectedException Exception
  245. */
  246. public function testDecodeInvalidFixed32()
  247. {
  248. $m = new TestMessage();
  249. $m->mergeFromString(hex2bin('3D'));
  250. }
  251. /**
  252. * @expectedException Exception
  253. */
  254. public function testDecodeInvalidFixed64()
  255. {
  256. $m = new TestMessage();
  257. $m->mergeFromString(hex2bin('41'));
  258. }
  259. /**
  260. * @expectedException Exception
  261. */
  262. public function testDecodeInvalidSFixed32()
  263. {
  264. $m = new TestMessage();
  265. $m->mergeFromString(hex2bin('4D'));
  266. }
  267. /**
  268. * @expectedException Exception
  269. */
  270. public function testDecodeInvalidSFixed64()
  271. {
  272. $m = new TestMessage();
  273. $m->mergeFromString(hex2bin('51'));
  274. }
  275. /**
  276. * @expectedException Exception
  277. */
  278. public function testDecodeInvalidFloat()
  279. {
  280. $m = new TestMessage();
  281. $m->mergeFromString(hex2bin('5D'));
  282. }
  283. /**
  284. * @expectedException Exception
  285. */
  286. public function testDecodeInvalidDouble()
  287. {
  288. $m = new TestMessage();
  289. $m->mergeFromString(hex2bin('61'));
  290. }
  291. /**
  292. * @expectedException Exception
  293. */
  294. public function testDecodeInvalidBool()
  295. {
  296. $m = new TestMessage();
  297. $m->mergeFromString(hex2bin('68'));
  298. }
  299. /**
  300. * @expectedException Exception
  301. */
  302. public function testDecodeInvalidStringLengthMiss()
  303. {
  304. $m = new TestMessage();
  305. $m->mergeFromString(hex2bin('72'));
  306. }
  307. /**
  308. * @expectedException Exception
  309. */
  310. public function testDecodeInvalidStringDataMiss()
  311. {
  312. $m = new TestMessage();
  313. $m->mergeFromString(hex2bin('7201'));
  314. }
  315. /**
  316. * @expectedException Exception
  317. */
  318. public function testDecodeInvalidBytesLengthMiss()
  319. {
  320. $m = new TestMessage();
  321. $m->mergeFromString(hex2bin('7A'));
  322. }
  323. /**
  324. * @expectedException Exception
  325. */
  326. public function testDecodeInvalidBytesDataMiss()
  327. {
  328. $m = new TestMessage();
  329. $m->mergeFromString(hex2bin('7A01'));
  330. }
  331. /**
  332. * @expectedException Exception
  333. */
  334. public function testDecodeInvalidEnum()
  335. {
  336. $m = new TestMessage();
  337. $m->mergeFromString(hex2bin('8001'));
  338. }
  339. /**
  340. * @expectedException Exception
  341. */
  342. public function testDecodeInvalidMessageLengthMiss()
  343. {
  344. $m = new TestMessage();
  345. $m->mergeFromString(hex2bin('8A01'));
  346. }
  347. /**
  348. * @expectedException Exception
  349. */
  350. public function testDecodeInvalidMessageDataMiss()
  351. {
  352. $m = new TestMessage();
  353. $m->mergeFromString(hex2bin('8A0101'));
  354. }
  355. /**
  356. * @expectedException Exception
  357. */
  358. public function testDecodeInvalidPackedMessageLength()
  359. {
  360. $m = new TestPackedMessage();
  361. $m->mergeFromString(hex2bin('D205'));
  362. }
  363. # TODO(teboring): Add test back when php implementation is ready for json
  364. # encode/decode.
  365. # public function testJsonEncode()
  366. # {
  367. # $from = new TestMessage();
  368. # $this->setFields($from);
  369. # $data = $from->jsonEncode();
  370. # $to = new TestMessage();
  371. # $to->jsonDecode($data);
  372. # $this->expectFields($to);
  373. # }
  374. }