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