blob: d471a5a17a070f5e09aae6f048248d65696a43a4 [file] [log] [blame]
Paul Yange0e54662016-09-15 11:09:01 -07001<?php
2
Paul Yange0e54662016-09-15 11:09:01 -07003require_once('test_base.php');
4require_once('test_util.php');
5
6use Google\Protobuf\RepeatedField;
7use Google\Protobuf\GPBType;
Paul Yang601f6962019-11-14 12:17:04 -08008use Foo\TestInt32Value;
9use Foo\TestInt64Value;
10use Foo\TestUInt32Value;
11use Foo\TestUInt64Value;
12use Foo\TestBoolValue;
Paul Yanga32c2d02019-09-30 14:43:03 -070013use Foo\TestStringValue;
Paul Yang601f6962019-11-14 12:17:04 -080014use Foo\TestBytesValue;
Paul Yang8faa7782018-12-26 10:36:09 -080015use Foo\TestAny;
Paul Yange0e54662016-09-15 11:09:01 -070016use Foo\TestEnum;
Joshua Habermand5079ed2021-01-27 10:12:59 -080017use Foo\TestLargeFieldNumber;
Paul Yange0e54662016-09-15 11:09:01 -070018use Foo\TestMessage;
Brent Shaffer67379542018-05-23 16:43:30 -070019use Foo\TestMessage\Sub;
Paul Yange0e54662016-09-15 11:09:01 -070020use Foo\TestPackedMessage;
Paul Yangc78dbd72017-07-14 15:48:48 -060021use Foo\TestRandomFieldOrder;
Paul Yange0e54662016-09-15 11:09:01 -070022use Foo\TestUnpackedMessage;
Paul Yang8faa7782018-12-26 10:36:09 -080023use Google\Protobuf\Any;
Bo Yange3ee7162018-08-10 18:09:02 +000024use Google\Protobuf\DoubleValue;
Paul Yangc4f2a922019-01-17 10:18:43 -080025use Google\Protobuf\FieldMask;
Bo Yange3ee7162018-08-10 18:09:02 +000026use Google\Protobuf\FloatValue;
27use Google\Protobuf\Int32Value;
28use Google\Protobuf\UInt32Value;
29use Google\Protobuf\Int64Value;
30use Google\Protobuf\UInt64Value;
31use Google\Protobuf\BoolValue;
32use Google\Protobuf\StringValue;
33use Google\Protobuf\BytesValue;
Paul Yang9bda1f12018-09-22 18:57:43 -070034use Google\Protobuf\Value;
35use Google\Protobuf\ListValue;
36use Google\Protobuf\Struct;
Paul Yangd2d4b402018-10-12 13:46:26 -070037use Google\Protobuf\GPBEmpty;
Paul Yange0e54662016-09-15 11:09:01 -070038
39class EncodeDecodeTest extends TestBase
40{
Bo Yange3ee7162018-08-10 18:09:02 +000041 public function testDecodeJsonSimple()
42 {
43 $m = new TestMessage();
44 $m->mergeFromJsonString("{\"optionalInt32\":1}");
Paul Yangd7c44092018-12-18 10:57:03 -080045 $this->assertEquals(1, $m->getOptionalInt32());
Bo Yange3ee7162018-08-10 18:09:02 +000046 }
47
48 public function testDecodeTopLevelBoolValue()
49 {
50 $m = new BoolValue();
51
52 $m->mergeFromJsonString("true");
53 $this->assertEquals(true, $m->getValue());
54
55 $m->mergeFromJsonString("false");
56 $this->assertEquals(false, $m->getValue());
57 }
58
Paul Yang9bda1f12018-09-22 18:57:43 -070059 public function testEncodeTopLevelBoolValue()
60 {
61 $m = new BoolValue();
62 $m->setValue(true);
63 $this->assertSame("true", $m->serializeToJsonString());
64 }
65
Bo Yange3ee7162018-08-10 18:09:02 +000066 public function testDecodeTopLevelDoubleValue()
67 {
68 $m = new DoubleValue();
69 $m->mergeFromJsonString("1.5");
70 $this->assertEquals(1.5, $m->getValue());
71 }
72
Paul Yang9bda1f12018-09-22 18:57:43 -070073 public function testEncodeTopLevelDoubleValue()
74 {
75 $m = new DoubleValue();
76 $m->setValue(1.5);
77 $this->assertSame("1.5", $m->serializeToJsonString());
78 }
79
Bo Yange3ee7162018-08-10 18:09:02 +000080 public function testDecodeTopLevelFloatValue()
81 {
82 $m = new FloatValue();
83 $m->mergeFromJsonString("1.5");
84 $this->assertEquals(1.5, $m->getValue());
85 }
86
Paul Yang9bda1f12018-09-22 18:57:43 -070087 public function testEncodeTopLevelFloatValue()
88 {
89 $m = new FloatValue();
90 $m->setValue(1.5);
91 $this->assertSame("1.5", $m->serializeToJsonString());
92 }
93
Bo Yange3ee7162018-08-10 18:09:02 +000094 public function testDecodeTopLevelInt32Value()
95 {
96 $m = new Int32Value();
97 $m->mergeFromJsonString("1");
98 $this->assertEquals(1, $m->getValue());
99 }
100
Paul Yang9bda1f12018-09-22 18:57:43 -0700101 public function testEncodeTopLevelInt32Value()
102 {
103 $m = new Int32Value();
104 $m->setValue(1);
105 $this->assertSame("1", $m->serializeToJsonString());
106 }
107
Paul Yang601f6962019-11-14 12:17:04 -0800108 public function testDecodeRepeatedInt32Value()
109 {
110 $m = new TestInt32Value();
111 $m->mergeFromJsonString("{\"repeated_field\":[12345]}");
112 $this->assertSame(12345, $m->getRepeatedField()[0]->getValue());
113 }
114
Bo Yange3ee7162018-08-10 18:09:02 +0000115 public function testDecodeTopLevelUInt32Value()
116 {
117 $m = new UInt32Value();
118 $m->mergeFromJsonString("1");
119 $this->assertEquals(1, $m->getValue());
120 }
121
Paul Yang9bda1f12018-09-22 18:57:43 -0700122 public function testEncodeTopLevelUInt32Value()
123 {
124 $m = new UInt32Value();
125 $m->setValue(1);
126 $this->assertSame("1", $m->serializeToJsonString());
127 }
128
Bo Yange3ee7162018-08-10 18:09:02 +0000129 public function testDecodeTopLevelInt64Value()
130 {
131 $m = new Int64Value();
132 $m->mergeFromJsonString("1");
133 $this->assertEquals(1, $m->getValue());
134 }
135
Paul Yang6b3024f2019-08-19 17:16:58 -0700136 public function testDecodeTopLevelInt64ValueAsString()
137 {
138 $m = new Int64Value();
139 $m->mergeFromJsonString("\"1\"");
140 $this->assertEquals(1, $m->getValue());
141 }
142
143 public function testEncodeTopLevelInt64Value()
144 {
145 $m = new Int64Value();
146 $m->setValue(1);
147 $this->assertSame("\"1\"", $m->serializeToJsonString());
148 }
Paul Yang9bda1f12018-09-22 18:57:43 -0700149
Bo Yange3ee7162018-08-10 18:09:02 +0000150 public function testDecodeTopLevelUInt64Value()
151 {
152 $m = new UInt64Value();
153 $m->mergeFromJsonString("1");
154 $this->assertEquals(1, $m->getValue());
155 }
156
Paul Yang6b3024f2019-08-19 17:16:58 -0700157 public function testDecodeTopLevelUInt64ValueAsString()
158 {
159 $m = new UInt64Value();
160 $m->mergeFromJsonString("\"1\"");
161 $this->assertEquals(1, $m->getValue());
162 }
163
164 public function testEncodeTopLevelUInt64Value()
165 {
166 $m = new UInt64Value();
167 $m->setValue(1);
168 $this->assertSame("\"1\"", $m->serializeToJsonString());
169 }
Paul Yang9bda1f12018-09-22 18:57:43 -0700170
Bo Yange3ee7162018-08-10 18:09:02 +0000171 public function testDecodeTopLevelStringValue()
172 {
173 $m = new StringValue();
174 $m->mergeFromJsonString("\"a\"");
175 $this->assertSame("a", $m->getValue());
176 }
177
Paul Yang9bda1f12018-09-22 18:57:43 -0700178 public function testEncodeTopLevelStringValue()
179 {
180 $m = new StringValue();
181 $m->setValue("a");
182 $this->assertSame("\"a\"", $m->serializeToJsonString());
183 }
184
Paul Yang601f6962019-11-14 12:17:04 -0800185 public function testDecodeRepeatedStringValue()
Paul Yanga32c2d02019-09-30 14:43:03 -0700186 {
Paul Yang601f6962019-11-14 12:17:04 -0800187 $m = new TestStringValue();
188 $m->mergeFromJsonString("{\"repeated_field\":[\"a\"]}");
189 $this->assertSame("a", $m->getRepeatedField()[0]->getValue());
190 }
191
192 public function testDecodeMapStringValue()
193 {
194 $m = new TestStringValue();
195 $m->mergeFromJsonString("{\"map_field\":{\"1\": \"a\"}}");
196 $this->assertSame("a", $m->getMapField()[1]->getValue());
Paul Yanga32c2d02019-09-30 14:43:03 -0700197 }
198
Bo Yange3ee7162018-08-10 18:09:02 +0000199 public function testDecodeTopLevelBytesValue()
200 {
201 $m = new BytesValue();
202 $m->mergeFromJsonString("\"YQ==\"");
203 $this->assertSame("a", $m->getValue());
204 }
Paul Yange0e54662016-09-15 11:09:01 -0700205
Paul Yang9bda1f12018-09-22 18:57:43 -0700206 public function testEncodeTopLevelBytesValue()
207 {
208 $m = new BytesValue();
209 $m->setValue("a");
210 $this->assertSame("\"YQ==\"", $m->serializeToJsonString());
211 }
212
Paul Yangba42cb52019-03-25 10:51:18 -0700213 public function generateRandomString($length = 10) {
214 $randomString = str_repeat("+", $length);
215 for ($i = 0; $i < $length; $i++) {
Paul Yang823f3512020-12-04 13:46:34 -0800216 $randomString[$i] = chr(rand(0, 255));
Paul Yangba42cb52019-03-25 10:51:18 -0700217 }
218 return $randomString;
219 }
220
221 public function testEncodeTopLevelLongBytesValue()
222 {
223 $m = new BytesValue();
224 $data = $this->generateRandomString(12007);
225 $m->setValue($data);
226 $expected = "\"" . base64_encode($data) . "\"";
227 $this->assertSame(strlen($expected), strlen($m->serializeToJsonString()));
228 }
229
Paul Yangb9c4daa2017-07-09 07:49:25 -0700230 public function testEncode()
231 {
232 $from = new TestMessage();
233 $this->expectEmptyFields($from);
234 $this->setFields($from);
235 $this->expectFields($from);
236
237 $data = $from->serializeToString();
238 $this->assertSame(bin2hex(TestUtil::getGoldenTestMessage()),
239 bin2hex($data));
240 }
241
242 public function testDecode()
243 {
244 $to = new TestMessage();
245 $to->mergeFromString(TestUtil::getGoldenTestMessage());
246 $this->expectFields($to);
247 }
248
249 public function testEncodeDecode()
250 {
251 $from = new TestMessage();
252 $this->expectEmptyFields($from);
253 $this->setFields($from);
254 $this->expectFields($from);
255
256 $data = $from->serializeToString();
257
258 $to = new TestMessage();
259 $to->mergeFromString($data);
260 $this->expectFields($to);
261 }
262
263 public function testEncodeDecodeEmpty()
264 {
265 $from = new TestMessage();
266 $this->expectEmptyFields($from);
267
268 $data = $from->serializeToString();
269
270 $to = new TestMessage();
271 $to->mergeFromString($data);
272 $this->expectEmptyFields($to);
273 }
Paul Yange0e54662016-09-15 11:09:01 -0700274
275 public function testEncodeDecodeOneof()
276 {
277 $m = new TestMessage();
278
Paul Yangb9c4daa2017-07-09 07:49:25 -0700279 $m->setOneofInt32(1);
280 $data = $m->serializeToString();
281 $n = new TestMessage();
282 $n->mergeFromString($data);
283 $this->assertSame(1, $n->getOneofInt32());
284
285 $m->setOneofFloat(2.0);
286 $data = $m->serializeToString();
287 $n = new TestMessage();
288 $n->mergeFromString($data);
289 $this->assertSame(2.0, $n->getOneofFloat());
290
291 $m->setOneofString('abc');
292 $data = $m->serializeToString();
293 $n = new TestMessage();
294 $n->mergeFromString($data);
295 $this->assertSame('abc', $n->getOneofString());
296
Brent Shaffer67379542018-05-23 16:43:30 -0700297 $sub_m = new Sub();
Paul Yangb9c4daa2017-07-09 07:49:25 -0700298 $sub_m->setA(1);
299 $m->setOneofMessage($sub_m);
300 $data = $m->serializeToString();
301 $n = new TestMessage();
302 $n->mergeFromString($data);
303 $this->assertSame(1, $n->getOneofMessage()->getA());
Paul Yang1e86ef42017-05-29 22:04:20 -0700304
305 // Encode default value
Paul Yangb9c4daa2017-07-09 07:49:25 -0700306 $m->setOneofEnum(TestEnum::ZERO);
307 $data = $m->serializeToString();
308 $n = new TestMessage();
309 $n->mergeFromString($data);
310 $this->assertSame("oneof_enum", $n->getMyOneof());
311 $this->assertSame(TestEnum::ZERO, $n->getOneofEnum());
Paul Yangecca6ea2017-06-30 12:14:09 -0700312
313 $m->setOneofString("");
Paul Yang1e86ef42017-05-29 22:04:20 -0700314 $data = $m->serializeToString();
315 $n = new TestMessage();
316 $n->mergeFromString($data);
Paul Yangecca6ea2017-06-30 12:14:09 -0700317 $this->assertSame("oneof_string", $n->getMyOneof());
Paul Yangb9c4daa2017-07-09 07:49:25 -0700318 $this->assertSame("", $n->getOneofString());
Paul Yangecca6ea2017-06-30 12:14:09 -0700319
Brent Shaffer67379542018-05-23 16:43:30 -0700320 $sub_m = new Sub();
Paul Yangb9c4daa2017-07-09 07:49:25 -0700321 $m->setOneofMessage($sub_m);
322 $data = $m->serializeToString();
323 $n = new TestMessage();
324 $n->mergeFromString($data);
325 $this->assertSame("oneof_message", $n->getMyOneof());
326 $this->assertFalse(is_null($n->getOneofMessage()));
Paul Yangecca6ea2017-06-30 12:14:09 -0700327
Paul Yange0e54662016-09-15 11:09:01 -0700328 }
329
Joshua Habermanad5a2152020-07-17 13:49:23 -0700330 public function testEncodeDecodeOptional()
331 {
332 $m = new TestMessage();
333 $this->assertFalse($m->hasTrueOptionalInt32());
334 $data = $m->serializeToString();
335 $this->assertSame("", $data);
336
337 $m->setTrueOptionalInt32(0);
338 $this->assertTrue($m->hasTrueOptionalInt32());
339 $data = $m->serializeToString();
340 $this->assertNotSame("", $data);
341
342 $m2 = new TestMessage();
343 $m2->mergeFromString($data);
344 $this->assertTrue($m2->hasTrueOptionalInt32());
345 $this->assertSame(0, $m2->getTrueOptionalInt32());
346 }
347
Paul Yang09295962020-07-30 12:00:13 -0700348 public function testJsonEncodeDecodeOptional()
349 {
350 $m = new TestMessage();
351 $this->assertFalse($m->hasTrueOptionalInt32());
352 $data = $m->serializeToJsonString();
353 $this->assertSame("{}", $data);
354
355 $m->setTrueOptionalInt32(0);
356 $this->assertTrue($m->hasTrueOptionalInt32());
357 $data = $m->serializeToJsonString();
358 $this->assertNotSame("{}", $data);
359
360 $m2 = new TestMessage();
361 $m2->mergeFromJsonString($data);
362 $this->assertTrue($m2->hasTrueOptionalInt32());
363 $this->assertSame(0, $m2->getTrueOptionalInt32());
364 }
365
Paul Yangc4f2a922019-01-17 10:18:43 -0800366 public function testJsonEncodeDecodeOneof()
367 {
368 $m = new TestMessage();
369
370 $m->setOneofEnum(TestEnum::ONE);
371 $data = $m->serializeToJsonString();
372 $n = new TestMessage();
373 $n->mergeFromJsonString($data);
374 $this->assertSame("oneof_enum", $n->getMyOneof());
375 $this->assertSame(TestEnum::ONE, $n->getOneofEnum());
376
377 $m->setOneofString("a");
378 $data = $m->serializeToJsonString();
379 $n = new TestMessage();
380 $n->mergeFromJsonString($data);
381 $this->assertSame("oneof_string", $n->getMyOneof());
382 $this->assertSame("a", $n->getOneofString());
383
384 $m->setOneofBytes("bbbb");
385 $data = $m->serializeToJsonString();
386 $n = new TestMessage();
387 $n->mergeFromJsonString($data);
388 $this->assertSame("oneof_bytes", $n->getMyOneof());
389 $this->assertSame("bbbb", $n->getOneofBytes());
390
391 $sub_m = new Sub();
392 $m->setOneofMessage($sub_m);
393 $data = $m->serializeToJsonString();
394 $n = new TestMessage();
395 $n->mergeFromJsonString($data);
396 $this->assertSame("oneof_message", $n->getMyOneof());
397 $this->assertFalse(is_null($n->getOneofMessage()));
398 }
399
Paul Yangb9c4daa2017-07-09 07:49:25 -0700400 public function testPackedEncode()
401 {
402 $from = new TestPackedMessage();
403 TestUtil::setTestPackedMessage($from);
404 $this->assertSame(TestUtil::getGoldenTestPackedMessage(),
405 $from->serializeToString());
406 }
407
408 public function testPackedDecodePacked()
409 {
410 $to = new TestPackedMessage();
411 $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
412 TestUtil::assertTestPackedMessage($to);
Paul Yangd7c44092018-12-18 10:57:03 -0800413 $this->assertTrue(true);
Paul Yangb9c4daa2017-07-09 07:49:25 -0700414 }
415
416 public function testPackedDecodeUnpacked()
417 {
418 $to = new TestPackedMessage();
419 $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
420 TestUtil::assertTestPackedMessage($to);
Paul Yangd7c44092018-12-18 10:57:03 -0800421 $this->assertTrue(true);
Paul Yangb9c4daa2017-07-09 07:49:25 -0700422 }
423
424 public function testUnpackedEncode()
425 {
426 $from = new TestUnpackedMessage();
427 TestUtil::setTestPackedMessage($from);
428 $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(),
429 $from->serializeToString());
430 }
431
432 public function testUnpackedDecodePacked()
433 {
434 $to = new TestUnpackedMessage();
435 $to->mergeFromString(TestUtil::getGoldenTestPackedMessage());
436 TestUtil::assertTestPackedMessage($to);
Paul Yangd7c44092018-12-18 10:57:03 -0800437 $this->assertTrue(true);
Paul Yangb9c4daa2017-07-09 07:49:25 -0700438 }
439
440 public function testUnpackedDecodeUnpacked()
441 {
442 $to = new TestUnpackedMessage();
443 $to->mergeFromString(TestUtil::getGoldenTestUnpackedMessage());
444 TestUtil::assertTestPackedMessage($to);
Paul Yangd7c44092018-12-18 10:57:03 -0800445 $this->assertTrue(true);
Paul Yangb9c4daa2017-07-09 07:49:25 -0700446 }
447
448 public function testDecodeInt64()
449 {
450 // Read 64 testing
451 $testVals = array(
452 '10' => '100a',
453 '100' => '1064',
454 '800' => '10a006',
455 '6400' => '108032',
456 '70400' => '1080a604',
457 '774400' => '1080a22f',
458 '9292800' => '108098b704',
459 '74342400' => '1080c0b923',
460 '743424000' => '108080bfe202',
461 '8177664000' => '108080b5bb1e',
462 '65421312000' => '108080a8dbf301',
463 '785055744000' => '108080e0c7ec16',
464 '9420668928000' => '10808080dd969202',
465 '103627358208000' => '10808080fff9c717',
466 '1139900940288000' => '10808080f5bd978302',
467 '13678811283456000' => '10808080fce699a618',
468 '109430490267648000' => '10808080e0b7ceb1c201',
469 '984874412408832000' => '10808080e0f5c1bed50d',
470 );
471
472 $msg = new TestMessage();
473 foreach ($testVals as $original => $encoded) {
474 $msg->setOptionalInt64($original);
475 $data = $msg->serializeToString();
476 $this->assertSame($encoded, bin2hex($data));
477 $msg->setOptionalInt64(0);
478 $msg->mergeFromString($data);
479 $this->assertEquals($original, $msg->getOptionalInt64());
480 }
481 }
482
483 public function testDecodeToExistingMessage()
484 {
485 $m1 = new TestMessage();
486 $this->setFields($m1);
487 $this->expectFields($m1);
488
489 $m2 = new TestMessage();
490 $this->setFields2($m2);
491 $data = $m2->serializeToString();
492
493 $m1->mergeFromString($data);
494 $this->expectFieldsMerged($m1);
495 }
496
497 public function testDecodeFieldNonExist()
498 {
499 $data = hex2bin('c80501');
500 $m = new TestMessage();
501 $m->mergeFromString($data);
Paul Yangd7c44092018-12-18 10:57:03 -0800502 $this->assertTrue(true);
Paul Yangb9c4daa2017-07-09 07:49:25 -0700503 }
504
505 public function testEncodeNegativeInt32()
506 {
507 $m = new TestMessage();
508 $m->setOptionalInt32(-1);
509 $data = $m->serializeToString();
510 $this->assertSame("08ffffffffffffffffff01", bin2hex($data));
511 }
512
513 public function testDecodeNegativeInt32()
514 {
515 $m = new TestMessage();
516 $this->assertEquals(0, $m->getOptionalInt32());
517 $m->mergeFromString(hex2bin("08ffffffffffffffffff01"));
518 $this->assertEquals(-1, $m->getOptionalInt32());
519
520 $m = new TestMessage();
521 $this->assertEquals(0, $m->getOptionalInt32());
522 $m->mergeFromString(hex2bin("08ffffffff0f"));
523 $this->assertEquals(-1, $m->getOptionalInt32());
524 }
525
Paul Yangc78dbd72017-07-14 15:48:48 -0600526 public function testRandomFieldOrder()
527 {
528 $m = new TestRandomFieldOrder();
529 $data = $m->serializeToString();
530 $this->assertSame("", $data);
531 }
532
Joshua Habermand5079ed2021-01-27 10:12:59 -0800533 public function testLargeFieldNumber()
534 {
535 $m = new TestLargeFieldNumber(['large_field_number' => 5]);
536 $data = $m->serializeToString();
537 $m2 = new TestLargeFieldNumber();
538 $m2->mergeFromString($data);
539 $this->assertSame(5, $m2->getLargeFieldNumber());
540 }
541
Paul Yangb9c4daa2017-07-09 07:49:25 -0700542 public function testDecodeInvalidInt32()
543 {
Paul Yang823f3512020-12-04 13:46:34 -0800544 $this->expectException(Exception::class);
545
Paul Yangb9c4daa2017-07-09 07:49:25 -0700546 $m = new TestMessage();
547 $m->mergeFromString(hex2bin('08'));
548 }
549
Paul Yangb9c4daa2017-07-09 07:49:25 -0700550 public function testDecodeInvalidSubMessage()
551 {
Paul Yang823f3512020-12-04 13:46:34 -0800552 $this->expectException(Exception::class);
553
Paul Yangb9c4daa2017-07-09 07:49:25 -0700554 $m = new TestMessage();
555 $m->mergeFromString(hex2bin('9A010108'));
556 }
557
Paul Yangb9c4daa2017-07-09 07:49:25 -0700558 public function testDecodeInvalidInt64()
559 {
Paul Yang823f3512020-12-04 13:46:34 -0800560 $this->expectException(Exception::class);
561
Paul Yangb9c4daa2017-07-09 07:49:25 -0700562 $m = new TestMessage();
563 $m->mergeFromString(hex2bin('10'));
564 }
565
Paul Yangb9c4daa2017-07-09 07:49:25 -0700566 public function testDecodeInvalidUInt32()
567 {
Paul Yang823f3512020-12-04 13:46:34 -0800568 $this->expectException(Exception::class);
569
Paul Yangb9c4daa2017-07-09 07:49:25 -0700570 $m = new TestMessage();
571 $m->mergeFromString(hex2bin('18'));
572 }
573
Paul Yangb9c4daa2017-07-09 07:49:25 -0700574 public function testDecodeInvalidUInt64()
575 {
Paul Yang823f3512020-12-04 13:46:34 -0800576 $this->expectException(Exception::class);
577
Paul Yangb9c4daa2017-07-09 07:49:25 -0700578 $m = new TestMessage();
579 $m->mergeFromString(hex2bin('20'));
580 }
581
Paul Yangb9c4daa2017-07-09 07:49:25 -0700582 public function testDecodeInvalidSInt32()
583 {
Paul Yang823f3512020-12-04 13:46:34 -0800584 $this->expectException(Exception::class);
585
Paul Yangb9c4daa2017-07-09 07:49:25 -0700586 $m = new TestMessage();
587 $m->mergeFromString(hex2bin('28'));
588 }
589
Paul Yangb9c4daa2017-07-09 07:49:25 -0700590 public function testDecodeInvalidSInt64()
591 {
Paul Yang823f3512020-12-04 13:46:34 -0800592 $this->expectException(Exception::class);
593
Paul Yangb9c4daa2017-07-09 07:49:25 -0700594 $m = new TestMessage();
595 $m->mergeFromString(hex2bin('30'));
596 }
597
Paul Yangb9c4daa2017-07-09 07:49:25 -0700598 public function testDecodeInvalidFixed32()
599 {
Paul Yang823f3512020-12-04 13:46:34 -0800600 $this->expectException(Exception::class);
601
Paul Yangb9c4daa2017-07-09 07:49:25 -0700602 $m = new TestMessage();
603 $m->mergeFromString(hex2bin('3D'));
604 }
605
Paul Yangb9c4daa2017-07-09 07:49:25 -0700606 public function testDecodeInvalidFixed64()
607 {
Paul Yang823f3512020-12-04 13:46:34 -0800608 $this->expectException(Exception::class);
609
Paul Yangb9c4daa2017-07-09 07:49:25 -0700610 $m = new TestMessage();
611 $m->mergeFromString(hex2bin('41'));
612 }
613
Paul Yangb9c4daa2017-07-09 07:49:25 -0700614 public function testDecodeInvalidSFixed32()
615 {
Paul Yang823f3512020-12-04 13:46:34 -0800616 $this->expectException(Exception::class);
617
Paul Yangb9c4daa2017-07-09 07:49:25 -0700618 $m = new TestMessage();
619 $m->mergeFromString(hex2bin('4D'));
620 }
621
Paul Yangb9c4daa2017-07-09 07:49:25 -0700622 public function testDecodeInvalidSFixed64()
623 {
Paul Yang823f3512020-12-04 13:46:34 -0800624 $this->expectException(Exception::class);
625
Paul Yangb9c4daa2017-07-09 07:49:25 -0700626 $m = new TestMessage();
627 $m->mergeFromString(hex2bin('51'));
628 }
629
Paul Yangb9c4daa2017-07-09 07:49:25 -0700630 public function testDecodeInvalidFloat()
631 {
Paul Yang823f3512020-12-04 13:46:34 -0800632 $this->expectException(Exception::class);
633
Paul Yangb9c4daa2017-07-09 07:49:25 -0700634 $m = new TestMessage();
635 $m->mergeFromString(hex2bin('5D'));
636 }
637
Paul Yangb9c4daa2017-07-09 07:49:25 -0700638 public function testDecodeInvalidDouble()
639 {
Paul Yang823f3512020-12-04 13:46:34 -0800640 $this->expectException(Exception::class);
641
Paul Yangb9c4daa2017-07-09 07:49:25 -0700642 $m = new TestMessage();
643 $m->mergeFromString(hex2bin('61'));
644 }
645
Paul Yangb9c4daa2017-07-09 07:49:25 -0700646 public function testDecodeInvalidBool()
647 {
Paul Yang823f3512020-12-04 13:46:34 -0800648 $this->expectException(Exception::class);
649
Paul Yangb9c4daa2017-07-09 07:49:25 -0700650 $m = new TestMessage();
651 $m->mergeFromString(hex2bin('68'));
652 }
653
Paul Yangb9c4daa2017-07-09 07:49:25 -0700654 public function testDecodeInvalidStringLengthMiss()
655 {
Paul Yang823f3512020-12-04 13:46:34 -0800656 $this->expectException(Exception::class);
657
Paul Yangb9c4daa2017-07-09 07:49:25 -0700658 $m = new TestMessage();
659 $m->mergeFromString(hex2bin('72'));
660 }
661
Paul Yangb9c4daa2017-07-09 07:49:25 -0700662 public function testDecodeInvalidStringDataMiss()
663 {
Paul Yang823f3512020-12-04 13:46:34 -0800664 $this->expectException(Exception::class);
665
Paul Yangb9c4daa2017-07-09 07:49:25 -0700666 $m = new TestMessage();
667 $m->mergeFromString(hex2bin('7201'));
668 }
669
Paul Yangb9c4daa2017-07-09 07:49:25 -0700670 public function testDecodeInvalidBytesLengthMiss()
671 {
Paul Yang823f3512020-12-04 13:46:34 -0800672 $this->expectException(Exception::class);
673
Paul Yangb9c4daa2017-07-09 07:49:25 -0700674 $m = new TestMessage();
675 $m->mergeFromString(hex2bin('7A'));
676 }
677
Paul Yangb9c4daa2017-07-09 07:49:25 -0700678 public function testDecodeInvalidBytesDataMiss()
679 {
Paul Yang823f3512020-12-04 13:46:34 -0800680 $this->expectException(Exception::class);
681
Paul Yangb9c4daa2017-07-09 07:49:25 -0700682 $m = new TestMessage();
683 $m->mergeFromString(hex2bin('7A01'));
684 }
685
Paul Yangb9c4daa2017-07-09 07:49:25 -0700686 public function testDecodeInvalidEnum()
687 {
Paul Yang823f3512020-12-04 13:46:34 -0800688 $this->expectException(Exception::class);
689
Paul Yangb9c4daa2017-07-09 07:49:25 -0700690 $m = new TestMessage();
691 $m->mergeFromString(hex2bin('8001'));
692 }
693
Paul Yangb9c4daa2017-07-09 07:49:25 -0700694 public function testDecodeInvalidMessageLengthMiss()
695 {
Paul Yang823f3512020-12-04 13:46:34 -0800696 $this->expectException(Exception::class);
697
Paul Yangb9c4daa2017-07-09 07:49:25 -0700698 $m = new TestMessage();
699 $m->mergeFromString(hex2bin('8A01'));
700 }
701
Paul Yangb9c4daa2017-07-09 07:49:25 -0700702 public function testDecodeInvalidMessageDataMiss()
703 {
Paul Yang823f3512020-12-04 13:46:34 -0800704 $this->expectException(Exception::class);
705
Paul Yangb9c4daa2017-07-09 07:49:25 -0700706 $m = new TestMessage();
707 $m->mergeFromString(hex2bin('8A0101'));
708 }
709
Paul Yangb9c4daa2017-07-09 07:49:25 -0700710 public function testDecodeInvalidPackedMessageLength()
711 {
Paul Yang823f3512020-12-04 13:46:34 -0800712 $this->expectException(Exception::class);
713
Paul Yangb9c4daa2017-07-09 07:49:25 -0700714 $m = new TestPackedMessage();
715 $m->mergeFromString(hex2bin('D205'));
716 }
717
Paul Yang60327462017-10-09 12:39:13 -0700718 public function testUnknown()
719 {
Paul Yangc370f882017-12-07 11:16:47 -0800720 // Test preserve unknown for varint.
Paul Yang60327462017-10-09 12:39:13 -0700721 $m = new TestMessage();
Paul Yangc370f882017-12-07 11:16:47 -0800722 $from = hex2bin('F80601'); // TODO(teboring): Add a util to encode
723 // varint for better readability
Paul Yang60327462017-10-09 12:39:13 -0700724 $m->mergeFromString($from);
725 $to = $m->serializeToString();
726 $this->assertSame(bin2hex($from), bin2hex($to));
727
Paul Yangc370f882017-12-07 11:16:47 -0800728 // Test preserve unknown for 64-bit.
Paul Yang60327462017-10-09 12:39:13 -0700729 $m = new TestMessage();
730 $from = hex2bin('F9060000000000000000');
731 $m->mergeFromString($from);
732 $to = $m->serializeToString();
733 $this->assertSame(bin2hex($from), bin2hex($to));
734
Paul Yangc370f882017-12-07 11:16:47 -0800735 // Test preserve unknown for length delimited.
Paul Yang60327462017-10-09 12:39:13 -0700736 $m = new TestMessage();
737 $from = hex2bin('FA0600');
738 $m->mergeFromString($from);
739 $to = $m->serializeToString();
740 $this->assertSame(bin2hex($from), bin2hex($to));
741
Paul Yangc370f882017-12-07 11:16:47 -0800742 // Test preserve unknown for 32-bit.
Paul Yang60327462017-10-09 12:39:13 -0700743 $m = new TestMessage();
744 $from = hex2bin('FD0600000000');
745 $m->mergeFromString($from);
746 $to = $m->serializeToString();
747 $this->assertSame(bin2hex($from), bin2hex($to));
Paul Yang74e7dec2017-11-30 12:19:50 -0800748
Paul Yangc370f882017-12-07 11:16:47 -0800749 // Test discard unknown in message.
Paul Yang74e7dec2017-11-30 12:19:50 -0800750 $m = new TestMessage();
751 $from = hex2bin('F80601');
752 $m->mergeFromString($from);
753 $m->discardUnknownFields();
754 $to = $m->serializeToString();
755 $this->assertSame("", bin2hex($to));
Paul Yangc370f882017-12-07 11:16:47 -0800756
757 // Test discard unknown for singular message field.
758 $m = new TestMessage();
759 $from = hex2bin('8A0103F80601');
760 $m->mergeFromString($from);
761 $m->discardUnknownFields();
762 $to = $m->serializeToString();
763 $this->assertSame("8a0100", bin2hex($to));
764
765 // Test discard unknown for repeated message field.
766 $m = new TestMessage();
767 $from = hex2bin('FA0203F80601');
768 $m->mergeFromString($from);
769 $m->discardUnknownFields();
770 $to = $m->serializeToString();
771 $this->assertSame("fa0200", bin2hex($to));
772
773 // Test discard unknown for map message value field.
774 $m = new TestMessage();
775 $from = hex2bin("BA050708011203F80601");
776 $m->mergeFromString($from);
777 $m->discardUnknownFields();
778 $to = $m->serializeToString();
779 $this->assertSame("ba050408011200", bin2hex($to));
780
781 // Test discard unknown for singular message field.
782 $m = new TestMessage();
783 $from = hex2bin('9A0403F80601');
784 $m->mergeFromString($from);
785 $m->discardUnknownFields();
786 $to = $m->serializeToString();
787 $this->assertSame("9a0400", bin2hex($to));
Paul Yang60327462017-10-09 12:39:13 -0700788 }
789
Paul Yangd2d4b402018-10-12 13:46:26 -0700790 public function testJsonUnknown()
791 {
792 // Test unknown number
793 $m = new TestMessage();
794 $m->mergeFromJsonString("{\"unknown\":1,
795 \"optionalInt32\":1}", true);
796 $this->assertSame(1, $m->getOptionalInt32());
797
798 // Test unknown bool
799 $m = new TestMessage();
800 $m->mergeFromJsonString("{\"unknown\":true,
801 \"optionalInt32\":1}", true);
802 $this->assertSame(1, $m->getOptionalInt32());
803
804 // Test unknown string
805 $m = new TestMessage();
806 $m->mergeFromJsonString("{\"unknown\":\"abc\",
807 \"optionalInt32\":1}", true);
808 $this->assertSame(1, $m->getOptionalInt32());
809
810 // Test unknown null
811 $m = new TestMessage();
812 $m->mergeFromJsonString("{\"unknown\":null,
813 \"optionalInt32\":1}", true);
814 $this->assertSame(1, $m->getOptionalInt32());
815
816 // Test unknown array
817 $m = new TestMessage();
818 $m->mergeFromJsonString("{\"unknown\":[],
819 \"optionalInt32\":1}", true);
820 $this->assertSame(1, $m->getOptionalInt32());
821
822 // Test unknown number array
823 $m = new TestMessage();
824 $m->mergeFromJsonString("{\"unknown\":[1],
825 \"optionalInt32\":1}", true);
826 $this->assertSame(1, $m->getOptionalInt32());
827
828 // Test unknown bool array
829 $m = new TestMessage();
830 $m->mergeFromJsonString("{\"unknown\":[true],
831 \"optionalInt32\":1}", true);
832 $this->assertSame(1, $m->getOptionalInt32());
833
834 // Test unknown string array
835 $m = new TestMessage();
836 $m->mergeFromJsonString("{\"unknown\":[\"a\"],
837 \"optionalInt32\":1}", true);
838 $this->assertSame(1, $m->getOptionalInt32());
839
840 // Test unknown null array
841 $m = new TestMessage();
842 $m->mergeFromJsonString("{\"unknown\":[null],
843 \"optionalInt32\":1}", true);
844 $this->assertSame(1, $m->getOptionalInt32());
845
846 // Test unknown array array
847 $m = new TestMessage();
848 $m->mergeFromJsonString("{\"unknown\":[[]],
849 \"optionalInt32\":1}", true);
850 $this->assertSame(1, $m->getOptionalInt32());
851
852 // Test unknown object array
853 $m = new TestMessage();
854 $m->mergeFromJsonString("{\"unknown\":[{}],
855 \"optionalInt32\":1}", true);
856 $this->assertSame(1, $m->getOptionalInt32());
857
858 // Test unknown double value array
859 $m = new TestMessage();
860 $m->mergeFromJsonString("{\"unknown\":[1, 2],
861 \"optionalInt32\":1}", true);
862 $this->assertSame(1, $m->getOptionalInt32());
863
864 // Test unknown object
865 $m = new TestMessage();
866 $m->mergeFromJsonString("{\"unknown\":{},
867 \"optionalInt32\":1}", true);
868 $this->assertSame(1, $m->getOptionalInt32());
869
870 // Test unknown number object
871 $m = new TestMessage();
872 $m->mergeFromJsonString("{\"unknown\":{\"a\":1},
873 \"optionalInt32\":1}", true);
874 $this->assertSame(1, $m->getOptionalInt32());
875
876 // Test unknown bool object
877 $m = new TestMessage();
878 $m->mergeFromJsonString("{\"unknown\":{\"a\":true},
879 \"optionalInt32\":1}", true);
880 $this->assertSame(1, $m->getOptionalInt32());
881
882 // Test unknown string object
883 $m = new TestMessage();
884 $m->mergeFromJsonString("{\"unknown\":{\"a\":\"a\"},
885 \"optionalInt32\":1}", true);
886 $this->assertSame(1, $m->getOptionalInt32());
887
888 // Test unknown null object
889 $m = new TestMessage();
890 $m->mergeFromJsonString("{\"unknown\":{\"a\":null},
891 \"optionalInt32\":1}", true);
892 $this->assertSame(1, $m->getOptionalInt32());
893
894 // Test unknown array object
895 $m = new TestMessage();
896 $m->mergeFromJsonString("{\"unknown\":{\"a\":[]},
897 \"optionalInt32\":1}", true);
898 $this->assertSame(1, $m->getOptionalInt32());
899
900 // Test unknown object object
901 $m = new TestMessage();
902 $m->mergeFromJsonString("{\"unknown\":{\"a\":{}},
903 \"optionalInt32\":1}", true);
904 $this->assertSame(1, $m->getOptionalInt32());
905
906 // Test unknown double value object
907 $m = new TestMessage();
908 $m->mergeFromJsonString("{\"unknown\":{\"a\":1, \"b\":1},
909 \"optionalInt32\":1}", true);
910 $this->assertSame(1, $m->getOptionalInt32());
Paul Yang317bc832020-05-04 14:34:05 -0700911
912 // Test unknown enum value
913 $m = new TestMessage();
914 $m->mergeFromJsonString("{\"optionalEnum\":\"UNKNOWN\"}", true);
915 $this->assertSame(0, $m->getOptionalEnum());
Paul Yangd2d4b402018-10-12 13:46:26 -0700916 }
917
Paul Yangb9c4daa2017-07-09 07:49:25 -0700918 public function testJsonEncode()
919 {
920 $from = new TestMessage();
921 $this->setFields($from);
922 $data = $from->serializeToJsonString();
923 $to = new TestMessage();
924 $to->mergeFromJsonString($data);
925 $this->expectFields($to);
926 }
Paul Yang9bda1f12018-09-22 18:57:43 -0700927
928 public function testDecodeDuration()
929 {
930 $m = new Google\Protobuf\Duration();
931 $m->mergeFromJsonString("\"1234.5678s\"");
932 $this->assertEquals(1234, $m->getSeconds());
933 $this->assertEquals(567800000, $m->getNanos());
934 }
935
936 public function testEncodeDuration()
937 {
938 $m = new Google\Protobuf\Duration();
939 $m->setSeconds(1234);
940 $m->setNanos(999999999);
941 $this->assertEquals("\"1234.999999999s\"", $m->serializeToJsonString());
942 }
943
944 public function testDecodeTimestamp()
945 {
946 $m = new Google\Protobuf\Timestamp();
947 $m->mergeFromJsonString("\"2000-01-01T00:00:00.123456789Z\"");
948 $this->assertEquals(946684800, $m->getSeconds());
949 $this->assertEquals(123456789, $m->getNanos());
950 }
951
952 public function testEncodeTimestamp()
953 {
954 $m = new Google\Protobuf\Timestamp();
955 $m->setSeconds(946684800);
956 $m->setNanos(123456789);
957 $this->assertEquals("\"2000-01-01T00:00:00.123456789Z\"",
958 $m->serializeToJsonString());
959 }
960
961 public function testDecodeTopLevelValue()
962 {
963 $m = new Value();
964 $m->mergeFromJsonString("\"a\"");
965 $this->assertSame("a", $m->getStringValue());
966
967 $m = new Value();
968 $m->mergeFromJsonString("1.5");
969 $this->assertSame(1.5, $m->getNumberValue());
970
971 $m = new Value();
972 $m->mergeFromJsonString("true");
973 $this->assertSame(true, $m->getBoolValue());
974
975 $m = new Value();
976 $m->mergeFromJsonString("null");
977 $this->assertSame("null_value", $m->getKind());
978
979 $m = new Value();
980 $m->mergeFromJsonString("[1]");
981 $this->assertSame("list_value", $m->getKind());
982
983 $m = new Value();
984 $m->mergeFromJsonString("{\"a\":1}");
985 $this->assertSame("struct_value", $m->getKind());
986 }
987
988 public function testEncodeTopLevelValue()
989 {
990 $m = new Value();
991 $m->setStringValue("a");
992 $this->assertSame("\"a\"", $m->serializeToJsonString());
993
994 $m = new Value();
995 $m->setNumberValue(1.5);
996 $this->assertSame("1.5", $m->serializeToJsonString());
997
998 $m = new Value();
999 $m->setBoolValue(true);
1000 $this->assertSame("true", $m->serializeToJsonString());
1001
1002 $m = new Value();
1003 $m->setNullValue(0);
1004 $this->assertSame("null", $m->serializeToJsonString());
1005 }
1006
1007 public function testDecodeTopLevelListValue()
1008 {
1009 $m = new ListValue();
1010 $m->mergeFromJsonString("[1]");
1011 $this->assertSame(1.0, $m->getValues()[0]->getNumberValue());
1012 }
1013
1014 public function testEncodeTopLevelListValue()
1015 {
1016 $m = new ListValue();
1017 $arr = $m->getValues();
1018 $sub = new Value();
1019 $sub->setNumberValue(1.5);
1020 $arr[] = $sub;
1021 $this->assertSame("[1.5]", $m->serializeToJsonString());
1022 }
1023
Paul Yang11c979b2019-01-08 14:11:33 -08001024 public function testEncodeEmptyListValue()
1025 {
1026 $m = new Struct();
1027 $m->setFields(['test' => (new Value())->setListValue(new ListValue())]);
1028 $this->assertSame('{"test":[]}', $m->serializeToJsonString());
1029 }
1030
Paul Yang9bda1f12018-09-22 18:57:43 -07001031 public function testDecodeTopLevelStruct()
1032 {
1033 $m = new Struct();
1034 $m->mergeFromJsonString("{\"a\":{\"b\":1}}");
1035 $this->assertSame(1.0, $m->getFields()["a"]
1036 ->getStructValue()
1037 ->getFields()["b"]->getNumberValue());
1038 }
1039
1040 public function testEncodeTopLevelStruct()
1041 {
1042 $m = new Struct();
1043 $map = $m->getFields();
1044 $sub = new Value();
1045 $sub->setNumberValue(1.5);
1046 $map["a"] = $sub;
1047 $this->assertSame("{\"a\":1.5}", $m->serializeToJsonString());
1048 }
1049
Paul Yang11c979b2019-01-08 14:11:33 -08001050 public function testEncodeEmptyStruct()
1051 {
1052 $m = new Struct();
1053 $m->setFields(['test' => (new Value())->setStructValue(new Struct())]);
1054 $this->assertSame('{"test":{}}', $m->serializeToJsonString());
1055 }
1056
Paul Yang8faa7782018-12-26 10:36:09 -08001057 public function testDecodeTopLevelAny()
1058 {
1059 // Make sure packed message has been created at least once.
1060 $packed = new TestMessage();
1061
1062 $m1 = new Any();
1063 $m1->mergeFromJsonString(
1064 "{\"optionalInt32\": 1, " .
1065 "\"@type\":\"type.googleapis.com/foo.TestMessage\"}");
1066 $this->assertSame("type.googleapis.com/foo.TestMessage",
1067 $m1->getTypeUrl());
1068 $this->assertSame("0801", bin2hex($m1->getValue()));
1069
1070 $m2 = new Any();
1071 $m2->mergeFromJsonString(
1072 "{\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
1073 "\"optionalInt32\": 1}");
1074 $this->assertSame("type.googleapis.com/foo.TestMessage",
1075 $m2->getTypeUrl());
1076 $this->assertSame("0801", bin2hex($m2->getValue()));
1077
1078 $m3 = new Any();
1079 $m3->mergeFromJsonString(
1080 "{\"optionalInt32\": 1, " .
1081 "\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
1082 "\"optionalInt64\": 2}");
1083 $this->assertSame("type.googleapis.com/foo.TestMessage",
1084 $m3->getTypeUrl());
1085 $this->assertSame("08011002", bin2hex($m3->getValue()));
1086 }
1087
1088 public function testDecodeAny()
1089 {
1090 // Make sure packed message has been created at least once.
1091 $packed = new TestMessage();
1092
1093 $m1 = new TestAny();
1094 $m1->mergeFromJsonString(
1095 "{\"any\": {\"optionalInt32\": 1, " .
1096 "\"@type\":\"type.googleapis.com/foo.TestMessage\"}}");
1097 $this->assertSame("type.googleapis.com/foo.TestMessage",
1098 $m1->getAny()->getTypeUrl());
1099 $this->assertSame("0801", bin2hex($m1->getAny()->getValue()));
1100
1101 $m2 = new TestAny();
1102 $m2->mergeFromJsonString(
1103 "{\"any\":{\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
1104 "\"optionalInt32\": 1}}");
1105 $this->assertSame("type.googleapis.com/foo.TestMessage",
1106 $m2->getAny()->getTypeUrl());
1107 $this->assertSame("0801", bin2hex($m2->getAny()->getValue()));
1108
1109 $m3 = new TestAny();
1110 $m3->mergeFromJsonString(
1111 "{\"any\":{\"optionalInt32\": 1, " .
1112 "\"@type\":\"type.googleapis.com/foo.TestMessage\", " .
1113 "\"optionalInt64\": 2}}");
1114 $this->assertSame("type.googleapis.com/foo.TestMessage",
1115 $m3->getAny()->getTypeUrl());
1116 $this->assertSame("08011002", bin2hex($m3->getAny()->getValue()));
1117 }
1118
1119 public function testDecodeAnyWithWellKnownPacked()
1120 {
1121 // Make sure packed message has been created at least once.
1122 $packed = new Int32Value();
1123
1124 $m1 = new TestAny();
1125 $m1->mergeFromJsonString(
1126 "{\"any\":" .
1127 " {\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
1128 " \"value\":1}}");
1129 $this->assertSame("type.googleapis.com/google.protobuf.Int32Value",
1130 $m1->getAny()->getTypeUrl());
1131 $this->assertSame("0801", bin2hex($m1->getAny()->getValue()));
1132 }
1133
Paul Yang8faa7782018-12-26 10:36:09 -08001134 public function testDecodeAnyWithUnknownPacked()
1135 {
Paul Yang823f3512020-12-04 13:46:34 -08001136 $this->expectException(Exception::class);
1137
Paul Yang8faa7782018-12-26 10:36:09 -08001138 $m = new TestAny();
1139 $m->mergeFromJsonString(
1140 "{\"any\":" .
1141 " {\"@type\":\"type.googleapis.com/unknown\"," .
1142 " \"value\":1}}");
1143 }
1144
1145 public function testEncodeTopLevelAny()
1146 {
1147 // Test a normal message.
1148 $packed = new TestMessage();
1149 $packed->setOptionalInt32(123);
1150 $packed->setOptionalString("abc");
1151
1152 $m = new Any();
1153 $m->pack($packed);
1154 $expected1 =
1155 "{\"@type\":\"type.googleapis.com/foo.TestMessage\"," .
1156 "\"optional_int32\":123,\"optional_string\":\"abc\"}";
1157 $expected2 =
1158 "{\"@type\":\"type.googleapis.com/foo.TestMessage\"," .
1159 "\"optionalInt32\":123,\"optionalString\":\"abc\"}";
1160 $result = $m->serializeToJsonString();
1161 $this->assertTrue($expected1 === $result || $expected2 === $result);
1162
1163 // Test a well known message.
1164 $packed = new Int32Value();
1165 $packed->setValue(123);
1166
1167 $m = new Any();
1168 $m->pack($packed);
1169 $this->assertSame(
1170 "{\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
1171 "\"value\":123}",
1172 $m->serializeToJsonString());
1173
1174 // Test an Any message.
1175 $outer = new Any();
1176 $outer->pack($m);
1177 $this->assertSame(
1178 "{\"@type\":\"type.googleapis.com/google.protobuf.Any\"," .
1179 "\"value\":{\"@type\":\"type.googleapis.com/google.protobuf.Int32Value\"," .
1180 "\"value\":123}}",
1181 $outer->serializeToJsonString());
1182
1183 // Test a Timestamp message.
1184 $packed = new Google\Protobuf\Timestamp();
1185 $packed->setSeconds(946684800);
1186 $packed->setNanos(123456789);
1187 $m = new Any();
1188 $m->pack($packed);
1189 $this->assertSame(
1190 "{\"@type\":\"type.googleapis.com/google.protobuf.Timestamp\"," .
1191 "\"value\":\"2000-01-01T00:00:00.123456789Z\"}",
1192 $m->serializeToJsonString());
1193 }
1194
Paul Yang2929bb32019-12-03 11:11:28 -08001195 public function testEncodeAnyWithDefaultWrapperMessagePacked()
1196 {
1197 $any = new Any();
1198 $any->pack(new TestInt32Value([
1199 'field' => new Int32Value(['value' => 0]),
1200 ]));
1201 $this->assertSame(
1202 "{\"@type\":\"type.googleapis.com/foo.TestInt32Value\"," .
1203 "\"field\":0}",
1204 $any->serializeToJsonString());
1205 }
1206
Paul Yangc4f2a922019-01-17 10:18:43 -08001207 public function testDecodeTopLevelFieldMask()
1208 {
1209 $m = new TestMessage();
1210 $m->setMapStringString(['a'=>'abcdefg']);
1211 $data1 = $m->serializeToJsonString();
1212 $n = new TestMessage();
1213 $n->mergeFromJsonString($data1);
1214 $data2 = $n->serializeToJsonString();
1215 $this->assertSame($data1, $data2);
1216
1217 $m = new FieldMask();
1218 $m->mergeFromJsonString("\"foo.barBaz,qux\"");
1219 $this->assertSame("foo.bar_baz", $m->getPaths()[0]);
1220 $this->assertSame("qux", $m->getPaths()[1]);
1221 }
1222
1223 public function testEncodeTopLevelFieldMask()
1224 {
1225 $m = new FieldMask();
1226 $m->setPaths(["foo.bar_baz", "qux"]);
1227 $this->assertSame("\"foo.barBaz,qux\"", $m->serializeToJsonString());
1228 }
1229
Paul Yang7f42d6d2019-01-22 15:35:12 -08001230 public function testDecodeEmptyFieldMask()
1231 {
1232 $m = new FieldMask();
1233 $m->mergeFromJsonString("\"\"");
1234 $this->assertEquals("", $m->serializeToString());
1235 }
1236
Paul Yang3cae8e42019-01-28 11:25:52 -08001237 public function testJsonDecodeMapWithDefaultValueKey()
1238 {
1239 $m = new TestMessage();
1240 $m->getMapInt32Int32()[0] = 0;
1241 $this->assertSame("{\"mapInt32Int32\":{\"0\":0}}",
1242 $m->serializeToJsonString());
1243
1244 $m = new TestMessage();
1245 $m->getMapStringString()[""] = "";
1246 $this->assertSame("{\"mapStringString\":{\"\":\"\"}}",
1247 $m->serializeToJsonString());
1248 }
1249
Bo Yang96029f32019-01-28 08:51:45 +00001250 public function testJsonDecodeNumericStringMapKey()
1251 {
1252 $m = new TestMessage();
1253 $m->getMapStringString()["1"] = "1";
1254 $data = $m->serializeToJsonString();
1255 $this->assertSame("{\"mapStringString\":{\"1\":\"1\"}}", $data);
1256 $n = new TestMessage();
1257 $n->mergeFromJsonString($data);
1258 }
1259
Paul Yang2dec82e2019-10-10 16:03:52 -07001260 public function testMessageMapNoValue()
1261 {
1262 $m = new TestMessage();
1263 $m->mergeFromString(hex2bin("CA0700"));
1264 $m->serializeToString();
1265 $this->assertTrue(true);
1266 }
1267
1268 public function testAnyMapNoValue()
1269 {
1270 $m = new TestMessage();
1271 $m->mergeFromString(hex2bin("D20700"));
1272 $m->serializeToString();
1273 $this->assertTrue(true);
1274 }
1275
1276 public function testListValueMapNoValue()
1277 {
1278 $m = new TestMessage();
1279 $m->mergeFromString(hex2bin("DA0700"));
1280 $m->serializeToString();
1281 $this->assertTrue(true);
1282 }
1283
1284 public function testStructMapNoValue()
1285 {
1286 $m = new TestMessage();
1287 $m->mergeFromString(hex2bin("E20700"));
1288 $m->serializeToString();
1289 $this->assertTrue(true);
1290 }
1291
Paul Yang601f6962019-11-14 12:17:04 -08001292 /**
1293 * @dataProvider wrappersDataProvider
1294 */
1295 public function testWrapperJsonDecodeAndGet(
1296 $class,
1297 $nonDefaultValue,
1298 $nonDefaultValueData,
1299 $defaultValue,
1300 $defaultValueData
1301 )
1302 {
1303 // Singular with non-default
1304 $m = new $class();
1305 $m->mergeFromJsonString("{\"field\":" . $nonDefaultValueData . "}");
1306 $wrapper = $m->getField();
1307 $this->assertEquals($nonDefaultValue, $wrapper->getValue());
1308
1309 // Singular with default
1310 $m = new $class();
1311 $m->mergeFromJsonString("{\"field\":" . $defaultValueData . "}");
1312 $wrapper = $m->getField();
1313 $this->assertEquals($defaultValue, $wrapper->getValue());
1314
1315 // Repeated with empty
1316 $m = new $class();
1317 $m->mergeFromJsonString("{\"repeated_field\":[]}");
1318 $repeatedWrapper = $m->getRepeatedField();
1319 $this->assertSame(0, count($repeatedWrapper));
1320
1321 // Repeated with non-default
1322 $m = new $class();
1323 $m->mergeFromJsonString("{\"repeated_field\":[" . $defaultValueData . "]}");
1324 $repeatedWrapper = $m->getRepeatedField();
1325 $this->assertSame(1, count($repeatedWrapper));
1326 $this->assertEquals($defaultValue, $repeatedWrapper[0]->getValue());
1327
1328 // Repeated with default
1329 $m = new $class();
1330 $m->mergeFromJsonString("{\"repeated_field\":[" . $defaultValueData . "]}");
1331 $repeatedWrapper = $m->getRepeatedField();
1332 $this->assertSame(1, count($repeatedWrapper));
1333 $this->assertEquals($defaultValue, $repeatedWrapper[0]->getValue());
1334
1335 // Oneof with non-default
1336 $m = new $class();
1337 $m->mergeFromJsonString("{\"oneof_field\":" . $nonDefaultValueData . "}");
1338 $wrapper = $m->getOneofField();
1339 $this->assertEquals($nonDefaultValue, $wrapper->getValue());
1340 $this->assertEquals("oneof_field", $m->getOneofFields());
1341 $this->assertEquals(0, $m->getInt32Field());
1342
1343 // Oneof with default
1344 $m = new $class();
1345 $m->mergeFromJsonString("{\"oneof_field\":" . $defaultValueData . "}");
1346 $wrapper = $m->getOneofField();
1347 $this->assertEquals($defaultValue, $wrapper->getValue());
1348 $this->assertEquals("oneof_field", $m->getOneofFields());
1349 $this->assertEquals(0, $m->getInt32Field());
1350 }
1351
1352 /**
1353 * @dataProvider wrappersDataProvider
1354 */
1355 public function testWrapperJsonDecodeAndGetUnwrapped(
1356 $class,
1357 $nonDefaultValue,
1358 $nonDefaultValueData,
1359 $defaultValue,
1360 $defaultValueData
1361 )
1362 {
1363 // Singular with non-default
1364 $m = new $class();
1365 $m->mergeFromJsonString("{\"field\":" . $nonDefaultValueData . "}");
1366 $this->assertEquals($nonDefaultValue, $m->getFieldUnwrapped());
1367
1368 // Singular with default
1369 $m = new $class();
1370 $m->mergeFromJsonString("{\"field\":" . $defaultValueData . "}");
1371 $this->assertEquals($defaultValue, $m->getFieldUnwrapped());
1372
1373 // Oneof with non-default
1374 $m = new $class();
1375 $m->mergeFromJsonString("{\"oneof_field\":" . $nonDefaultValueData . "}");
1376 $this->assertEquals($nonDefaultValue, $m->getOneofFieldUnwrapped());
1377 $this->assertEquals("oneof_field", $m->getOneofFields());
1378 $this->assertEquals(0, $m->getInt32Field());
1379
1380 // Oneof with default
1381 $m = new $class();
1382 $m->mergeFromJsonString("{\"oneof_field\":" . $defaultValueData . "}");
1383 $this->assertEquals($defaultValue, $m->getOneofFieldUnwrapped());
1384 $this->assertEquals("oneof_field", $m->getOneofFields());
1385 $this->assertEquals(0, $m->getInt32Field());
1386 }
1387
1388 /**
1389 * @dataProvider wrappersDataProvider
1390 */
1391 public function testWrapperJsonDecodeEncode(
1392 $class,
1393 $nonDefaultValue,
1394 $nonDefaultValueData,
1395 $defaultValue,
1396 $defaultValueData
1397 )
1398 {
1399 // Singular with non-default
1400 $from = new $class();
1401 $to = new $class();
1402 $from->mergeFromJsonString("{\"field\":" . $nonDefaultValueData . "}");
1403 $data = $from->serializeToJsonString();
1404 $to->mergeFromJsonString($data);
1405 $this->assertEquals($nonDefaultValue, $to->getFieldUnwrapped());
1406
1407 // Singular with default
1408 $from = new $class();
1409 $to = new $class();
1410 $from->mergeFromJsonString("{\"field\":" . $defaultValueData . "}");
1411 $data = $from->serializeToJsonString();
1412 $to->mergeFromJsonString($data);
1413 $this->assertEquals($defaultValue, $to->getFieldUnwrapped());
1414
1415 // Oneof with non-default
1416 $from = new $class();
1417 $to = new $class();
1418 $from->mergeFromJsonString("{\"oneof_field\":" . $nonDefaultValueData . "}");
1419 $data = $from->serializeToJsonString();
1420 $to->mergeFromJsonString($data);
1421 $this->assertEquals($nonDefaultValue, $to->getOneofFieldUnwrapped());
1422
1423 // Oneof with default
1424 $from = new $class();
1425 $to = new $class();
1426 $from->mergeFromJsonString("{\"oneof_field\":" . $defaultValueData . "}");
1427 $data = $from->serializeToJsonString();
1428 $to->mergeFromJsonString($data);
1429 $this->assertEquals($defaultValue, $to->getOneofFieldUnwrapped());
1430 }
1431
1432 /**
1433 * @dataProvider wrappersDataProvider
1434 */
1435 public function testWrapperSetUnwrappedJsonEncode(
1436 $class,
1437 $nonDefaultValue,
1438 $nonDefaultValueData,
1439 $defaultValue,
1440 $defaultValueData
1441 )
1442 {
1443 // Singular with non-default
1444 $from = new $class();
1445 $to = new $class();
1446 $from->setFieldUnwrapped($nonDefaultValue);
1447 $data = $from->serializeToJsonString();
1448 $to->mergeFromJsonString($data);
1449 $this->assertEquals($nonDefaultValue, $to->getFieldUnwrapped());
1450
1451 // Singular with default
1452 $from = new $class();
1453 $to = new $class();
1454 $from->setFieldUnwrapped($defaultValue);
1455 $data = $from->serializeToJsonString();
1456 $to->mergeFromJsonString($data);
1457 $this->assertEquals($defaultValue, $to->getFieldUnwrapped());
1458
1459 // Oneof with non-default
1460 $from = new $class();
1461 $to = new $class();
1462 $from->setOneofFieldUnwrapped($nonDefaultValue);
1463 $data = $from->serializeToJsonString();
1464 $to->mergeFromJsonString($data);
1465 $this->assertEquals($nonDefaultValue, $to->getOneofFieldUnwrapped());
1466
1467 // Oneof with default
1468 $from = new $class();
1469 $to = new $class();
1470 $from->setOneofFieldUnwrapped($defaultValue);
1471 $data = $from->serializeToJsonString();
1472 $to->mergeFromJsonString($data);
1473 $this->assertEquals($defaultValue, $to->getOneofFieldUnwrapped());
1474 }
1475
1476 public function wrappersDataProvider()
1477 {
1478 return [
1479 [TestInt32Value::class, 1, "1", 0, "0"],
1480 [TestStringValue::class, "a", "\"a\"", "", "\"\""],
1481 ];
1482 }
Paul Yange0e54662016-09-15 11:09:01 -07001483}