1<?php 2 3# phpunit has memory leak by itself. Thus, it cannot be used to test memory leak. 4 5class HasDestructor 6{ 7 function __construct() { 8 $this->foo = $this; 9 } 10 11 function __destruct() { 12 new Foo\TestMessage(); 13 } 14} 15 16require_once('../vendor/autoload.php'); 17require_once('test_util.php'); 18 19$has_destructor = new HasDestructor(); 20 21use Google\Protobuf\Internal\RepeatedField; 22use Google\Protobuf\Internal\GPBType; 23use Foo\TestAny; 24use Foo\TestMessage; 25use Foo\TestMessage\Sub; 26 27$from = new TestMessage(); 28TestUtil::setTestMessage($from); 29TestUtil::assertTestMessage($from); 30 31$data = $from->serializeToString(); 32 33$to = new TestMessage(); 34$to->mergeFromString($data); 35 36TestUtil::assertTestMessage($to); 37 38$from = new TestMessage(); 39TestUtil::setTestMessage2($from); 40 41$data = $from->serializeToString(); 42 43$to->mergeFromString($data); 44 45// TODO(teboring): This causes following tests fail in php7. 46# $from->setRecursive($from); 47 48$arr = new RepeatedField(GPBType::MESSAGE, TestMessage::class); 49$arr[] = new TestMessage; 50$arr[0]->SetRepeatedRecursive($arr); 51 52// Test oneof fields. 53$m = new TestMessage(); 54 55$m->setOneofInt32(1); 56assert(1 === $m->getOneofInt32()); 57assert(0.0 === $m->getOneofFloat()); 58assert('' === $m->getOneofString()); 59assert(NULL === $m->getOneofMessage()); 60$data = $m->serializeToString(); 61$n = new TestMessage(); 62$n->mergeFromString($data); 63assert(1 === $n->getOneofInt32()); 64 65$m->setOneofFloat(2.0); 66assert(0 === $m->getOneofInt32()); 67assert(2.0 === $m->getOneofFloat()); 68assert('' === $m->getOneofString()); 69assert(NULL === $m->getOneofMessage()); 70$data = $m->serializeToString(); 71$n = new TestMessage(); 72$n->mergeFromString($data); 73assert(2.0 === $n->getOneofFloat()); 74 75$m->setOneofString('abc'); 76assert(0 === $m->getOneofInt32()); 77assert(0.0 === $m->getOneofFloat()); 78assert('abc' === $m->getOneofString()); 79assert(NULL === $m->getOneofMessage()); 80$data = $m->serializeToString(); 81$n = new TestMessage(); 82$n->mergeFromString($data); 83assert('abc' === $n->getOneofString()); 84 85$sub_m = new Sub(); 86$sub_m->setA(1); 87$m->setOneofMessage($sub_m); 88assert(0 === $m->getOneofInt32()); 89assert(0.0 === $m->getOneofFloat()); 90assert('' === $m->getOneofString()); 91assert(1 === $m->getOneofMessage()->getA()); 92$data = $m->serializeToString(); 93$n = new TestMessage(); 94$n->mergeFromString($data); 95assert(1 === $n->getOneofMessage()->getA()); 96 97$m = new TestMessage(); 98$m->mergeFromString(hex2bin('F80601')); 99assert('f80601' === bin2hex($m->serializeToString())); 100 101// Test create repeated field via array. 102$str_arr = array("abc"); 103$m = new TestMessage(); 104$m->setRepeatedString($str_arr); 105 106// Test create map field via array. 107$str_arr = array("abc"=>"abc"); 108$m = new TestMessage(); 109$m->setMapStringString($str_arr); 110 111// Test unset 112$from = new TestMessage(); 113TestUtil::setTestMessage($from); 114unset($from); 115 116// Test wellknown 117$from = new \Google\Protobuf\Timestamp(); 118$from->setSeconds(1); 119assert(1, $from->getSeconds()); 120 121$timestamp = new \Google\Protobuf\Timestamp(); 122 123date_default_timezone_set('UTC'); 124$from = new DateTime('2011-01-01T15:03:01.012345UTC'); 125$timestamp->fromDateTime($from); 126assert($from->format('U') == $timestamp->getSeconds()); 127assert(1000 * $from->format('u') == $timestamp->getNanos()); 128 129$to = $timestamp->toDateTime(); 130assert(\DateTime::class == get_class($to)); 131assert($from->format('U') == $to->format('U')); 132 133$from = new \Google\Protobuf\Value(); 134$from->setNumberValue(1); 135assert(1, $from->getNumberValue()); 136 137// Test discard unknown in message. 138$m = new TestMessage(); 139$from = hex2bin('F80601'); 140$m->mergeFromString($from); 141$m->discardUnknownFields(); 142$to = $m->serializeToString(); 143assert("" === bin2hex($to)); 144 145// Test clear 146$m = new TestMessage(); 147TestUtil::setTestMessage($m); 148$m->clear(); 149 150// Test unset map element 151$m = new TestMessage(); 152$map = $m->getMapStringString(); 153$map[1] = 1; 154unset($map[1]); 155 156// Test descriptor 157$pool = \Google\Protobuf\DescriptorPool::getGeneratedPool(); 158$desc = $pool->getDescriptorByClassName("\Foo\TestMessage"); 159$field = $desc->getField(1); 160 161$from = new TestMessage(); 162$to = new TestMessage(); 163TestUtil::setTestMessage($from); 164$to->mergeFrom($from); 165TestUtil::assertTestMessage($to); 166 167// Test decode Any 168// Make sure packed message has been created at least once. 169$packed = new TestMessage(); 170 171$m = new TestAny(); 172$m->mergeFromJsonString( 173 "{\"any\":" . 174 " {\"@type\":\"type.googleapis.com/foo.TestMessage\"," . 175 " \"optionalInt32\":1}}"); 176assert("type.googleapis.com/foo.TestMessage" === 177 $m->getAny()->getTypeUrl()); 178assert("0801" === bin2hex($m->getAny()->getValue())); 179