diff options
Diffstat (limited to 'php/tests')
-rwxr-xr-x | php/tests/autoload.php | 2 | ||||
-rw-r--r-- | php/tests/bootstrap_phpunit.php | 5 | ||||
-rwxr-xr-x | php/tests/compatibility_test.sh | 1 | ||||
-rw-r--r-- | php/tests/encode_decode_test.php | 27 | ||||
-rw-r--r-- | php/tests/memory_leak_test.php | 4 | ||||
-rw-r--r-- | php/tests/proto/test.proto | 2 | ||||
-rw-r--r-- | php/tests/well_known_test.php | 380 |
7 files changed, 418 insertions, 3 deletions
diff --git a/php/tests/autoload.php b/php/tests/autoload.php index 0a917fc5..b98b13ab 100755 --- a/php/tests/autoload.php +++ b/php/tests/autoload.php @@ -1,5 +1,7 @@ <?php +error_reporting(E_ALL); + function getGeneratedFiles($dir, &$results = array()) { $files = scandir($dir); diff --git a/php/tests/bootstrap_phpunit.php b/php/tests/bootstrap_phpunit.php new file mode 100644 index 00000000..8452f158 --- /dev/null +++ b/php/tests/bootstrap_phpunit.php @@ -0,0 +1,5 @@ +<?php + +require_once("vendor/autoload.php"); + +error_reporting(E_ALL); diff --git a/php/tests/compatibility_test.sh b/php/tests/compatibility_test.sh index 6f1e4900..7caa46e7 100755 --- a/php/tests/compatibility_test.sh +++ b/php/tests/compatibility_test.sh @@ -20,7 +20,6 @@ function generate_proto() { $PROTOC1 --php_out=generated proto/test_include.proto $PROTOC2 --php_out=generated proto/test.proto proto/test_no_namespace.proto proto/test_prefix.proto pushd ../../src - $PROTOC2 --php_out=../php/tests/generated google/protobuf/empty.proto $PROTOC2 --php_out=../php/tests/generated -I../php/tests -I. ../php/tests/proto/test_import_descriptor_proto.proto popd } diff --git a/php/tests/encode_decode_test.php b/php/tests/encode_decode_test.php index b43dffb4..4dca922b 100644 --- a/php/tests/encode_decode_test.php +++ b/php/tests/encode_decode_test.php @@ -441,6 +441,33 @@ class EncodeDecodeTest extends TestBase $m->mergeFromString(hex2bin('D205')); } + public function testUnknown() + { + $m = new TestMessage(); + $from = hex2bin('F80601'); + $m->mergeFromString($from); + $to = $m->serializeToString(); + $this->assertSame(bin2hex($from), bin2hex($to)); + + $m = new TestMessage(); + $from = hex2bin('F9060000000000000000'); + $m->mergeFromString($from); + $to = $m->serializeToString(); + $this->assertSame(bin2hex($from), bin2hex($to)); + + $m = new TestMessage(); + $from = hex2bin('FA0600'); + $m->mergeFromString($from); + $to = $m->serializeToString(); + $this->assertSame(bin2hex($from), bin2hex($to)); + + $m = new TestMessage(); + $from = hex2bin('FD0600000000'); + $m->mergeFromString($from); + $to = $m->serializeToString(); + $this->assertSame(bin2hex($from), bin2hex($to)); + } + public function testJsonEncode() { $from = new TestMessage(); diff --git a/php/tests/memory_leak_test.php b/php/tests/memory_leak_test.php index 7c3a1801..b76c8bff 100644 --- a/php/tests/memory_leak_test.php +++ b/php/tests/memory_leak_test.php @@ -101,6 +101,10 @@ $n = new TestMessage(); $n->mergeFromString($data); assert(1 === $n->getOneofMessage()->getA()); +$m = new TestMessage(); +$m->mergeFromString(hex2bin('F80601')); +assert('F80601', bin2hex($m->serializeToString())); + # $from = new TestMessage(); # $to = new TestMessage(); # TestUtil::setTestMessage($from); diff --git a/php/tests/proto/test.proto b/php/tests/proto/test.proto index 56cba446..d0109d83 100644 --- a/php/tests/proto/test.proto +++ b/php/tests/proto/test.proto @@ -115,6 +115,8 @@ message TestMessage { message Empty { int32 a = 1; } + + reserved 111; } enum TestEnum { diff --git a/php/tests/well_known_test.php b/php/tests/well_known_test.php index 0c2aec13..a7760685 100644 --- a/php/tests/well_known_test.php +++ b/php/tests/well_known_test.php @@ -1,10 +1,45 @@ <?php +require_once('test_base.php'); +require_once('test_util.php'); + +use Foo\TestMessage; +use Google\Protobuf\Any; +use Google\Protobuf\Api; +use Google\Protobuf\BoolValue; +use Google\Protobuf\BytesValue; +use Google\Protobuf\DoubleValue; +use Google\Protobuf\Duration; +use Google\Protobuf\Enum; +use Google\Protobuf\EnumValue; +use Google\Protobuf\Field; +use Google\Protobuf\FieldMask; +use Google\Protobuf\Field_Cardinality; +use Google\Protobuf\Field_Kind; +use Google\Protobuf\FloatValue; use Google\Protobuf\GPBEmpty; +use Google\Protobuf\Int32Value; +use Google\Protobuf\Int64Value; +use Google\Protobuf\ListValue; +use Google\Protobuf\Method; +use Google\Protobuf\Mixin; +use Google\Protobuf\NullValue; +use Google\Protobuf\Option; +use Google\Protobuf\SourceContext; +use Google\Protobuf\StringValue; +use Google\Protobuf\Struct; +use Google\Protobuf\Syntax; +use Google\Protobuf\Timestamp; +use Google\Protobuf\Type; +use Google\Protobuf\UInt32Value; +use Google\Protobuf\UInt64Value; +use Google\Protobuf\Value; + +class NotMessage {} -class WellKnownTest extends PHPUnit_Framework_TestCase { +class WellKnownTest extends TestBase { - public function testNone() + public function testEmpty() { $msg = new GPBEmpty(); } @@ -14,4 +49,345 @@ class WellKnownTest extends PHPUnit_Framework_TestCase { $msg = new TestImportDescriptorProto(); } + public function testAny() + { + // Create embed message + $embed = new TestMessage(); + $this->setFields($embed); + $data = $embed->serializeToString(); + + // Set any via normal setter. + $any = new Any(); + + $this->assertSame( + $any, $any->setTypeUrl("type.googleapis.com/foo.TestMessage")); + $this->assertSame("type.googleapis.com/foo.TestMessage", + $any->getTypeUrl()); + + $this->assertSame($any, $any->setValue($data)); + $this->assertSame($data, $any->getValue()); + + // Test unpack. + $msg = $any->unpack(); + $this->assertTrue($msg instanceof TestMessage); + $this->expectFields($msg); + + // Test pack. + $any = new Any(); + $any->pack($embed); + $this->assertSame($data, $any->getValue()); + $this->assertSame("type.googleapis.com/foo.TestMessage", $any->getTypeUrl()); + + // Test is. + $this->assertTrue($any->is(TestMessage::class)); + $this->assertFalse($any->is(Any::class)); + } + + /** + * @expectedException Exception + */ + public function testAnyUnpackInvalidTypeUrl() + { + $any = new Any(); + $any->setTypeUrl("invalid"); + $any->unpack(); + } + + /** + * @expectedException Exception + */ + public function testAnyUnpackMessageNotAdded() + { + $any = new Any(); + $any->setTypeUrl("type.googleapis.com/MessageNotAdded"); + $any->unpack(); + } + + /** + * @expectedException Exception + */ + public function testAnyUnpackDecodeError() + { + $any = new Any(); + $any->setTypeUrl("type.googleapis.com/foo.TestMessage"); + $any->setValue("abc"); + $any->unpack(); + } + + public function testApi() + { + $m = new Api(); + + $m->setName("a"); + $this->assertSame("a", $m->getName()); + + $m->setMethods([new Method()]); + $this->assertSame(1, count($m->getMethods())); + + $m->setOptions([new Option()]); + $this->assertSame(1, count($m->getOptions())); + + $m->setVersion("a"); + $this->assertSame("a", $m->getVersion()); + + $m->setSourceContext(new SourceContext()); + $this->assertFalse(is_null($m->getSourceContext())); + + $m->setMixins([new Mixin()]); + $this->assertSame(1, count($m->getMixins())); + + $m->setSyntax(Syntax::SYNTAX_PROTO2); + $this->assertSame(Syntax::SYNTAX_PROTO2, $m->getSyntax()); + + $m = new Method(); + + $m->setName("a"); + $this->assertSame("a", $m->getName()); + + $m->setRequestTypeUrl("a"); + $this->assertSame("a", $m->getRequestTypeUrl()); + + $m->setRequestStreaming(true); + $this->assertSame(true, $m->getRequestStreaming()); + + $m->setResponseTypeUrl("a"); + $this->assertSame("a", $m->getResponseTypeUrl()); + + $m->setResponseStreaming(true); + $this->assertSame(true, $m->getResponseStreaming()); + + $m->setOptions([new Option()]); + $this->assertSame(1, count($m->getOptions())); + + $m = new Mixin(); + + $m->setName("a"); + $this->assertSame("a", $m->getName()); + + $m->setRoot("a"); + $this->assertSame("a", $m->getRoot()); + } + + public function testEnum() + { + $m = new Enum(); + + $m->setName("a"); + $this->assertSame("a", $m->getName()); + + $m->setEnumvalue([new EnumValue()]); + $this->assertSame(1, count($m->getEnumvalue())); + + $m->setOptions([new Option()]); + $this->assertSame(1, count($m->getOptions())); + + $m->setSourceContext(new SourceContext()); + $this->assertFalse(is_null($m->getSourceContext())); + + $m->setSyntax(Syntax::SYNTAX_PROTO2); + $this->assertSame(Syntax::SYNTAX_PROTO2, $m->getSyntax()); + } + + public function testEnumValue() + { + $m = new EnumValue(); + + $m->setName("a"); + $this->assertSame("a", $m->getName()); + + $m->setNumber(1); + $this->assertSame(1, $m->getNumber()); + + $m->setOptions([new Option()]); + $this->assertSame(1, count($m->getOptions())); + } + + public function testField() + { + $m = new Field(); + + $m->setKind(Field_Kind::TYPE_DOUBLE); + $this->assertSame(Field_Kind::TYPE_DOUBLE, $m->getKind()); + + $m->setCardinality(Field_Cardinality::CARDINALITY_OPTIONAL); + $this->assertSame(Field_Cardinality::CARDINALITY_OPTIONAL, $m->getCardinality()); + + $m->setNumber(1); + $this->assertSame(1, $m->getNumber()); + + $m->setName("a"); + $this->assertSame("a", $m->getName()); + + $m->setTypeUrl("a"); + $this->assertSame("a", $m->getTypeUrl()); + + $m->setOneofIndex(1); + $this->assertSame(1, $m->getOneofIndex()); + + $m->setPacked(true); + $this->assertSame(true, $m->getPacked()); + + $m->setOptions([new Option()]); + $this->assertSame(1, count($m->getOptions())); + + $m->setJsonName("a"); + $this->assertSame("a", $m->getJsonName()); + + $m->setDefaultValue("a"); + $this->assertSame("a", $m->getDefaultValue()); + } + + public function testFieldMask() + { + $m = new FieldMask(); + $m->setPaths(["a"]); + $this->assertSame(1, count($m->getPaths())); + } + + public function testOption() + { + $m = new Option(); + + $m->setName("a"); + $this->assertSame("a", $m->getName()); + + $m->setValue(new Any()); + $this->assertFalse(is_null($m->getValue())); + } + + public function testSourceContext() + { + $m = new SourceContext(); + $m->setFileName("a"); + $this->assertSame("a", $m->getFileName()); + } + + public function testStruct() + { + $m = new ListValue(); + $m->setValues([new Value()]); + $this->assertSame(1, count($m->getValues())); + + $m = new Value(); + + $m->setNullValue(NullValue::NULL_VALUE); + $this->assertSame(NullValue::NULL_VALUE, $m->getNullValue()); + $this->assertSame("null_value", $m->getKind()); + + $m->setNumberValue(1.0); + $this->assertSame(1.0, $m->getNumberValue()); + $this->assertSame("number_value", $m->getKind()); + + $m->setStringValue("a"); + $this->assertSame("a", $m->getStringValue()); + $this->assertSame("string_value", $m->getKind()); + + $m->setBoolValue(true); + $this->assertSame(true, $m->getBoolValue()); + $this->assertSame("bool_value", $m->getKind()); + + $m->setStructValue(new Struct()); + $this->assertFalse(is_null($m->getStructValue())); + $this->assertSame("struct_value", $m->getKind()); + + $m->setListValue(new ListValue()); + $this->assertFalse(is_null($m->getListValue())); + $this->assertSame("list_value", $m->getKind()); + + $m = new Struct(); + $m->setFields(array("a"=>new Value())); + $this->assertSame(1, count($m->getFields())); + } + + public function testTimestamp() + { + $timestamp = new Timestamp(); + + $timestamp->setSeconds(1); + $timestamp->setNanos(2); + $this->assertEquals(1, $timestamp->getSeconds()); + $this->assertSame(2, $timestamp->getNanos()); + + date_default_timezone_set('UTC'); + $from = new DateTime('2011-01-01T15:03:01.012345UTC'); + $timestamp->fromDateTime($from); + $this->assertEquals($from->format('U'), $timestamp->getSeconds()); + $this->assertSame(0, $timestamp->getNanos()); + + $to = $timestamp->toDateTime(); + $this->assertSame(\DateTime::class, get_class($to)); + $this->assertSame($from->format('U'), $to->format('U')); + } + + public function testType() + { + $m = new Type(); + + $m->setName("a"); + $this->assertSame("a", $m->getName()); + + $m->setFields([new Field()]); + $this->assertSame(1, count($m->getFields())); + + $m->setOneofs(["a"]); + $this->assertSame(1, count($m->getOneofs())); + + $m->setOptions([new Option()]); + $this->assertSame(1, count($m->getOptions())); + + $m->setSourceContext(new SourceContext()); + $this->assertFalse(is_null($m->getSourceContext())); + + $m->setSyntax(Syntax::SYNTAX_PROTO2); + $this->assertSame(Syntax::SYNTAX_PROTO2, $m->getSyntax()); + } + + public function testDuration() + { + $duration = new Duration(); + + $duration->setSeconds(1); + $duration->setNanos(2); + $this->assertEquals(1, $duration->getSeconds()); + $this->assertSame(2, $duration->getNanos()); + } + + public function testWrappers() + { + $m = new DoubleValue(); + $m->setValue(1.0); + $this->assertSame(1.0, $m->getValue()); + + $m = new FloatValue(); + $m->setValue(1.0); + $this->assertSame(1.0, $m->getValue()); + + $m = new Int64Value(); + $m->setValue(1); + $this->assertEquals(1, $m->getValue()); + + $m = new UInt64Value(); + $m->setValue(1); + $this->assertEquals(1, $m->getValue()); + + $m = new Int32Value(); + $m->setValue(1); + $this->assertSame(1, $m->getValue()); + + $m = new UInt32Value(); + $m->setValue(1); + $this->assertSame(1, $m->getValue()); + + $m = new BoolValue(); + $m->setValue(true); + $this->assertSame(true, $m->getValue()); + + $m = new StringValue(); + $m->setValue("a"); + $this->assertSame("a", $m->getValue()); + + $m = new BytesValue(); + $m->setValue("a"); + $this->assertSame("a", $m->getValue()); + } } |