xref: /aosp_15_r20/external/protobuf/php/tests/memory_leak_test.php (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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