diff options
Diffstat (limited to 'php/tests')
-rw-r--r-- | php/tests/array_test.php | 888 | ||||
-rw-r--r-- | php/tests/autoload.php | 4 | ||||
-rw-r--r-- | php/tests/encode_decode_test.php | 136 | ||||
-rw-r--r-- | php/tests/generated_class_test.php | 557 | ||||
-rw-r--r-- | php/tests/map_field_test.php | 648 | ||||
-rw-r--r-- | php/tests/memory_leak_test.php | 73 | ||||
-rw-r--r-- | php/tests/php_implementation_test.php | 443 | ||||
-rw-r--r-- | php/tests/test.proto | 136 | ||||
-rwxr-xr-x | php/tests/test.sh | 32 | ||||
-rw-r--r-- | php/tests/test_base.php | 92 | ||||
-rw-r--r-- | php/tests/test_include.proto | 7 | ||||
-rw-r--r-- | php/tests/test_util.php | 393 |
12 files changed, 3405 insertions, 4 deletions
diff --git a/php/tests/array_test.php b/php/tests/array_test.php new file mode 100644 index 00000000..d683add5 --- /dev/null +++ b/php/tests/array_test.php @@ -0,0 +1,888 @@ +<?php + +require_once('test.pb.php'); +require_once('test_util.php'); + +use Google\Protobuf\Internal\RepeatedField; +use Google\Protobuf\Internal\GPBType; +use Foo\TestMessage; +use Foo\TestMessage_Sub; + +class RepeatedFieldTest extends PHPUnit_Framework_TestCase +{ + + ######################################################### + # Test int32 field. + ######################################################### + + public function testInt32() + { + $arr = new RepeatedField(GPBType::INT32); + + // Test append. + $arr []= MAX_INT32; + $this->assertSame(MAX_INT32, $arr[0]); + $arr []= MIN_INT32; + $this->assertSame(MIN_INT32, $arr[1]); + + $arr []= 1.1; + $this->assertSame(1, $arr[2]); + $arr []= MAX_INT32_FLOAT; + $this->assertSame(MAX_INT32, $arr[3]); + $arr []= MAX_INT32_FLOAT; + $this->assertSame(MAX_INT32, $arr[4]); + + $arr []= '2'; + $this->assertSame(2, $arr[5]); + $arr []= '3.1'; + $this->assertSame(3, $arr[6]); + $arr []= MAX_INT32_STRING; + $this->assertSame(MAX_INT32, $arr[7]); + + $this->assertEquals(8, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = 0; + $this->assertSame(0, $arr[$i]); + } + + // Test set. + $arr [0]= MAX_INT32; + $this->assertSame(MAX_INT32, $arr[0]); + $arr [1]= MIN_INT32; + $this->assertSame(MIN_INT32, $arr[1]); + + $arr [2]= 1.1; + $this->assertSame(1, $arr[2]); + $arr [3]= MAX_INT32_FLOAT; + $this->assertSame(MAX_INT32, $arr[3]); + $arr [4]= MAX_INT32_FLOAT; + $this->assertSame(MAX_INT32, $arr[4]); + + $arr [5]= '2'; + $this->assertSame(2, $arr[5]); + $arr [6]= '3.1'; + $this->assertSame(3, $arr[6]); + $arr [7]= MAX_INT32_STRING; + $this->assertSame(MAX_INT32, $arr[7]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32AppendStringFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr []= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetStringFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr []= 0; + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32AppendMessageFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr []= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetMessageFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr []= 0; + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test uint32 field. + ######################################################### + + public function testUint32() + { + $arr = new RepeatedField(GPBType::UINT32); + + // Test append. + $arr []= MAX_UINT32; + $this->assertSame(-1, $arr[0]); + $arr []= -1; + $this->assertSame(-1, $arr[1]); + $arr []= MIN_UINT32; + $this->assertSame(MIN_UINT32, $arr[2]); + + $arr []= 1.1; + $this->assertSame(1, $arr[3]); + $arr []= MAX_UINT32_FLOAT; + $this->assertSame(-1, $arr[4]); + $arr []= -1.0; + $this->assertSame(-1, $arr[5]); + $arr []= MIN_UINT32_FLOAT; + $this->assertSame(MIN_UINT32, $arr[6]); + + $arr []= '2'; + $this->assertSame(2, $arr[7]); + $arr []= '3.1'; + $this->assertSame(3, $arr[8]); + $arr []= MAX_UINT32_STRING; + $this->assertSame(-1, $arr[9]); + $arr []= '-1.0'; + $this->assertSame(-1, $arr[10]); + $arr []= MIN_UINT32_STRING; + $this->assertSame(MIN_UINT32, $arr[11]); + + $this->assertEquals(12, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = 0; + $this->assertSame(0, $arr[$i]); + } + + // Test set. + $arr [0]= MAX_UINT32; + $this->assertSame(-1, $arr[0]); + $arr [1]= -1; + $this->assertSame(-1, $arr[1]); + $arr [2]= MIN_UINT32; + $this->assertSame(MIN_UINT32, $arr[2]); + + $arr [3]= 1.1; + $this->assertSame(1, $arr[3]); + $arr [4]= MAX_UINT32_FLOAT; + $this->assertSame(-1, $arr[4]); + $arr [5]= -1.0; + $this->assertSame(-1, $arr[5]); + $arr [6]= MIN_UINT32_FLOAT; + $this->assertSame(MIN_UINT32, $arr[6]); + + $arr [7]= '2'; + $this->assertSame(2, $arr[7]); + $arr [8]= '3.1'; + $this->assertSame(3, $arr[8]); + $arr [9]= MAX_UINT32_STRING; + $this->assertSame(-1, $arr[9]); + $arr [10]= '-1.0'; + $this->assertSame(-1, $arr[10]); + $arr [11]= MIN_UINT32_STRING; + $this->assertSame(MIN_UINT32, $arr[11]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32AppendStringFail() + { + $arr = new RepeatedField(GPBType::UINT32); + $arr []= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetStringFail() + { + $arr = new RepeatedField(GPBType::UINT32); + $arr []= 0; + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32AppendMessageFail() + { + $arr = new RepeatedField(GPBType::UINT32); + $arr []= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetMessageFail() + { + $arr = new RepeatedField(GPBType::UINT32); + $arr []= 0; + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test int64 field. + ######################################################### + + public function testInt64() + { + $arr = new RepeatedField(GPBType::INT64); + + // Test append. + $arr []= MAX_INT64; + $this->assertSame(MAX_INT64, $arr[0]); + $arr []= MIN_INT64; + $this->assertEquals(MIN_INT64, $arr[1]); + + $arr []= 1.1; + $this->assertSame(1, $arr[2]); + + $arr []= '2'; + $this->assertSame(2, $arr[3]); + $arr []= '3.1'; + $this->assertSame(3, $arr[4]); + $arr []= MAX_INT64_STRING; + $this->assertSame(MAX_INT64, $arr[5]); + $arr []= MIN_INT64_STRING; + $this->assertEquals(MIN_INT64, $arr[6]); + + $this->assertEquals(7, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = 0; + $this->assertSame(0, $arr[$i]); + } + + // Test set. + $arr [0]= MAX_INT64; + $this->assertSame(MAX_INT64, $arr[0]); + $arr [1]= MIN_INT64; + $this->assertEquals(MIN_INT64, $arr[1]); + + $arr [2]= 1.1; + $this->assertSame(1, $arr[2]); + + $arr [3]= '2'; + $this->assertSame(2, $arr[3]); + $arr [4]= '3.1'; + $this->assertSame(3, $arr[4]); + $arr [5]= MAX_INT64_STRING; + $this->assertSame(MAX_INT64, $arr[5]); + $arr [6]= MIN_INT64_STRING; + $this->assertEquals(MIN_INT64, $arr[6]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64AppendStringFail() + { + $arr = new RepeatedField(GPBType::INT64); + $arr []= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetStringFail() + { + $arr = new RepeatedField(GPBType::INT64); + $arr []= 0; + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64AppendMessageFail() + { + $arr = new RepeatedField(GPBType::INT64); + $arr []= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetMessageFail() + { + $arr = new RepeatedField(GPBType::INT64); + $arr []= 0; + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test uint64 field. + ######################################################### + + public function testUint64() + { + $arr = new RepeatedField(GPBType::UINT64); + + // Test append. + $arr []= MAX_UINT64; + $this->assertEquals(MAX_UINT64, $arr[0]); + + $arr []= 1.1; + $this->assertSame(1, $arr[1]); + + $arr []= '2'; + $this->assertSame(2, $arr[2]); + $arr []= '3.1'; + $this->assertSame(3, $arr[3]); + $arr []= MAX_UINT64_STRING; + $this->assertEquals(MAX_UINT64, $arr[4]); + + $this->assertEquals(5, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = 0; + $this->assertSame(0, $arr[$i]); + } + + // Test set. + $arr [0]= MAX_UINT64; + $this->assertEquals(MAX_UINT64, $arr[0]); + + $arr [1]= 1.1; + $this->assertSame(1, $arr[1]); + + $arr [2]= '2'; + $this->assertSame(2, $arr[2]); + $arr [3]= '3.1'; + $this->assertSame(3, $arr[3]); + $arr [4]= MAX_UINT64_STRING; + $this->assertEquals(MAX_UINT64, $arr[4]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64AppendStringFail() + { + $arr = new RepeatedField(GPBType::UINT64); + $arr []= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetStringFail() + { + $arr = new RepeatedField(GPBType::UINT64); + $arr []= 0; + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64AppendMessageFail() + { + $arr = new RepeatedField(GPBType::UINT64); + $arr []= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetMessageFail() + { + $arr = new RepeatedField(GPBType::UINT64); + $arr []= 0; + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test float field. + ######################################################### + + public function testFloat() + { + $arr = new RepeatedField(GPBType::FLOAT); + + // Test append. + $arr []= 1; + $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); + + $arr []= 1.1; + $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); + + $arr []= '2'; + $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); + $arr []= '3.1'; + $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); + + $this->assertEquals(4, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = 0; + $this->assertSame(0.0, $arr[$i]); + } + + // Test set. + $arr [0]= 1; + $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); + + $arr [1]= 1.1; + $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); + + $arr [2]= '2'; + $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); + $arr [3]= '3.1'; + $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatAppendStringFail() + { + $arr = new RepeatedField(GPBType::FLOAT); + $arr []= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatSetStringFail() + { + $arr = new RepeatedField(GPBType::FLOAT); + $arr []= 0.0; + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatAppendMessageFail() + { + $arr = new RepeatedField(GPBType::FLOAT); + $arr []= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatSetMessageFail() + { + $arr = new RepeatedField(GPBType::FLOAT); + $arr []= 0.0; + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test double field. + ######################################################### + + public function testDouble() + { + $arr = new RepeatedField(GPBType::DOUBLE); + + // Test append. + $arr []= 1; + $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); + + $arr []= 1.1; + $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); + + $arr []= '2'; + $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); + $arr []= '3.1'; + $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); + + $this->assertEquals(4, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = 0; + $this->assertSame(0.0, $arr[$i]); + } + + // Test set. + $arr [0]= 1; + $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); + + $arr [1]= 1.1; + $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); + + $arr [2]= '2'; + $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); + $arr [3]= '3.1'; + $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleAppendStringFail() + { + $arr = new RepeatedField(GPBType::DOUBLE); + $arr []= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleSetStringFail() + { + $arr = new RepeatedField(GPBType::DOUBLE); + $arr []= 0.0; + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleAppendMessageFail() + { + $arr = new RepeatedField(GPBType::DOUBLE); + $arr []= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleSetMessageFail() + { + $arr = new RepeatedField(GPBType::DOUBLE); + $arr []= 0.0; + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test bool field. + ######################################################### + + public function testBool() + { + $arr = new RepeatedField(GPBType::BOOL); + + // Test append. + $arr []= true; + $this->assertSame(true, $arr[0]); + + $arr []= -1; + $this->assertSame(true, $arr[1]); + + $arr []= 1.1; + $this->assertSame(true, $arr[2]); + + $arr []= ''; + $this->assertSame(false, $arr[3]); + + $this->assertEquals(4, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = 0; + $this->assertSame(false, $arr[$i]); + } + + // Test set. + $arr [0]= true; + $this->assertSame(true, $arr[0]); + + $arr [1]= -1; + $this->assertSame(true, $arr[1]); + + $arr [2]= 1.1; + $this->assertSame(true, $arr[2]); + + $arr [3]= ''; + $this->assertSame(false, $arr[3]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolAppendMessageFail() + { + $arr = new RepeatedField(GPBType::BOOL); + $arr []= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolSetMessageFail() + { + $arr = new RepeatedField(GPBType::BOOL); + $arr []= true; + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test string field. + ######################################################### + + public function testString() + { + $arr = new RepeatedField(GPBType::STRING); + + // Test append. + $arr []= 'abc'; + $this->assertSame('abc', $arr[0]); + + $arr []= 1; + $this->assertSame('1', $arr[1]); + + $arr []= 1.1; + $this->assertSame('1.1', $arr[2]); + + $arr []= true; + $this->assertSame('1', $arr[3]); + + $this->assertEquals(4, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = ''; + $this->assertSame('', $arr[$i]); + } + + // Test set. + $arr [0]= 'abc'; + $this->assertSame('abc', $arr[0]); + + $arr [1]= 1; + $this->assertSame('1', $arr[1]); + + $arr [2]= 1.1; + $this->assertSame('1.1', $arr[2]); + + $arr [3]= true; + $this->assertSame('1', $arr[3]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringAppendMessageFail() + { + $arr = new RepeatedField(GPBType::STRING); + $arr []= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetMessageFail() + { + $arr = new RepeatedField(GPBType::STRING); + $arr []= 'abc'; + $arr [0]= new TestMessage_Sub(); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringAppendInvalidUTF8Fail() + { + $arr = new RepeatedField(GPBType::STRING); + $hex = hex2bin("ff"); + $arr []= $hex; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetInvalidUTF8Fail() + { + $arr = new RepeatedField(GPBType::STRING); + $arr []= 'abc'; + $hex = hex2bin("ff"); + $arr [0]= $hex; + } + + ######################################################### + # Test message field. + ######################################################### + + public function testMessage() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + + // Test append. + $sub_m = new TestMessage_Sub(); + $sub_m->setA(1); + $arr []= $sub_m; + $this->assertSame(1, $arr[0]->getA()); + + $null = null; + $arr []= $null; + $this->assertNull($arr[1]); + + $this->assertEquals(2, count($arr)); + + for ($i = 0; $i < count($arr); $i++) { + $arr[$i] = $null; + $this->assertNull($arr[$i]); + } + + // Test set. + $arr [0]= $sub_m; + $this->assertSame(1, $arr[0]->getA()); + + $arr [1]= $null; + $this->assertNull($arr[1]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageAppendIntFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr []= 1; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetIntFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr []= new TestMessage_Sub; + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageAppendStringFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr []= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetStringFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr []= new TestMessage_Sub; + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageAppendOtherMessageFail() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage_Sub::class); + $arr []= new TestMessage; + } + + ######################################################### + # Test offset type + ######################################################### + + public function testOffset() + { + $arr = new RepeatedField(GPBType::INT32); + $arr []= 0; + + $arr [0]= 1; + $this->assertSame(1, $arr[0]); + $this->assertSame(1, count($arr)); + + $arr ['0']= 2; + $this->assertSame(2, $arr['0']); + $this->assertSame(2, $arr[0]); + $this->assertSame(1, count($arr)); + + $arr [0.0]= 3; + $this->assertSame(3, $arr[0.0]); + $this->assertSame(1, count($arr)); + } + + public function testInsertRemoval() + { + $arr = new RepeatedField(GPBType::INT32); + + $arr []= 0; + $arr []= 1; + $arr []= 2; + $this->assertSame(3, count($arr)); + + unset($arr[2]); + $this->assertSame(2, count($arr)); + $this->assertSame(0, $arr[0]); + $this->assertSame(1, $arr[1]); + + $arr [] = 3; + $this->assertSame(3, count($arr)); + $this->assertSame(0, $arr[0]); + $this->assertSame(1, $arr[1]); + $this->assertSame(3, $arr[2]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRemoveMiddleFail() + { + $arr = new RepeatedField(GPBType::INT32); + + $arr []= 0; + $arr []= 1; + $arr []= 2; + $this->assertSame(3, count($arr)); + + unset($arr[1]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRemoveEmptyFail() + { + $arr = new RepeatedField(GPBType::INT32); + + unset($arr[0]); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageOffsetFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr []= 0; + $arr [new TestMessage_Sub()]= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringOffsetFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr []= 0; + $arr ['abc']= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testSetNonExistedOffsetFail() + { + $arr = new RepeatedField(GPBType::INT32); + $arr [0]= 0; + } + + ######################################################### + # Test memory leak + ######################################################### + + public function testCycleLeak() + { + $arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class); + $arr []= new TestMessage; + $arr[0]->SetRepeatedRecursive($arr); + + // Clean up memory before test. + gc_collect_cycles(); + $start = memory_get_usage(); + unset($arr); + + // Explicitly trigger garbage collection. + gc_collect_cycles(); + + $end = memory_get_usage(); + $this->assertLessThan($start, $end); + } +} diff --git a/php/tests/autoload.php b/php/tests/autoload.php deleted file mode 100644 index af88ba01..00000000 --- a/php/tests/autoload.php +++ /dev/null @@ -1,4 +0,0 @@ -<?php - -require_once('test.pb.php'); -require_once('test_util.php'); diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php new file mode 100644 index 00000000..d07907c0 --- /dev/null +++ b/php/tests/encode_decode_test.php @@ -0,0 +1,136 @@ +<?php + +require_once('test.pb.php'); +require_once('test_base.php'); +require_once('test_util.php'); + +use Google\Protobuf\RepeatedField; +use Google\Protobuf\GPBType; +use Foo\TestEnum; +use Foo\TestMessage; +use Foo\TestMessage_Sub; +use Foo\TestPackedMessage; +use Foo\TestUnpackedMessage; + +class EncodeDecodeTest extends TestBase +{ + + public function testEncode() + { + $from = new TestMessage(); + $this->expectEmptyFields($from); + $this->setFields($from); + $this->expectFields($from); + + $data = $from->encode(); + $this->assertSame(TestUtil::getGoldenTestMessage(), $data); + } + + public function testDecode() + { + $to = new TestMessage(); + $to->decode(TestUtil::getGoldenTestMessage()); + $this->expectFields($to); + } + + public function testEncodeDecode() + { + $from = new TestMessage(); + $this->expectEmptyFields($from); + $this->setFields($from); + $this->expectFields($from); + + $data = $from->encode(); + + $to = new TestMessage(); + $to->decode($data); + $this->expectFields($to); + } + + public function testEncodeDecodeEmpty() + { + $from = new TestMessage(); + $this->expectEmptyFields($from); + + $data = $from->encode(); + + $to = new TestMessage(); + $to->decode($data); + $this->expectEmptyFields($to); + } + + public function testEncodeDecodeOneof() + { + $m = new TestMessage(); + + $m->setOneofInt32(1); + $data = $m->encode(); + $n = new TestMessage(); + $n->decode($data); + $this->assertSame(1, $n->getOneofInt32()); + + $m->setOneofFloat(2.0); + $data = $m->encode(); + $n = new TestMessage(); + $n->decode($data); + $this->assertSame(2.0, $n->getOneofFloat()); + + $m->setOneofString('abc'); + $data = $m->encode(); + $n = new TestMessage(); + $n->decode($data); + $this->assertSame('abc', $n->getOneofString()); + + $sub_m = new TestMessage_Sub(); + $sub_m->setA(1); + $m->setOneofMessage($sub_m); + $data = $m->encode(); + $n = new TestMessage(); + $n->decode($data); + $this->assertSame(1, $n->getOneofMessage()->getA()); + } + + public function testPackedEncode() + { + $from = new TestPackedMessage(); + TestUtil::setTestPackedMessage($from); + $this->assertSame(TestUtil::getGoldenTestPackedMessage(), + $from->encode()); + } + + public function testPackedDecodePacked() + { + $to = new TestPackedMessage(); + $to->decode(TestUtil::getGoldenTestPackedMessage()); + TestUtil::assertTestPackedMessage($to); + } + + public function testPackedDecodeUnpacked() + { + $to = new TestPackedMessage(); + $to->decode(TestUtil::getGoldenTestUnpackedMessage()); + TestUtil::assertTestPackedMessage($to); + } + + public function testUnpackedEncode() + { + $from = new TestUnpackedMessage(); + TestUtil::setTestPackedMessage($from); + $this->assertSame(TestUtil::getGoldenTestUnpackedMessage(), + $from->encode()); + } + + public function testUnpackedDecodePacked() + { + $to = new TestUnpackedMessage(); + $to->decode(TestUtil::getGoldenTestPackedMessage()); + TestUtil::assertTestPackedMessage($to); + } + + public function testUnpackedDecodeUnpacked() + { + $to = new TestUnpackedMessage(); + $to->decode(TestUtil::getGoldenTestUnpackedMessage()); + TestUtil::assertTestPackedMessage($to); + } +} diff --git a/php/tests/generated_class_test.php b/php/tests/generated_class_test.php new file mode 100644 index 00000000..56466cae --- /dev/null +++ b/php/tests/generated_class_test.php @@ -0,0 +1,557 @@ +<?php + +require_once('test.pb.php'); +require_once('test_util.php'); + +use Google\Protobuf\Internal\RepeatedField; +use Google\Protobuf\Internal\GPBType; +use Foo\TestEnum; +use Foo\TestMessage; +use Foo\TestMessage_Sub; + +class GeneratedClassTest extends PHPUnit_Framework_TestCase +{ + + ######################################################### + # Test field accessors. + ######################################################### + + public function testSetterGetter() + { + $m = new TestMessage(); + $m->setOptionalInt32(1); + $this->assertSame(1, $m->getOptionalInt32()); + } + + ######################################################### + # Test int32 field. + ######################################################### + + public function testInt32Field() + { + $m = new TestMessage(); + + // Set integer. + $m->setOptionalInt32(MAX_INT32); + $this->assertSame(MAX_INT32, $m->getOptionalInt32()); + $m->setOptionalInt32(MIN_INT32); + $this->assertSame(MIN_INT32, $m->getOptionalInt32()); + + // Set float. + $m->setOptionalInt32(1.1); + $this->assertSame(1, $m->getOptionalInt32()); + $m->setOptionalInt32(MAX_INT32_FLOAT); + $this->assertSame(MAX_INT32, $m->getOptionalInt32()); + $m->setOptionalInt32(MIN_INT32_FLOAT); + $this->assertSame(MIN_INT32, $m->getOptionalInt32()); + + // Set string. + $m->setOptionalInt32('2'); + $this->assertSame(2, $m->getOptionalInt32()); + $m->setOptionalInt32('3.1'); + $this->assertSame(3, $m->getOptionalInt32()); + $m->setOptionalInt32(MAX_INT32_STRING); + $this->assertSame(MAX_INT32, $m->getOptionalInt32()); + $m->setOptionalInt32(MIN_INT32_STRING); + $this->assertSame(MIN_INT32, $m->getOptionalInt32()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32FieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalInt32(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32FieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalInt32('abc'); + } + + ######################################################### + # Test uint32 field. + ######################################################### + + public function testUint32Field() + { + $m = new TestMessage(); + + // Set integer. + $m->setOptionalUint32(MAX_UINT32); + $this->assertSame(-1, $m->getOptionalUint32()); + $m->setOptionalUint32(-1); + $this->assertSame(-1, $m->getOptionalUint32()); + $m->setOptionalUint32(MIN_UINT32); + $this->assertSame(MIN_INT32, $m->getOptionalUint32()); + + // Set float. + $m->setOptionalUint32(1.1); + $this->assertSame(1, $m->getOptionalUint32()); + $m->setOptionalUint32(MAX_UINT32_FLOAT); + $this->assertSame(-1, $m->getOptionalUint32()); + $m->setOptionalUint32(-1.0); + $this->assertSame(-1, $m->getOptionalUint32()); + $m->setOptionalUint32(MIN_UINT32_FLOAT); + $this->assertSame(MIN_INT32, $m->getOptionalUint32()); + + // Set string. + $m->setOptionalUint32('2'); + $this->assertSame(2, $m->getOptionalUint32()); + $m->setOptionalUint32('3.1'); + $this->assertSame(3, $m->getOptionalUint32()); + $m->setOptionalUint32(MAX_UINT32_STRING); + $this->assertSame(-1, $m->getOptionalUint32()); + $m->setOptionalUint32('-1.0'); + $this->assertSame(-1, $m->getOptionalUint32()); + $m->setOptionalUint32(MIN_UINT32_STRING); + $this->assertSame(MIN_INT32, $m->getOptionalUint32()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32FieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalUint32(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32FieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalUint32('abc'); + } + + ######################################################### + # Test int64 field. + ######################################################### + + public function testInt64Field() + { + $m = new TestMessage(); + + // Set integer. + $m->setOptionalInt64(MAX_INT64); + $this->assertSame(MAX_INT64, $m->getOptionalInt64()); + $m->setOptionalInt64(MIN_INT64); + $this->assertEquals(MIN_INT64, $m->getOptionalInt64()); + + // Set float. + $m->setOptionalInt64(1.1); + $this->assertSame(1, $m->getOptionalInt64()); + + // Set string. + $m->setOptionalInt64('2'); + $this->assertSame(2, $m->getOptionalInt64()); + $m->setOptionalInt64('3.1'); + $this->assertSame(3, $m->getOptionalInt64()); + $m->setOptionalInt64(MAX_INT64_STRING); + $this->assertSame(MAX_INT64, $m->getOptionalInt64()); + $m->setOptionalInt64(MIN_INT64_STRING); + $this->assertEquals(MIN_INT64, $m->getOptionalInt64()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64FieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalInt64(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64FieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalInt64('abc'); + } + + ######################################################### + # Test uint64 field. + ######################################################### + + public function testUint64Field() + { + $m = new TestMessage(); + + // Set integer. + $m->setOptionalUint64(MAX_UINT64); + $this->assertEquals(MAX_UINT64, $m->getOptionalUint64()); + + // Set float. + $m->setOptionalUint64(1.1); + $this->assertSame(1, $m->getOptionalUint64()); + + // Set string. + $m->setOptionalUint64('2'); + $this->assertSame(2, $m->getOptionalUint64()); + $m->setOptionalUint64('3.1'); + $this->assertSame(3, $m->getOptionalUint64()); + $m->setOptionalUint64(MAX_UINT64_STRING); + $this->assertEquals(MAX_UINT64, $m->getOptionalUint64()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64FieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalUint64(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64FieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalUint64('abc'); + } + + ######################################################### + # Test enum field. + ######################################################### + + public function testEnumField() + { + $m = new TestMessage(); + + // Set enum. + $m->setOptionalEnum(TestEnum::ONE); + $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum()); + + // Set integer. + $m->setOptionalEnum(1); + $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum()); + + // Set float. + $m->setOptionalEnum(1.1); + $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum()); + + // Set string. + $m->setOptionalEnum("1"); + $this->assertEquals(TestEnum::ONE, $m->getOptionalEnum()); + } + + ######################################################### + # Test float field. + ######################################################### + + public function testFloatField() + { + $m = new TestMessage(); + + // Set integer. + $m->setOptionalFloat(1); + $this->assertEquals(1.0, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF); + + // Set float. + $m->setOptionalFloat(1.1); + $this->assertEquals(1.1, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF); + + // Set string. + $m->setOptionalFloat('2'); + $this->assertEquals(2.0, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF); + $m->setOptionalFloat('3.1'); + $this->assertEquals(3.1, $m->getOptionalFloat(), '', MAX_FLOAT_DIFF); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatFieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalFloat(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatFieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalFloat('abc'); + } + + ######################################################### + # Test double field. + ######################################################### + + public function testDoubleField() + { + $m = new TestMessage(); + + // Set integer. + $m->setOptionalDouble(1); + $this->assertEquals(1.0, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF); + + // Set float. + $m->setOptionalDouble(1.1); + $this->assertEquals(1.1, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF); + + // Set string. + $m->setOptionalDouble('2'); + $this->assertEquals(2.0, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF); + $m->setOptionalDouble('3.1'); + $this->assertEquals(3.1, $m->getOptionalDouble(), '', MAX_FLOAT_DIFF); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleFieldInvalidTypeFail() + { + $m = new TestMessage(); + $m->setOptionalDouble(new TestMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleFieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalDouble('abc'); + } + + ######################################################### + # Test bool field. + ######################################################### + + public function testBoolField() + { + $m = new TestMessage(); + + // Set bool. + $m->setOptionalBool(true); + $this->assertSame(true, $m->getOptionalBool()); + + // Set integer. + $m->setOptionalBool(-1); + $this->assertSame(true, $m->getOptionalBool()); + + // Set float. + $m->setOptionalBool(1.1); + $this->assertSame(true, $m->getOptionalBool()); + + // Set string. + $m->setOptionalBool(''); + $this->assertSame(false, $m->getOptionalBool()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolFieldInvalidStringFail() + { + $m = new TestMessage(); + $m->setOptionalBool(new TestMessage()); + } + + ######################################################### + # Test string field. + ######################################################### + + public function testStringField() + { + $m = new TestMessage(); + + // Set string. + $m->setOptionalString('abc'); + $this->assertSame('abc', $m->getOptionalString()); + + // Set integer. + $m->setOptionalString(1); + $this->assertSame('1', $m->getOptionalString()); + + // Set double. + $m->setOptionalString(1.1); + $this->assertSame('1.1', $m->getOptionalString()); + + // Set bool. + $m->setOptionalString(true); + $this->assertSame('1', $m->getOptionalString()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringFieldInvalidUTF8Fail() + { + $m = new TestMessage(); + $hex = hex2bin("ff"); + $m->setOptionalString($hex); + } + + ######################################################### + # Test bytes field. + ######################################################### + + public function testBytesField() + { + $m = new TestMessage(); + + // Set string. + $m->setOptionalBytes('abc'); + $this->assertSame('abc', $m->getOptionalBytes()); + + // Set integer. + $m->setOptionalBytes(1); + $this->assertSame('1', $m->getOptionalBytes()); + + // Set double. + $m->setOptionalBytes(1.1); + $this->assertSame('1.1', $m->getOptionalBytes()); + + // Set bool. + $m->setOptionalBytes(true); + $this->assertSame('1', $m->getOptionalBytes()); + } + + public function testBytesFieldInvalidUTF8Success() + { + $m = new TestMessage(); + $hex = hex2bin("ff"); + $m->setOptionalBytes($hex); + } + + ######################################################### + # Test message field. + ######################################################### + + public function testMessageField() + { + $m = new TestMessage(); + + $sub_m = new TestMessage_Sub(); + $sub_m->setA(1); + $m->setOptionalMessage($sub_m); + $this->assertSame(1, $m->getOptionalMessage()->getA()); + + $null = null; + $m->setOptionalMessage($null); + $this->assertNull($m->getOptionalMessage()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageFieldWrongTypeFail() + { + $m = new TestMessage(); + $a = 1; + $m->setOptionalMessage($a); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageFieldWrongClassFail() + { + $m = new TestMessage(); + $m->setOptionalMessage(new TestMessage()); + } + + ######################################################### + # Test repeated field. + ######################################################### + + public function testRepeatedField() + { + $m = new TestMessage(); + + $repeated_int32 = new RepeatedField(GPBType::INT32); + $m->setRepeatedInt32($repeated_int32); + $this->assertSame($repeated_int32, $m->getRepeatedInt32()); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRepeatedFieldWrongTypeFail() + { + $m = new TestMessage(); + $a = 1; + $m->setRepeatedInt32($a); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRepeatedFieldWrongObjectFail() + { + $m = new TestMessage(); + $m->setRepeatedInt32($m); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRepeatedFieldWrongRepeatedTypeFail() + { + $m = new TestMessage(); + + $repeated_int32 = new RepeatedField(GPBType::UINT32); + $m->setRepeatedInt32($repeated_int32); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testRepeatedFieldWrongRepeatedMessageClassFail() + { + $m = new TestMessage(); + + $repeated_message = new RepeatedField(GPBType::MESSAGE, + TestMessage::class); + $m->setRepeatedMessage($repeated_message); + } + + ######################################################### + # Test oneof field. + ######################################################### + + public function testOneofField() { + $m = new TestMessage(); + + $m->setOneofInt32(1); + $this->assertSame(1, $m->getOneofInt32()); + $this->assertSame(0.0, $m->getOneofFloat()); + $this->assertSame('', $m->getOneofString()); + $this->assertSame(NULL, $m->getOneofMessage()); + + $m->setOneofFloat(2.0); + $this->assertSame(0, $m->getOneofInt32()); + $this->assertSame(2.0, $m->getOneofFloat()); + $this->assertSame('', $m->getOneofString()); + $this->assertSame(NULL, $m->getOneofMessage()); + + $m->setOneofString('abc'); + $this->assertSame(0, $m->getOneofInt32()); + $this->assertSame(0.0, $m->getOneofFloat()); + $this->assertSame('abc', $m->getOneofString()); + $this->assertSame(NULL, $m->getOneofMessage()); + + $sub_m = new TestMessage_Sub(); + $sub_m->setA(1); + $m->setOneofMessage($sub_m); + $this->assertSame(0, $m->getOneofInt32()); + $this->assertSame(0.0, $m->getOneofFloat()); + $this->assertSame('', $m->getOneofString()); + $this->assertSame(1, $m->getOneofMessage()->getA()); + } +} diff --git a/php/tests/map_field_test.php b/php/tests/map_field_test.php new file mode 100644 index 00000000..d79d0da3 --- /dev/null +++ b/php/tests/map_field_test.php @@ -0,0 +1,648 @@ +<?php + +require_once('test.pb.php'); +require_once('test_util.php'); + +use Google\Protobuf\Internal\GPBType; +use Google\Protobuf\Internal\MapField; +use Foo\TestMessage; +use Foo\TestMessage_Sub; + +class MapFieldTest extends PHPUnit_Framework_TestCase { + + ######################################################### + # Test int32 field. + ######################################################### + + public function testInt32() { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + + // Test integer argument. + $arr[MAX_INT32] = MAX_INT32; + $this->assertSame(MAX_INT32, $arr[MAX_INT32]); + $arr[MIN_INT32] = MIN_INT32; + $this->assertSame(MIN_INT32, $arr[MIN_INT32]); + $this->assertEquals(2, count($arr)); + $this->assertTrue(isset($arr[MAX_INT32])); + $this->assertTrue(isset($arr[MIN_INT32])); + unset($arr[MAX_INT32]); + unset($arr[MIN_INT32]); + $this->assertEquals(0, count($arr)); + + // Test float argument. + $arr[1.9] = 1.9; + $arr[2.1] = 2.1; + $this->assertSame(1, $arr[1]); + $this->assertSame(2, $arr[2]); + $arr[MAX_INT32_FLOAT] = MAX_INT32_FLOAT; + $this->assertSame(MAX_INT32, $arr[MAX_INT32]); + $arr[MIN_INT32_FLOAT] = MIN_INT32_FLOAT; + $this->assertSame(MIN_INT32, $arr[MIN_INT32]); + $this->assertEquals(4, count($arr)); + unset($arr[1.9]); + unset($arr[2.9]); + unset($arr[MAX_INT32_FLOAT]); + unset($arr[MIN_INT32_FLOAT]); + $this->assertEquals(0, count($arr)); + + // Test string argument. + $arr['2'] = '2'; + $this->assertSame(2, $arr[2]); + $arr['3.1'] = '3.1'; + $this->assertSame(3, $arr[3]); + $arr[MAX_INT32_STRING] = MAX_INT32_STRING; + $this->assertSame(MAX_INT32, $arr[MAX_INT32]); + $this->assertEquals(3, count($arr)); + unset($arr['2']); + unset($arr['3.1']); + unset($arr[MAX_INT32_STRING]); + $this->assertEquals(0, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetStringKeyFail() + { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + $arr ['abc']= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetStringValueFail() + { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetMessageKeyFail() + { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + $arr [new TestMessage_Sub()]= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt32SetMessageValueFail() + { + $arr = new MapField(GPBType::INT32, GPBType::INT32); + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test uint32 field. + ######################################################### + + public function testUint32() { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + + // Test integer argument. + $arr[MAX_UINT32] = MAX_UINT32; + $this->assertSame(-1, $arr[-1]); + $this->assertEquals(1, count($arr)); + unset($arr[MAX_UINT32]); + $this->assertEquals(0, count($arr)); + + $arr[-1] = -1; + $this->assertSame(-1, $arr[-1]); + $arr[MIN_UINT32] = MIN_UINT32; + $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]); + $this->assertEquals(2, count($arr)); + unset($arr[-1]); + unset($arr[MIN_UINT32]); + $this->assertEquals(0, count($arr)); + + // Test float argument. + $arr[MAX_UINT32_FLOAT] = MAX_UINT32_FLOAT; + $this->assertSame(-1, $arr[-1]); + $this->assertEquals(1, count($arr)); + unset($arr[MAX_UINT32_FLOAT]); + $this->assertEquals(0, count($arr)); + + $arr[3.1] = 3.1; + $this->assertSame(3, $arr[3]); + $arr[-1.0] = -1.0; + $this->assertSame(-1, $arr[-1]); + $arr[MIN_UINT32_FLOAT] = MIN_UINT32_FLOAT; + $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]); + $this->assertEquals(3, count($arr)); + unset($arr[3.1]); + unset($arr[-1.0]); + unset($arr[MIN_UINT32_FLOAT]); + $this->assertEquals(0, count($arr)); + + // Test string argument. + $arr[MAX_UINT32_STRING] = MAX_UINT32_STRING; + $this->assertSame(-1, $arr[-1]); + $this->assertEquals(1, count($arr)); + unset($arr[MAX_UINT32_STRING]); + $this->assertEquals(0, count($arr)); + + $arr['7'] = '7'; + $this->assertSame(7, $arr[7]); + $arr['3.1'] = '3.1'; + $this->assertSame(3, $arr[3]); + $arr['-1.0'] = '-1.0'; + $this->assertSame(-1, $arr[-1]); + $arr[MIN_UINT32_STRING] = MIN_UINT32_STRING; + $this->assertSame(MIN_UINT32, $arr[MIN_UINT32]); + $this->assertEquals(4, count($arr)); + unset($arr['7']); + unset($arr['3.1']); + unset($arr['-1.0']); + unset($arr[MIN_UINT32_STRING]); + $this->assertEquals(0, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetStringKeyFail() + { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + $arr ['abc']= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetStringValueFail() + { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetMessageKeyFail() + { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + $arr [new TestMessage_Sub()]= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint32SetMessageValueFail() + { + $arr = new MapField(GPBType::UINT32, GPBType::UINT32); + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test int64 field. + ######################################################### + + public function testInt64() { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + + // Test integer argument. + $arr[MAX_INT64] = MAX_INT64; + $this->assertSame(MAX_INT64, $arr[MAX_INT64]); + $arr[MIN_INT64] = MIN_INT64; + $this->assertEquals(MIN_INT64, $arr[MIN_INT64]); + $this->assertEquals(2, count($arr)); + unset($arr[MAX_INT64]); + unset($arr[MIN_INT64]); + $this->assertEquals(0, count($arr)); + + // Test float argument. + $arr[1.1] = 1.1; + $this->assertSame(1, $arr[1]); + $this->assertEquals(1, count($arr)); + unset($arr[1.1]); + $this->assertEquals(0, count($arr)); + + // Test string argument. + $arr['2'] = '2'; + $this->assertSame(2, $arr[2]); + $arr['3.1'] = '3.1'; + $this->assertSame(3, $arr[3]); + $arr[MAX_INT64_STRING] = MAX_INT64_STRING; + $this->assertSame(MAX_INT64, $arr[MAX_INT64]); + $arr[MIN_INT64_STRING] = MIN_INT64_STRING; + $this->assertEquals(MIN_INT64, $arr[MIN_INT64]); + $this->assertEquals(4, count($arr)); + unset($arr['2']); + unset($arr['3.1']); + unset($arr[MAX_INT64_STRING]); + unset($arr[MIN_INT64_STRING]); + $this->assertEquals(0, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetStringKeyFail() + { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + $arr ['abc']= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetStringValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetMessageKeyFail() + { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + $arr [new TestMessage_Sub()]= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testInt64SetMessageValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::INT64); + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test uint64 field. + ######################################################### + + public function testUint64() { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + + // Test integer argument. + $arr[MAX_UINT64] = MAX_UINT64; + $this->assertEquals(MAX_UINT64, $arr[MAX_UINT64]); + $this->assertEquals(1, count($arr)); + unset($arr[MAX_UINT64]); + $this->assertEquals(0, count($arr)); + + // Test float argument. + $arr[1.1] = 1.1; + $this->assertSame(1, $arr[1]); + $this->assertEquals(1, count($arr)); + unset($arr[1.1]); + $this->assertEquals(0, count($arr)); + + // Test string argument. + $arr['2'] = '2'; + $this->assertSame(2, $arr[2]); + $arr['3.1'] = '3.1'; + $this->assertSame(3, $arr[3]); + $arr[MAX_UINT64_STRING] = MAX_UINT64_STRING; + $this->assertEquals(MAX_UINT64, $arr[MAX_UINT64]); + $this->assertEquals(3, count($arr)); + unset($arr['2']); + unset($arr['3.1']); + unset($arr[MAX_UINT64_STRING]); + $this->assertEquals(0, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetStringKeyFail() + { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + $arr ['abc']= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetStringValueFail() + { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetMessageKeyFail() + { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + $arr [new TestMessage_Sub()]= 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testUint64SetMessageValueFail() + { + $arr = new MapField(GPBType::UINT64, GPBType::UINT64); + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test float field. + ######################################################### + + public function testFloat() { + $arr = new MapField(GPBType::INT32, GPBType::FLOAT); + + // Test set. + $arr[0] = 1; + $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); + + $arr[1] = 1.1; + $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); + + $arr[2] = '2'; + $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); + $arr[3] = '3.1'; + $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); + + $this->assertEquals(4, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatSetStringValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::FLOAT); + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testFloatSetMessageValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::FLOAT); + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test double field. + ######################################################### + + public function testDouble() { + $arr = new MapField(GPBType::INT32, GPBType::DOUBLE); + + // Test set. + $arr[0] = 1; + $this->assertEquals(1.0, $arr[0], '', MAX_FLOAT_DIFF); + + $arr[1] = 1.1; + $this->assertEquals(1.1, $arr[1], '', MAX_FLOAT_DIFF); + + $arr[2] = '2'; + $this->assertEquals(2.0, $arr[2], '', MAX_FLOAT_DIFF); + $arr[3] = '3.1'; + $this->assertEquals(3.1, $arr[3], '', MAX_FLOAT_DIFF); + + $this->assertEquals(4, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleSetStringValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::DOUBLE); + $arr [0]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testDoubleSetMessageValueFail() + { + $arr = new MapField(GPBType::INT64, GPBType::DOUBLE); + $arr [0]= new TestMessage_Sub(); + } + + ######################################################### + # Test bool field. + ######################################################### + + public function testBool() { + $arr = new MapField(GPBType::BOOL, GPBType::BOOL); + + // Test boolean. + $arr[True] = True; + $this->assertSame(True, $arr[True]); + $this->assertEquals(1, count($arr)); + unset($arr[True]); + $this->assertEquals(0, count($arr)); + + $arr[False] = False; + $this->assertSame(False, $arr[False]); + $this->assertEquals(1, count($arr)); + unset($arr[False]); + $this->assertEquals(0, count($arr)); + + // Test integer. + $arr[-1] = -1; + $this->assertSame(True, $arr[True]); + $this->assertEquals(1, count($arr)); + unset($arr[-1]); + $this->assertEquals(0, count($arr)); + + $arr[0] = 0; + $this->assertSame(False, $arr[False]); + $this->assertEquals(1, count($arr)); + unset($arr[0]); + $this->assertEquals(0, count($arr)); + + // Test float. + $arr[1.1] = 1.1; + $this->assertSame(True, $arr[True]); + $this->assertEquals(1, count($arr)); + unset($arr[1.1]); + $this->assertEquals(0, count($arr)); + + $arr[0.0] = 0.0; + $this->assertSame(False, $arr[False]); + $this->assertEquals(1, count($arr)); + unset($arr[0.0]); + $this->assertEquals(0, count($arr)); + + // Test string. + $arr['a'] = 'a'; + $this->assertSame(True, $arr[True]); + $this->assertEquals(1, count($arr)); + unset($arr['a']); + $this->assertEquals(0, count($arr)); + + $arr[''] = ''; + $this->assertSame(False, $arr[False]); + $this->assertEquals(1, count($arr)); + unset($arr['']); + $this->assertEquals(0, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolSetMessageKeyFail() + { + $arr = new MapField(GPBType::BOOL, GPBType::BOOL); + $arr [new TestMessage_Sub()]= true; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testBoolSetMessageValueFail() + { + $arr = new MapField(GPBType::BOOL, GPBType::BOOL); + $arr [true]= new TestMessage_Sub(); + } + + ######################################################### + # Test string field. + ######################################################### + + public function testString() { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + + // Test set. + $arr['abc'] = 'abc'; + $this->assertSame('abc', $arr['abc']); + $this->assertEquals(1, count($arr)); + unset($arr['abc']); + $this->assertEquals(0, count($arr)); + + $arr[1] = 1; + $this->assertSame('1', $arr['1']); + $this->assertEquals(1, count($arr)); + unset($arr[1]); + $this->assertEquals(0, count($arr)); + + $arr[1.1] = 1.1; + $this->assertSame('1.1', $arr['1.1']); + $this->assertEquals(1, count($arr)); + unset($arr[1.1]); + $this->assertEquals(0, count($arr)); + + $arr[True] = True; + $this->assertSame('1', $arr['1']); + $this->assertEquals(1, count($arr)); + unset($arr[True]); + $this->assertEquals(0, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetInvalidUTF8KeyFail() + { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + $arr[hex2bin("ff")]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetInvalidUTF8ValueFail() + { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + $arr ['abc']= hex2bin("ff"); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetMessageKeyFail() + { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + $arr [new TestMessage_Sub()]= 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testStringSetMessageValueFail() + { + $arr = new MapField(GPBType::STRING, GPBType::STRING); + $arr ['abc']= new TestMessage_Sub(); + } + + ######################################################### + # Test message field. + ######################################################### + + public function testMessage() { + $arr = new MapField(GPBType::INT32, + GPBType::MESSAGE, TestMessage_Sub::class); + + // Test append. + $sub_m = new TestMessage_Sub(); + $sub_m->setA(1); + $arr[0] = $sub_m; + $this->assertSame(1, $arr[0]->getA()); + + $null = NULL; + $arr[1] = $null; + $this->assertNull($arr[1]); + + $this->assertEquals(2, count($arr)); + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetIntValueFail() + { + $arr = + new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); + $arr[0] = 0; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetStringValueFail() + { + $arr = + new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); + $arr[0] = 'abc'; + } + + /** + * @expectedException PHPUnit_Framework_Error + */ + public function testMessageSetOtherMessageValueFail() + { + $arr = + new MapField(GPBType::INT32, GPBType::MESSAGE, TestMessage::class); + $arr[0] = new TestMessage_Sub(); + } + + ######################################################### + # Test memory leak + ######################################################### + + // TODO(teboring): Add it back. + // public function testCycleLeak() + // { + // $arr = new MapField(GPBType::INT32, + // GPBType::MESSAGE, TestMessage::class); + // $arr [0]= new TestMessage; + // $arr[0]->SetMapRecursive($arr); + + // // Clean up memory before test. + // gc_collect_cycles(); + // $start = memory_get_usage(); + // unset($arr); + + // // Explicitly trigger garbage collection. + // gc_collect_cycles(); + + // $end = memory_get_usage(); + // $this->assertLessThan($start, $end); + // } +} diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php new file mode 100644 index 00000000..ec54597b --- /dev/null +++ b/php/tests/memory_leak_test.php @@ -0,0 +1,73 @@ +<?php + +# phpunit has memory leak by itself. Thus, it cannot be used to test memory leak. + +require_once('test.pb.php'); +require_once('test_util.php'); + +use Google\Protobuf\Internal\RepeatedField; +use Google\Protobuf\Internal\GPBType; +use Foo\TestMessage; +use Foo\TestMessage_Sub; + +$from = new TestMessage(); +TestUtil::setTestMessage($from); +TestUtil::assertTestMessage($from); + +$data = $from->encode(); + +$to = new TestMessage(); +$to->decode($data); + +TestUtil::assertTestMessage($to); + +$from->setRecursive($from); + +$arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class); +$arr []= new TestMessage; +$arr[0]->SetRepeatedRecursive($arr); + +// Test oneof fields. +$m = new TestMessage(); + +$m->setOneofInt32(1); +assert(1 === $m->getOneofInt32()); +assert(0.0 === $m->getOneofFloat()); +assert('' === $m->getOneofString()); +assert(NULL === $m->getOneofMessage()); +$data = $m->encode(); +$n = new TestMessage(); +$n->decode($data); +assert(1 === $n->getOneofInt32()); + +$m->setOneofFloat(2.0); +assert(0 === $m->getOneofInt32()); +assert(2.0 === $m->getOneofFloat()); +assert('' === $m->getOneofString()); +assert(NULL === $m->getOneofMessage()); +$data = $m->encode(); +$n = new TestMessage(); +$n->decode($data); +assert(2.0 === $n->getOneofFloat()); + +$m->setOneofString('abc'); +assert(0 === $m->getOneofInt32()); +assert(0.0 === $m->getOneofFloat()); +assert('abc' === $m->getOneofString()); +assert(NULL === $m->getOneofMessage()); +$data = $m->encode(); +$n = new TestMessage(); +$n->decode($data); +assert('abc' === $n->getOneofString()); + +$sub_m = new TestMessage_Sub(); +$sub_m->setA(1); +$m->setOneofMessage($sub_m); +assert(0 === $m->getOneofInt32()); +assert(0.0 === $m->getOneofFloat()); +assert('' === $m->getOneofString()); +assert(1 === $m->getOneofMessage()->getA()); +$data = $m->encode(); +$n = new TestMessage(); +$n->decode($data); +assert(1 === $n->getOneofMessage()->getA()); diff --git a/php/tests/php_implementation_test.php b/php/tests/php_implementation_test.php new file mode 100644 index 00000000..82941dd2 --- /dev/null +++ b/php/tests/php_implementation_test.php @@ -0,0 +1,443 @@ +<?php + +require_once('test.pb.php'); +require_once('test_base.php'); +require_once('test_util.php'); + +use Foo\TestMessage; +use Foo\TestMessage_Sub; +use Foo\TestPackedMessage; +use Google\Protobuf\Internal\InputStream; +use Google\Protobuf\Internal\FileDescriptorSet; +use Google\Protobuf\Internal\GPBUtil; +use Google\Protobuf\Internal\Int64; +use Google\Protobuf\Internal\Uint64; +use Google\Protobuf\Internal\GPBLabel; +use Google\Protobuf\Internal\GPBType; +use Google\Protobuf\Internal\GPBWire; +use Google\Protobuf\Internal\OutputStream; +use Google\Protobuf\Internal\RepeatedField; + +class ImplementationTest extends TestBase +{ + + public function testReadInt32() + { + $value = null; + + // Positive number. + $input = new InputStream(hex2bin("01")); + GPBWire::readInt32($input, $value); + $this->assertSame(1, $value); + + // Negative number. + $input = new InputStream(hex2bin("ffffffff0f")); + GPBWire::readInt32($input, $value); + $this->assertSame(-1, $value); + + // Discard overflow bits. + $input = new InputStream(hex2bin("ffffffff7f")); + GPBWire::readInt32($input, $value); + $this->assertSame(-1, $value); + } + + public function testReadUint32() + { + $value = null; + + // Positive number. + $input = new InputStream(hex2bin("01")); + GPBWire::readUint32($input, $value); + $this->assertSame(1, $value); + + // Max uint32. + $input = new InputStream(hex2bin("ffffffff0f")); + GPBWire::readUint32($input, $value); + $this->assertSame(-1, $value); + + // Discard overflow bits. + $input = new InputStream(hex2bin("ffffffff7f")); + GPBWire::readUint32($input, $value); + $this->assertSame(-1, $value); + } + + public function testReadInt64() + { + $value = null; + + // Positive number. + $input = new InputStream(hex2bin("01")); + GPBWire::readInt64($input, $value); + $this->assertSame(1, $value->toInteger()); + + // Negative number. + $input = new InputStream(hex2bin("ffffffffffffffffff01")); + GPBWire::readInt64($input, $value); + $this->assertSame(-1, $value->toInteger()); + + // Discard overflow bits. + $input = new InputStream(hex2bin("ffffffffffffffffff0f")); + GPBWire::readInt64($input, $value); + $this->assertSame(-1, $value->toInteger()); + } + + public function testReadUint64() + { + $value = null; + + // Positive number. + $input = new InputStream(hex2bin("01")); + GPBWire::readUint64($input, $value); + $this->assertSame(1, $value->toInteger()); + + // Negative number. + $input = new InputStream(hex2bin("FFFFFFFFFFFFFFFFFF01")); + GPBWire::readUint64($input, $value); + $this->assertSame(-1, $value->toInteger()); + + // Discard overflow bits. + $input = new InputStream(hex2bin("FFFFFFFFFFFFFFFFFF0F")); + GPBWire::readUint64($input, $value); + $this->assertSame(-1, $value->toInteger()); + } + + public function testReadSint32() + { + $value = null; + + $input = new InputStream(hex2bin("00")); + GPBWire::readSint32($input, $value); + $this->assertSame(0, $value); + + $input = new InputStream(hex2bin("01")); + GPBWire::readSint32($input, $value); + $this->assertSame(-1, $value); + + $input = new InputStream(hex2bin("02")); + GPBWire::readSint32($input, $value); + $this->assertSame(1, $value); + } + + public function testReadSint64() + { + $value = null; + + $input = new InputStream(hex2bin("00")); + GPBWire::readSint64($input, $value); + $this->assertEquals(GPBUtil::Int64(0), $value); + + $input = new InputStream(hex2bin("01")); + GPBWire::readSint64($input, $value); + $this->assertEquals(GPBUtil::Int64(-1), $value); + + $input = new InputStream(hex2bin("02")); + GPBWire::readSint64($input, $value); + $this->assertEquals(GPBUtil::Int64(1), $value); + } + + public function testReadFixed32() + { + $value = null; + $input = new InputStream(hex2bin("12345678")); + GPBWire::readFixed32($input, $value); + $this->assertSame(0x78563412, $value); + } + + public function testReadFixed64() + { + $value = null; + $input = new InputStream(hex2bin("1234567812345678")); + GPBWire::readFixed64($input, $value); + $this->assertEquals(Uint64::newValue(0x78563412, 0x78563412), $value); + } + + public function testReadSfixed32() + { + $value = null; + $input = new InputStream(hex2bin("12345678")); + GPBWire::readSfixed32($input, $value); + $this->assertSame(0x78563412, $value); + } + + public function testReadFloat() + { + $value = null; + $input = new InputStream(hex2bin("0000803F")); + GPBWire::readFloat($input, $value); + $this->assertSame(1.0, $value); + } + + public function testReadBool() + { + $value = null; + + $input = new InputStream(hex2bin("00")); + GPBWire::readBool($input, $value); + $this->assertSame(false, $value); + + $input = new InputStream(hex2bin("01")); + GPBWire::readBool($input, $value); + $this->assertSame(true, $value); + } + + public function testReadDouble() + { + $value = null; + $input = new InputStream(hex2bin("000000000000F03F")); + GPBWire::readDouble($input, $value); + $this->assertSame(1.0, $value); + } + + public function testReadSfixed64() + { + $value = null; + $input = new InputStream(hex2bin("1234567812345678")); + GPBWire::readSfixed64($input, $value); + $this->assertEquals(Int64::newValue(0x78563412, 0x78563412), $value); + } + + public function testZigZagEncodeDecode() + { + $this->assertSame(0, GPBWire::zigZagEncode32(0)); + $this->assertSame(1, GPBWire::zigZagEncode32(-1)); + $this->assertSame(2, GPBWire::zigZagEncode32(1)); + $this->assertSame(3, GPBWire::zigZagEncode32(-2)); + $this->assertSame(0x7FFFFFFE, GPBWire::zigZagEncode32(0x3FFFFFFF)); + $this->assertSame(0x7FFFFFFF, GPBWire::zigZagEncode32(0xC0000000)); + $this->assertSame(-2, GPBWire::zigZagEncode32(0x7FFFFFFF)); + $this->assertSame(-1, GPBWire::zigZagEncode32(0x80000000)); + + $this->assertSame(0, GPBWire::zigZagDecode32(0)); + $this->assertSame(-1, GPBWire::zigZagDecode32(1)); + $this->assertSame(1, GPBWire::zigZagDecode32(2)); + $this->assertSame(-2, GPBWire::zigZagDecode32(3)); + $this->assertSame(0x3FFFFFFF, GPBWire::zigZagDecode32(0x7FFFFFFE)); + $this->assertSame(-1073741824, GPBWire::zigZagDecode32(0x7FFFFFFF)); + $this->assertSame(0x7FFFFFFF, GPBWire::zigZagDecode32(0xFFFFFFFE)); + $this->assertSame(-2147483648, GPBWire::zigZagDecode32(0xFFFFFFFF)); + + $this->assertEquals(GPBUtil::Uint64(0), + GPBWire::zigZagEncode64(GPBUtil::Int64(0))); + $this->assertEquals(GPBUtil::Uint64(1), + GPBWire::zigZagEncode64(GPBUtil::Int64(-1))); + $this->assertEquals(GPBUtil::Uint64(2), + GPBWire::zigZagEncode64(GPBUtil::Int64(1))); + $this->assertEquals(GPBUtil::Uint64(3), + GPBWire::zigZagEncode64(GPBUtil::Int64(-2))); + $this->assertEquals( + GPBUtil::Uint64(0x000000007FFFFFFE), + GPBWire::zigZagEncode64(GPBUtil::Int64(0x000000003FFFFFFF))); + $this->assertEquals( + GPBUtil::Uint64(0x000000007FFFFFFF), + GPBWire::zigZagEncode64(GPBUtil::Int64(0xFFFFFFFFC0000000))); + $this->assertEquals( + GPBUtil::Uint64(0x00000000FFFFFFFE), + GPBWire::zigZagEncode64(GPBUtil::Int64(0x000000007FFFFFFF))); + $this->assertEquals( + GPBUtil::Uint64(0x00000000FFFFFFFF), + GPBWire::zigZagEncode64(GPBUtil::Int64(0xFFFFFFFF80000000))); + $this->assertEquals( + Uint64::newValue(4294967295, 4294967294), + GPBWire::zigZagEncode64(GPBUtil::Int64(0x7FFFFFFFFFFFFFFF))); + $this->assertEquals( + Uint64::newValue(4294967295, 4294967295), + GPBWire::zigZagEncode64(GPBUtil::Int64(0x8000000000000000))); + + $this->assertEquals(GPBUtil::Int64(0), + GPBWire::zigZagDecode64(GPBUtil::Uint64(0))); + $this->assertEquals(GPBUtil::Int64(-1), + GPBWire::zigZagDecode64(GPBUtil::Uint64(1))); + $this->assertEquals(GPBUtil::Int64(1), + GPBWire::zigZagDecode64(GPBUtil::Uint64(2))); + $this->assertEquals(GPBUtil::Int64(-2), + GPBWire::zigZagDecode64(GPBUtil::Uint64(3))); + + // Round trip + $this->assertSame(0, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(0))); + $this->assertSame(1, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(1))); + $this->assertSame(-1, GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(-1))); + $this->assertSame(14927, + GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(14927))); + $this->assertSame(-3612, + GPBWire::zigZagDecode32(GPBWire::zigZagEncode32(-3612))); + } + + public function testDecode() + { + $m = new TestMessage(); + $m->decode(TestUtil::getGoldenTestMessage()); + TestUtil::assertTestMessage($m); + } + + public function testDescriptorDecode() + { + $file_desc_set = new FileDescriptorSet(); + $file_desc_set->decode(hex2bin( + "0a3b0a12746573745f696e636c7564652e70726f746f120362617222180a" . + "0b54657374496e636c75646512090a0161180120012805620670726f746f33")); + + $this->assertSame(1, sizeof($file_desc_set->getFile())); + + $file_desc = $file_desc_set->getFile()[0]; + $this->assertSame("test_include.proto", $file_desc->getName()); + $this->assertSame("bar", $file_desc->getPackage()); + $this->assertSame(0, sizeof($file_desc->getDependency())); + $this->assertSame(1, sizeof($file_desc->getMessageType())); + $this->assertSame(0, sizeof($file_desc->getEnumType())); + $this->assertSame("proto3", $file_desc->getSyntax()); + + $desc = $file_desc->getMessageType()[0]; + $this->assertSame("TestInclude", $desc->getName()); + $this->assertSame(1, sizeof($desc->getField())); + $this->assertSame(0, sizeof($desc->getNestedType())); + $this->assertSame(0, sizeof($desc->getEnumType())); + $this->assertSame(0, sizeof($desc->getOneofDecl())); + + $field = $desc->getField()[0]; + $this->assertSame("a", $field->getName()); + $this->assertSame(1, $field->getNumber()); + $this->assertSame(GPBLabel::OPTIONAL, $field->getLabel()); + $this->assertSame(GPBType::INT32, $field->getType()); + } + + public function testReadVarint64() + { + $var = 0; + + // Empty buffer. + $input = new InputStream(hex2bin('')); + $this->assertFalse($input->readVarint64($var)); + + // The largest varint is 10 bytes long. + $input = new InputStream(hex2bin('8080808080808080808001')); + $this->assertFalse($input->readVarint64($var)); + + // Corrupted varint. + $input = new InputStream(hex2bin('808080')); + $this->assertFalse($input->readVarint64($var)); + + // Normal case. + $input = new InputStream(hex2bin('808001')); + $this->assertTrue($input->readVarint64($var)); + $this->assertSame(16384, $var->toInteger()); + $this->assertFalse($input->readVarint64($var)); + + // Read two varint. + $input = new InputStream(hex2bin('808001808002')); + $this->assertTrue($input->readVarint64($var)); + $this->assertSame(16384, $var->toInteger()); + $this->assertTrue($input->readVarint64($var)); + $this->assertSame(32768, $var->toInteger()); + $this->assertFalse($input->readVarint64($var)); + } + + public function testReadVarint32() + { + $var = 0; + + // Empty buffer. + $input = new InputStream(hex2bin('')); + $this->assertFalse($input->readVarint32($var)); + + // The largest varint is 10 bytes long. + $input = new InputStream(hex2bin('8080808080808080808001')); + $this->assertFalse($input->readVarint32($var)); + + // Corrupted varint. + $input = new InputStream(hex2bin('808080')); + $this->assertFalse($input->readVarint32($var)); + + // Normal case. + $input = new InputStream(hex2bin('808001')); + $this->assertTrue($input->readVarint32($var)); + $this->assertSame(16384, $var); + $this->assertFalse($input->readVarint32($var)); + + // Read two varint. + $input = new InputStream(hex2bin('808001808002')); + $this->assertTrue($input->readVarint32($var)); + $this->assertSame(16384, $var); + $this->assertTrue($input->readVarint32($var)); + $this->assertSame(32768, $var); + $this->assertFalse($input->readVarint32($var)); + + // Read a 64-bit integer. High-order bits should be discarded. + $input = new InputStream(hex2bin('808081808001')); + $this->assertTrue($input->readVarint32($var)); + $this->assertSame(16384, $var); + $this->assertFalse($input->readVarint32($var)); + } + + public function testReadTag() + { + $input = new InputStream(hex2bin('808001')); + $tag = $input->readTag(); + $this->assertSame(16384, $tag); + $tag = $input->readTag(); + $this->assertSame(0, $tag); + } + + public function testPushPopLimit() + { + $input = new InputStream(hex2bin('808001')); + $old_limit = $input->pushLimit(0); + $tag = $input->readTag(); + $this->assertSame(0, $tag); + $input->popLimit($old_limit); + $tag = $input->readTag(); + $this->assertSame(16384, $tag); + } + + public function testReadRaw() + { + $input = new InputStream(hex2bin('808001')); + $buffer = null; + + $this->assertTrue($input->readRaw(3, $buffer)); + $this->assertSame(hex2bin('808001'), $buffer); + + $this->assertFalse($input->readRaw(1, $buffer)); + } + + public function testWriteVarint32() + { + $output = new OutputStream(3); + $output->writeVarint32(16384); + $this->assertSame(hex2bin('808001'), $output->getData()); + } + + public function testWriteVarint64() + { + $output = new OutputStream(10); + $output->writeVarint64(-43); + $this->assertSame(hex2bin('D5FFFFFFFFFFFFFFFF01'), $output->getData()); + } + + public function testWriteLittleEndian32() + { + $output = new OutputStream(4); + $output->writeLittleEndian32(46); + $this->assertSame(hex2bin('2E000000'), $output->getData()); + } + + public function testWriteLittleEndian64() + { + $output = new OutputStream(8); + $output->writeLittleEndian64(47); + $this->assertSame(hex2bin('2F00000000000000'), $output->getData()); + } + + public function testByteSize() + { + $m = new TestMessage(); + TestUtil::setTestMessage($m); + $this->assertSame(447, $m->byteSize()); + } + + public function testPackedByteSize() + { + $m = new TestPackedMessage(); + TestUtil::setTestPackedMessage($m); + $this->assertSame(156, $m->byteSize()); + } +} diff --git a/php/tests/test.proto b/php/tests/test.proto new file mode 100644 index 00000000..15709c83 --- /dev/null +++ b/php/tests/test.proto @@ -0,0 +1,136 @@ +syntax = "proto3"; + +import 'test_include.proto'; + +package foo; + +message TestMessage { + // Singular + int32 optional_int32 = 1; + int64 optional_int64 = 2; + uint32 optional_uint32 = 3; + uint64 optional_uint64 = 4; + sint32 optional_sint32 = 5; + sint64 optional_sint64 = 6; + fixed32 optional_fixed32 = 7; + fixed64 optional_fixed64 = 8; + sfixed32 optional_sfixed32 = 9; + sfixed64 optional_sfixed64 = 10; + float optional_float = 11; + double optional_double = 12; + bool optional_bool = 13; + string optional_string = 14; + bytes optional_bytes = 15; + + TestEnum optional_enum = 16; + Sub optional_message = 17; + bar.TestInclude optional_included_message = 18; + TestMessage recursive = 19; + + // Repeated + repeated int32 repeated_int32 = 31; + repeated int64 repeated_int64 = 32; + repeated uint32 repeated_uint32 = 33; + repeated uint64 repeated_uint64 = 34; + repeated sint32 repeated_sint32 = 35; + repeated sint64 repeated_sint64 = 36; + repeated fixed32 repeated_fixed32 = 37; + repeated fixed64 repeated_fixed64 = 38; + repeated sfixed32 repeated_sfixed32 = 39; + repeated sfixed64 repeated_sfixed64 = 40; + repeated float repeated_float = 41; + repeated double repeated_double = 42; + repeated bool repeated_bool = 43; + repeated string repeated_string = 44; + repeated bytes repeated_bytes = 45; + + repeated TestEnum repeated_enum = 46; + repeated Sub repeated_message = 47; + repeated TestMessage repeated_recursive = 48; + + oneof my_oneof { + int32 oneof_int32 = 51; + int64 oneof_int64 = 52; + uint32 oneof_uint32 = 53; + uint64 oneof_uint64 = 54; + uint32 oneof_sint32 = 55; + uint64 oneof_sint64 = 56; + uint32 oneof_fixed32 = 57; + uint64 oneof_fixed64 = 58; + uint32 oneof_sfixed32 = 59; + uint64 oneof_sfixed64 = 60; + double oneof_double = 61; + float oneof_float = 62; + bool oneof_bool = 63; + string oneof_string = 64; + bytes oneof_bytes = 65; + TestEnum oneof_enum = 66; + Sub oneof_message = 67; + } + + map<int32, int32> map_int32_int32 = 71; + map<int64, int64> map_int64_int64 = 72; + map<uint32, uint32> map_uint32_uint32 = 73; + map<uint64, uint64> map_uint64_uint64 = 74; + map<sint32, sint32> map_sint32_sint32 = 75; + map<sint64, sint64> map_sint64_sint64 = 76; + map<fixed32, fixed32> map_fixed32_fixed32 = 77; + map<fixed64, fixed64> map_fixed64_fixed64 = 78; + map<sfixed32, sfixed32> map_sfixed32_sfixed32 = 79; + map<sfixed64, sfixed64> map_sfixed64_sfixed64 = 80; + map<int32, float> map_int32_float = 81; + map<int32, double> map_int32_double = 82; + map<bool, bool> map_bool_bool = 83; + map<string, string> map_string_string = 84; + map<int32, bytes> map_int32_bytes = 85; + map<int32, TestEnum> map_int32_enum = 86; + map<int32, Sub> map_int32_message = 87; + + map<int32, TestMessage> map_recursive = 88; + + message Sub { + int32 a = 1; + } + + // NestedMessage nested_message = 90; +} + +enum TestEnum { + ZERO = 0; + ONE = 1; +} + +message TestPackedMessage { + repeated int32 repeated_int32 = 90 [packed = true]; + repeated int64 repeated_int64 = 91 [packed = true]; + repeated uint32 repeated_uint32 = 92 [packed = true]; + repeated uint64 repeated_uint64 = 93 [packed = true]; + repeated sint32 repeated_sint32 = 94 [packed = true]; + repeated sint64 repeated_sint64 = 95 [packed = true]; + repeated fixed32 repeated_fixed32 = 96 [packed = true]; + repeated fixed64 repeated_fixed64 = 97 [packed = true]; + repeated sfixed32 repeated_sfixed32 = 98 [packed = true]; + repeated sfixed64 repeated_sfixed64 = 99 [packed = true]; + repeated float repeated_float = 100 [packed = true]; + repeated double repeated_double = 101 [packed = true]; + repeated bool repeated_bool = 102 [packed = true]; + repeated TestEnum repeated_enum = 103 [packed = true]; +} + +// Need to be in sync with TestPackedMessage. +message TestUnpackedMessage { + repeated int32 repeated_int32 = 90 [packed = false]; + repeated int64 repeated_int64 = 91 [packed = false]; + repeated uint32 repeated_uint32 = 92 [packed = false]; + repeated uint64 repeated_uint64 = 93 [packed = false]; + repeated sint32 repeated_sint32 = 94 [packed = false]; + repeated sint64 repeated_sint64 = 95 [packed = false]; + repeated fixed32 repeated_fixed32 = 96 [packed = false]; + repeated fixed64 repeated_fixed64 = 97 [packed = false]; + repeated sfixed32 repeated_sfixed32 = 98 [packed = false]; + repeated sfixed64 repeated_sfixed64 = 99 [packed = false]; + repeated float repeated_float = 100 [packed = false]; + repeated double repeated_double = 101 [packed = false]; + repeated bool repeated_bool = 102 [packed = false]; + repeated TestEnum repeated_enum = 103 [packed = false]; +} diff --git a/php/tests/test.sh b/php/tests/test.sh new file mode 100755 index 00000000..f3f04a47 --- /dev/null +++ b/php/tests/test.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +# Compile protoc +pushd ../../ +./autogen.sh && ./configure && make +popd + +# Generate test file +../../src/protoc --php_out=. test.proto test_include.proto + +# Compile c extension +pushd ../ext/google/protobuf/ +make clean +set -e +phpize && ./configure --enable-debug CFLAGS='-g -O0' && make +popd + +tests=( array_test.php encode_decode_test.php generated_class_test.php map_field_test.php ) + +for t in "${tests[@]}" +do + echo "****************************" + echo "* $t" + echo "****************************" + php -dextension=../ext/google/protobuf/modules/protobuf.so `which phpunit` $t + echo "" +done + +# Make sure to run the memory test in debug mode. +php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php + +USE_ZEND_ALLOC=0 valgrind --leak-check=yes php -dextension=../ext/google/protobuf/modules/protobuf.so memory_leak_test.php diff --git a/php/tests/test_base.php b/php/tests/test_base.php new file mode 100644 index 00000000..25f18f74 --- /dev/null +++ b/php/tests/test_base.php @@ -0,0 +1,92 @@ +<?php + +use Foo\TestMessage; +use Foo\TestMessage_Sub; + +class TestBase extends PHPUnit_Framework_TestCase +{ + + public function setFields(TestMessage $m) + { + TestUtil::setTestMessage($m); + } + + public function expectFields(TestMessage $m) + { + $this->assertSame(-42, $m->getOptionalInt32()); + $this->assertSame(42, $m->getOptionalUint32()); + $this->assertSame(-43, $m->getOptionalInt64()); + $this->assertSame(43, $m->getOptionalUint64()); + $this->assertSame(-44, $m->getOptionalSint32()); + $this->assertSame(-45, $m->getOptionalSint64()); + $this->assertSame(46, $m->getOptionalFixed32()); + $this->assertSame(47, $m->getOptionalFixed64()); + $this->assertSame(-46, $m->getOptionalSfixed32()); + $this->assertSame(-47, $m->getOptionalSfixed64()); + $this->assertSame(1.5, $m->getOptionalFloat()); + $this->assertSame(1.6, $m->getOptionalDouble()); + $this->assertSame(true, $m->getOptionalBool()); + $this->assertSame('a', $m->getOptionalString()); + $this->assertSame('b', $m->getOptionalBytes()); + $this->assertSame(33, $m->getOptionalMessage()->getA()); + + $this->assertEquals(-42, $m->getRepeatedInt32()[0]); + $this->assertEquals(42, $m->getRepeatedUint32()[0]); + $this->assertEquals(-43, $m->getRepeatedInt64()[0]); + $this->assertEquals(43, $m->getRepeatedUint64()[0]); + $this->assertEquals(-44, $m->getRepeatedSint32()[0]); + $this->assertEquals(-45, $m->getRepeatedSint64()[0]); + $this->assertEquals(46, $m->getRepeatedFixed32()[0]); + $this->assertEquals(47, $m->getRepeatedFixed64()[0]); + $this->assertEquals(-46, $m->getRepeatedSfixed32()[0]); + $this->assertEquals(-47, $m->getRepeatedSfixed64()[0]); + $this->assertEquals(1.5, $m->getRepeatedFloat()[0]); + $this->assertEquals(1.6, $m->getRepeatedDouble()[0]); + $this->assertEquals(true, $m->getRepeatedBool()[0]); + $this->assertEquals('a', $m->getRepeatedString()[0]); + $this->assertEquals('b', $m->getRepeatedBytes()[0]); + $this->assertEquals(34, $m->getRepeatedMessage()[0]->GetA()); + + $this->assertEquals(-52, $m->getRepeatedInt32()[1]); + $this->assertEquals(52, $m->getRepeatedUint32()[1]); + $this->assertEquals(-53, $m->getRepeatedInt64()[1]); + $this->assertEquals(53, $m->getRepeatedUint64()[1]); + $this->assertEquals(-54, $m->getRepeatedSint32()[1]); + $this->assertEquals(-55, $m->getRepeatedSint64()[1]); + $this->assertEquals(56, $m->getRepeatedFixed32()[1]); + $this->assertEquals(57, $m->getRepeatedFixed64()[1]); + $this->assertEquals(-56, $m->getRepeatedSfixed32()[1]); + $this->assertEquals(-57, $m->getRepeatedSfixed64()[1]); + $this->assertEquals(2.5, $m->getRepeatedFloat()[1]); + $this->assertEquals(2.6, $m->getRepeatedDouble()[1]); + $this->assertEquals(false, $m->getRepeatedBool()[1]); + $this->assertEquals('c', $m->getRepeatedString()[1]); + $this->assertEquals('d', $m->getRepeatedBytes()[1]); + $this->assertEquals(35, $m->getRepeatedMessage()[1]->GetA()); + } + + public function expectEmptyFields(TestMessage $m) + { + $this->assertSame(0, $m->getOptionalInt32()); + $this->assertSame(0, $m->getOptionalUint32()); + $this->assertSame(0, $m->getOptionalInt64()); + $this->assertSame(0, $m->getOptionalUint64()); + $this->assertSame(0, $m->getOptionalSint32()); + $this->assertSame(0, $m->getOptionalSint64()); + $this->assertSame(0, $m->getOptionalFixed32()); + $this->assertSame(0, $m->getOptionalFixed64()); + $this->assertSame(0, $m->getOptionalSfixed32()); + $this->assertSame(0, $m->getOptionalSfixed64()); + $this->assertSame(0.0, $m->getOptionalFloat()); + $this->assertSame(0.0, $m->getOptionalDouble()); + $this->assertSame(false, $m->getOptionalBool()); + $this->assertSame('', $m->getOptionalString()); + $this->assertSame('', $m->getOptionalBytes()); + $this->assertNull($m->getOptionalMessage()); + } + + // This test is to avoid the warning of no test by php unit. + public function testNone() + { + } +} diff --git a/php/tests/test_include.proto b/php/tests/test_include.proto new file mode 100644 index 00000000..9844617f --- /dev/null +++ b/php/tests/test_include.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package bar; + +message TestInclude { + int32 a = 1; +} diff --git a/php/tests/test_util.php b/php/tests/test_util.php new file mode 100644 index 00000000..decd1a78 --- /dev/null +++ b/php/tests/test_util.php @@ -0,0 +1,393 @@ +<?php + +use Foo\TestEnum; +use Foo\TestMessage; +use Foo\TestMessage_Sub; +use Foo\TestPackedMessage; +use Foo\TestUnpackedMessage; + +define('MAX_FLOAT_DIFF', 0.000001); + +if (PHP_INT_SIZE == 8) { + define('MAX_INT_STRING', '9223372036854775807'); + define('MAX_INT_UPPER_STRING', '9223372036854775808'); +} else { + define('MAX_INT_STRING', '2147483647'); + define('MAX_INT_UPPER_STRING', '2147483648'); +} + +define('MAX_INT32', 2147483647); +define('MAX_INT32_FLOAT', 2147483647.0); +define('MAX_INT32_STRING', '2147483647'); + +define('MIN_INT32', -2147483648); +define('MIN_INT32_FLOAT', -2147483648.0); +define('MIN_INT32_STRING', '-2147483648'); + +define('MAX_UINT32', 4294967295); +define('MAX_UINT32_FLOAT', 4294967295.0); +define('MAX_UINT32_STRING', '4294967295'); + +define('MIN_UINT32', -2147483648); +define('MIN_UINT32_FLOAT', -2147483648.0); +define('MIN_UINT32_STRING', '-2147483648'); + +define('MAX_INT64', 9223372036854775807); +define('MAX_INT64_STRING', '9223372036854775807'); + +define('MIN_INT64_STRING', '-9223372036854775808'); +if (PHP_INT_SIZE === 8) { + define('MIN_INT64', -9223372036854775808); +} else { + define('MIN_INT64', MIN_INT64_STRING); +} + +define('MAX_UINT64_STRING', '-9223372036854775808'); +define('MAX_UINT64', MAX_UINT64_STRING); + +class TestUtil +{ + + public static function setTestMessage(TestMessage $m) + { + $m->setOptionalInt32(-42); + $m->setOptionalInt64(-43); + $m->setOptionalUint32(42); + $m->setOptionalUint64(43); + $m->setOptionalSint32(-44); + $m->setOptionalSint64(-45); + $m->setOptionalFixed32(46); + $m->setOptionalFixed64(47); + $m->setOptionalSfixed32(-46); + $m->setOptionalSfixed64(-47); + $m->setOptionalFloat(1.5); + $m->setOptionalDouble(1.6); + $m->setOptionalBool(true); + $m->setOptionalString('a'); + $m->setOptionalBytes('b'); + $m->setOptionalEnum(TestEnum::ONE); + $m->setOptionalMessage(new TestMessage_Sub()); + $m->getOptionalMessage()->SetA(33); + + $m->getRepeatedInt32() []= -42; + $m->getRepeatedInt64() []= -43; + $m->getRepeatedUint32() []= 42; + $m->getRepeatedUint64() []= 43; + $m->getRepeatedSint32() []= -44; + $m->getRepeatedSint64() []= -45; + $m->getRepeatedFixed32() []= 46; + $m->getRepeatedFixed64() []= 47; + $m->getRepeatedSfixed32() []= -46; + $m->getRepeatedSfixed64() []= -47; + $m->getRepeatedFloat() []= 1.5; + $m->getRepeatedDouble() []= 1.6; + $m->getRepeatedBool() []= true; + $m->getRepeatedString() []= 'a'; + $m->getRepeatedBytes() []= 'b'; + $m->getRepeatedEnum() []= TestEnum::ZERO; + $m->getRepeatedMessage() []= new TestMessage_Sub(); + $m->getRepeatedMessage()[0]->setA(34); + + $m->getRepeatedInt32() []= -52; + $m->getRepeatedInt64() []= -53; + $m->getRepeatedUint32() []= 52; + $m->getRepeatedUint64() []= 53; + $m->getRepeatedSint32() []= -54; + $m->getRepeatedSint64() []= -55; + $m->getRepeatedFixed32() []= 56; + $m->getRepeatedFixed64() []= 57; + $m->getRepeatedSfixed32() []= -56; + $m->getRepeatedSfixed64() []= -57; + $m->getRepeatedFloat() []= 2.5; + $m->getRepeatedDouble() []= 2.6; + $m->getRepeatedBool() []= false; + $m->getRepeatedString() []= 'c'; + $m->getRepeatedBytes() []= 'd'; + $m->getRepeatedEnum() []= TestEnum::ONE; + $m->getRepeatedMessage() []= new TestMessage_Sub(); + $m->getRepeatedMessage()[1]->SetA(35); + + $m->getMapInt32Int32()[-62] = -62; + $m->getMapInt64Int64()[-63] = -63; + $m->getMapUint32Uint32()[62] = 62; + $m->getMapUint64Uint64()[63] = 63; + $m->getMapSint32Sint32()[-64] = -64; + $m->getMapSint64Sint64()[-65] = -65; + $m->getMapFixed32Fixed32()[66] = 66; + $m->getMapFixed64Fixed64()[67] = 67; + $m->getMapInt32Float()[1] = 3.5; + $m->getMapInt32Double()[1] = 3.6; + $m->getMapBoolBool()[true] = true; + $m->getMapStringString()['e'] = 'e'; + $m->getMapInt32Bytes()[1] = 'f'; + $m->getMapInt32Enum()[1] = TestEnum::ONE; + $m->getMapInt32Message()[1] = new TestMessage_Sub(); + $m->getMapInt32Message()[1]->SetA(36); + } + + public static function assertTestMessage(TestMessage $m) + { + assert(-42 === $m->getOptionalInt32()); + assert(42 === $m->getOptionalUint32()); + assert(-43 === $m->getOptionalInt64()); + assert(43 === $m->getOptionalUint64()); + assert(-44 === $m->getOptionalSint32()); + assert(-45 === $m->getOptionalSint64()); + assert(46 === $m->getOptionalFixed32()); + assert(47 === $m->getOptionalFixed64()); + assert(-46 === $m->getOptionalSfixed32()); + assert(-47 === $m->getOptionalSfixed64()); + assert(1.5 === $m->getOptionalFloat()); + assert(1.6 === $m->getOptionalDouble()); + assert(true=== $m->getOptionalBool()); + assert('a' === $m->getOptionalString()); + assert('b' === $m->getOptionalBytes()); + assert(TestEnum::ONE === $m->getOptionalEnum()); + assert(33 === $m->getOptionalMessage()->getA()); + + assert(-42 === $m->getRepeatedInt32()[0]); + assert(42 === $m->getRepeatedUint32()[0]); + assert(-43 === $m->getRepeatedInt64()[0]); + assert(43 === $m->getRepeatedUint64()[0]); + assert(-44 === $m->getRepeatedSint32()[0]); + assert(-45 === $m->getRepeatedSint64()[0]); + assert(46 === $m->getRepeatedFixed32()[0]); + assert(47 === $m->getRepeatedFixed64()[0]); + assert(-46 === $m->getRepeatedSfixed32()[0]); + assert(-47 === $m->getRepeatedSfixed64()[0]); + assert(1.5 === $m->getRepeatedFloat()[0]); + assert(1.6 === $m->getRepeatedDouble()[0]); + assert(true=== $m->getRepeatedBool()[0]); + assert('a' === $m->getRepeatedString()[0]); + assert('b' === $m->getRepeatedBytes()[0]); + assert(TestEnum::ZERO === $m->getRepeatedEnum()[0]); + assert(34 === $m->getRepeatedMessage()[0]->getA()); + + assert(-52 === $m->getRepeatedInt32()[1]); + assert(52 === $m->getRepeatedUint32()[1]); + assert(-53 === $m->getRepeatedInt64()[1]); + assert(53 === $m->getRepeatedUint64()[1]); + assert(-54 === $m->getRepeatedSint32()[1]); + assert(-55 === $m->getRepeatedSint64()[1]); + assert(56 === $m->getRepeatedFixed32()[1]); + assert(57 === $m->getRepeatedFixed64()[1]); + assert(-56 === $m->getRepeatedSfixed32()[1]); + assert(-57 === $m->getRepeatedSfixed64()[1]); + assert(2.5 === $m->getRepeatedFloat()[1]); + assert(2.6 === $m->getRepeatedDouble()[1]); + assert(false === $m->getRepeatedBool()[1]); + assert('c' === $m->getRepeatedString()[1]); + assert('d' === $m->getRepeatedBytes()[1]); + assert(TestEnum::ONE === $m->getRepeatedEnum()[1]); + assert(35 === $m->getRepeatedMessage()[1]->getA()); + + assert(-62 === $m->getMapInt32Int32()[-62]); + assert(-63 === $m->getMapInt64Int64()[-63]); + assert(62 === $m->getMapUint32Uint32()[62]); + assert(63 === $m->getMapUint64Uint64()[63]); + assert(-64 === $m->getMapSint32Sint32()[-64]); + assert(-65 === $m->getMapSint64Sint64()[-65]); + assert(66 === $m->getMapFixed32Fixed32()[66]); + assert(67 === $m->getMapFixed64Fixed64()[67]); + assert(3.5 === $m->getMapInt32Float()[1]); + assert(3.6 === $m->getMapInt32Double()[1]); + assert(true === $m->getMapBoolBool()[true]); + assert('e' === $m->getMapStringString()['e']); + assert('f' === $m->getMapInt32Bytes()[1]); + assert(TestEnum::ONE === $m->getMapInt32Enum()[1]); + assert(36 === $m->getMapInt32Message()[1]->GetA()); + } + + public static function getGoldenTestMessage() + { + return hex2bin( + "08D6FFFFFF0F" . + "10D5FFFFFFFFFFFFFFFF01" . + "182A" . + "202B" . + "2857" . + "3059" . + "3D2E000000" . + "412F00000000000000" . + "4DD2FFFFFF" . + "51D1FFFFFFFFFFFFFF" . + "5D0000C03F" . + "619A9999999999F93F" . + "6801" . + "720161" . + "7A0162" . + "800101" . + "8A01020821" . + + "F801D6FFFFFF0F" . + "F801CCFFFFFF0F" . + "8002D5FFFFFFFFFFFFFFFF01" . + "8002CBFFFFFFFFFFFFFFFF01" . + "88022A" . + "880234" . + "90022B" . + "900235" . + "980257" . + "98026B" . + "A00259" . + "A0026D" . + "AD022E000000" . + "AD0238000000" . + "B1022F00000000000000" . + "B1023900000000000000" . + "BD02D2FFFFFF" . + "BD02C8FFFFFF" . + "C102D1FFFFFFFFFFFFFF" . + "C102C7FFFFFFFFFFFFFF" . + "CD020000C03F" . + "CD0200002040" . + "D1029A9999999999F93F" . + "D102CDCCCCCCCCCC0440" . + "D80201" . + "D80200" . + "E2020161" . + "E2020163" . + "EA020162" . + "EA020164" . + "F00200" . + "F00201" . + "FA02020822" . + "FA02020823" . + + "BA040C08C2FFFFFF0F10C2FFFFFF0F" . + "C2041608C1FFFFFFFFFFFFFFFF0110C1FFFFFFFFFFFFFFFF01" . + "CA0404083E103E" . + "D20404083F103F" . + "DA0404087f107F" . + "E20406088101108101" . + "EA040A0D420000001542000000" . + "F20412094300000000000000114300000000000000" . + "8A050708011500006040" . + "92050B080111CDCCCCCCCCCC0C40" . + "9A050408011001" . + "A205060a0165120165" . + "AA05050801120166" . + "B2050408011001" . + "Ba0506080112020824" + ); + } + + public static function setTestPackedMessage($m) + { + $m->getRepeatedInt32()[] = -42; + $m->getRepeatedInt32()[] = -52; + $m->getRepeatedInt64()[] = -43; + $m->getRepeatedInt64()[] = -53; + $m->getRepeatedUint32()[] = 42; + $m->getRepeatedUint32()[] = 52; + $m->getRepeatedUint64()[] = 43; + $m->getRepeatedUint64()[] = 53; + $m->getRepeatedSint32()[] = -44; + $m->getRepeatedSint32()[] = -54; + $m->getRepeatedSint64()[] = -45; + $m->getRepeatedSint64()[] = -55; + $m->getRepeatedFixed32()[] = 46; + $m->getRepeatedFixed32()[] = 56; + $m->getRepeatedFixed64()[] = 47; + $m->getRepeatedFixed64()[] = 57; + $m->getRepeatedSfixed32()[] = -46; + $m->getRepeatedSfixed32()[] = -56; + $m->getRepeatedSfixed64()[] = -47; + $m->getRepeatedSfixed64()[] = -57; + $m->getRepeatedFloat()[] = 1.5; + $m->getRepeatedFloat()[] = 2.5; + $m->getRepeatedDouble()[] = 1.6; + $m->getRepeatedDouble()[] = 2.6; + $m->getRepeatedBool()[] = true; + $m->getRepeatedBool()[] = false; + $m->getRepeatedEnum()[] = TestEnum::ONE; + $m->getRepeatedEnum()[] = TestEnum::ZERO; + } + + public static function assertTestPackedMessage($m) + { + assert(2 === count($m->getRepeatedInt32())); + assert(2 === count($m->getRepeatedInt64())); + assert(2 === count($m->getRepeatedUint32())); + assert(2 === count($m->getRepeatedUint64())); + assert(2 === count($m->getRepeatedSint32())); + assert(2 === count($m->getRepeatedSint64())); + assert(2 === count($m->getRepeatedFixed32())); + assert(2 === count($m->getRepeatedFixed64())); + assert(2 === count($m->getRepeatedSfixed32())); + assert(2 === count($m->getRepeatedSfixed64())); + assert(2 === count($m->getRepeatedFloat())); + assert(2 === count($m->getRepeatedDouble())); + assert(2 === count($m->getRepeatedBool())); + assert(2 === count($m->getRepeatedEnum())); + + assert(-42 === $m->getRepeatedInt32()[0]); + assert(-52 === $m->getRepeatedInt32()[1]); + assert(-43 === $m->getRepeatedInt64()[0]); + assert(-53 === $m->getRepeatedInt64()[1]); + assert(42 === $m->getRepeatedUint32()[0]); + assert(52 === $m->getRepeatedUint32()[1]); + assert(43 === $m->getRepeatedUint64()[0]); + assert(53 === $m->getRepeatedUint64()[1]); + assert(-44 === $m->getRepeatedSint32()[0]); + assert(-54 === $m->getRepeatedSint32()[1]); + assert(-45 === $m->getRepeatedSint64()[0]); + assert(-55 === $m->getRepeatedSint64()[1]); + assert(46 === $m->getRepeatedFixed32()[0]); + assert(56 === $m->getRepeatedFixed32()[1]); + assert(47 === $m->getRepeatedFixed64()[0]); + assert(57 === $m->getRepeatedFixed64()[1]); + assert(-46 === $m->getRepeatedSfixed32()[0]); + assert(-56 === $m->getRepeatedSfixed32()[1]); + assert(-47 === $m->getRepeatedSfixed64()[0]); + assert(-57 === $m->getRepeatedSfixed64()[1]); + assert(1.5 === $m->getRepeatedFloat()[0]); + assert(2.5 === $m->getRepeatedFloat()[1]); + assert(1.6 === $m->getRepeatedDouble()[0]); + assert(2.6 === $m->getRepeatedDouble()[1]); + assert(true === $m->getRepeatedBool()[0]); + assert(false === $m->getRepeatedBool()[1]); + assert(TestEnum::ONE === $m->getRepeatedEnum()[0]); + assert(TestEnum::ZERO === $m->getRepeatedEnum()[1]); + } + + public static function getGoldenTestPackedMessage() + { + return hex2bin( + "D2050AD6FFFFFF0FCCFFFFFF0F" . + "DA0514D5FFFFFFFFFFFFFFFF01CBFFFFFFFFFFFFFFFF01" . + "E205022A34" . + "EA05022B35" . + "F20502576B" . + "FA0502596D" . + "8206082E00000038000000" . + "8A06102F000000000000003900000000000000" . + "920608D2FFFFFFC8FFFFFF" . + "9A0610D1FFFFFFFFFFFFFFC7FFFFFFFFFFFFFF" . + "A206080000C03F00002040" . + "AA06109A9999999999F93FCDCCCCCCCCCC0440" . + "B206020100" . + "BA06020100" + ); + } + + public static function getGoldenTestUnpackedMessage() + { + return hex2bin( + "D005D6FFFFFF0FD005CCFFFFFF0F" . + "D805D5FFFFFFFFFFFFFFFF01D805CBFFFFFFFFFFFFFFFF01" . + "E0052AE00534" . + "E8052BE80535" . + "F00557F0056B" . + "F80559F8056D" . + "85062E000000850638000000" . + "89062F0000000000000089063900000000000000" . + "9506D2FFFFFF9506C8FFFFFF" . + "9906D1FFFFFFFFFFFFFF9906C7FFFFFFFFFFFFFF" . + "A5060000C03FA50600002040" . + "A9069A9999999999F93FA906CDCCCCCCCCCC0440" . + "B00601B00600" . + "B80601B80600" + ); + } +} |