encode_decode_test.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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. }
  75. public function testPackedEncode()
  76. {
  77. $from = new TestPackedMessage();
  78. TestUtil::setTestPackedMessage($from);
  79. $this->assertSame(TestUtil::getGoldenTestPackedMessage(),
  80. $from->serializeToString());
  81. }
  82. public function testPackedDecodePacked()
  83. {
  84. $to = new TestPackedMessage();
  85. $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
  86. TestUtil::assertTestPackedMessage($to);
  87. }
  88. public function testPackedDecodeUnpacked()
  89. {
  90. $to = new TestPackedMessage();
  91. $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
  92. TestUtil::assertTestPackedMessage($to);
  93. }
  94. public function testUnpackedEncode()
  95. {
  96. $from = new TestUnpackedMessage();
  97. TestUtil::setTestPackedMessage($from);
  98. $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(),
  99. $from->serializeToString());
  100. }
  101. public function testUnpackedDecodePacked()
  102. {
  103. $to = new TestUnpackedMessage();
  104. $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
  105. TestUtil::assertTestPackedMessage($to);
  106. }
  107. public function testUnpackedDecodeUnpacked()
  108. {
  109. $to = new TestUnpackedMessage();
  110. $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
  111. TestUtil::assertTestPackedMessage($to);
  112. }
  113. public function testDecodeInt64()
  114. {
  115. // Read 64 testing
  116. $testVals = array(
  117. '10' => '100a',
  118. '100' => '1064',
  119. '800' => '10a006',
  120. '6400' => '108032',
  121. '70400' => '1080a604',
  122. '774400' => '1080a22f',
  123. '9292800' => '108098b704',
  124. '74342400' => '1080c0b923',
  125. '743424000' => '108080bfe202',
  126. '8177664000' => '108080b5bb1e',
  127. '65421312000' => '108080a8dbf301',
  128. '785055744000' => '108080e0c7ec16',
  129. '9420668928000' => '10808080dd969202',
  130. '103627358208000' => '10808080fff9c717',
  131. '1139900940288000' => '10808080f5bd978302',
  132. '13678811283456000' => '10808080fce699a618',
  133. '109430490267648000' => '10808080e0b7ceb1c201',
  134. '984874412408832000' => '10808080e0f5c1bed50d',
  135. );
  136. $msg = new TestMessage();
  137. foreach ($testVals as $original => $encoded) {
  138. $msg->setOptionalInt64($original);
  139. $data = $msg->serializeToString();
  140. $this->assertSame($encoded, bin2hex($data));
  141. $msg->setOptionalInt64(0);
  142. $msg->mergeFromString($data);
  143. $this->assertEquals($original, $msg->getOptionalInt64());
  144. }
  145. }
  146. public function testDecodeToExistingMessage()
  147. {
  148. $m1 = new TestMessage();
  149. $this->setFields($m1);
  150. $this->expectFields($m1);
  151. $m2 = new TestMessage();
  152. $this->setFields2($m2);
  153. $data = $m2->serializeToString();
  154. $m1->mergeFromString($data);
  155. $this->expectFieldsMerged($m1);
  156. }
  157. public function testDecodeFieldNonExist()
  158. {
  159. $data = hex2bin('c80501');
  160. $m = new TestMessage();
  161. $m->mergeFromString($data);
  162. }
  163. public function testEncodeNegativeInt32()
  164. {
  165. $m = new TestMessage();
  166. $m->setOptionalInt32(-1);
  167. $data = $m->encode();
  168. $this->assertSame("08ffffffffffffffffff01", bin2hex($data));
  169. }
  170. public function testDecodeNegativeInt32()
  171. {
  172. $m = new TestMessage();
  173. $this->assertEquals(0, $m->getOptionalInt32());
  174. $m->decode(hex2bin("08ffffffffffffffffff01"));
  175. $this->assertEquals(-1, $m->getOptionalInt32());
  176. $m = new TestMessage();
  177. $this->assertEquals(0, $m->getOptionalInt32());
  178. $m->decode(hex2bin("08ffffffff0f"));
  179. $this->assertEquals(-1, $m->getOptionalInt32());
  180. }
  181. # TODO(teboring): Add test back when php implementation is ready for json
  182. # encode/decode.
  183. # public function testJsonEncode()
  184. # {
  185. # $from = new TestMessage();
  186. # $this->setFields($from);
  187. # $data = $from->jsonEncode();
  188. # $to = new TestMessage();
  189. # $to->jsonDecode($data);
  190. # $this->expectFields($to);
  191. # }
  192. }