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