• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<?php
2/*
3 *
4 * Copyright 2015 gRPC authors.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19require_once realpath(dirname(__FILE__).'/../../vendor/autoload.php');
20
21// The following includes are needed when using protobuf 3.1.0
22// and will suppress warnings when using protobuf 3.2.0+
23@include_once dirname(__FILE__).'/math.pb.php';
24@include_once dirname(__FILE__).'/math_grpc_pb.php';
25
26abstract class AbstractGeneratedCodeTest extends PHPUnit_Framework_TestCase
27{
28    /**
29     * These tests require that a server exporting the math service must be
30     * running on $GRPC_TEST_HOST.
31     */
32    protected static $client;
33
34    public function testWaitForNotReady()
35    {
36        $this->assertFalse(self::$client->waitForReady(1));
37    }
38
39    public function testWaitForReady()
40    {
41        $this->assertTrue(self::$client->waitForReady(250000));
42    }
43
44    public function testAlreadyReady()
45    {
46        $this->assertTrue(self::$client->waitForReady(250000));
47        $this->assertTrue(self::$client->waitForReady(100));
48    }
49
50    public function testGetTarget()
51    {
52        $this->assertTrue(is_string(self::$client->getTarget()));
53    }
54
55    /**
56     * @expectedException InvalidArgumentException
57     */
58    public function testClose()
59    {
60        self::$client->close();
61        $div_arg = new Math\DivArgs();
62        $call = self::$client->Div($div_arg);
63    }
64
65    /**
66     * @expectedException InvalidArgumentException
67     */
68    public function testInvalidMetadata()
69    {
70        $div_arg = new Math\DivArgs();
71        $call = self::$client->Div($div_arg, [' ' => 'abc123']);
72    }
73
74    public function testGetCallMetadata()
75    {
76        $div_arg = new Math\DivArgs();
77        $call = self::$client->Div($div_arg);
78        $this->assertTrue(is_array($call->getMetadata()));
79    }
80
81    public function testTimeout()
82    {
83        $div_arg = new Math\DivArgs();
84        $call = self::$client->Div($div_arg, [], ['timeout' => 1]);
85        list($response, $status) = $call->wait();
86        $this->assertSame(\Grpc\STATUS_DEADLINE_EXCEEDED, $status->code);
87    }
88
89    public function testCancel()
90    {
91        $div_arg = new Math\DivArgs();
92        $call = self::$client->Div($div_arg);
93        $call->cancel();
94        list($response, $status) = $call->wait();
95        $this->assertSame(\Grpc\STATUS_CANCELLED, $status->code);
96    }
97
98    public function testCallCredentialsCallback()
99    {
100        $div_arg = new Math\DivArgs();
101        $call = self::$client->Div($div_arg, array(), array(
102            'call_credentials_callback' => function ($context) {
103                return array();
104            },
105        ));
106        $call->cancel();
107        list($response, $status) = $call->wait();
108        $this->assertSame(\Grpc\STATUS_CANCELLED, $status->code);
109    }
110
111    public function testCallCredentialsCallback2()
112    {
113        $div_arg = new Math\DivArgs();
114        $call = self::$client->Div($div_arg);
115        $call_credentials = Grpc\CallCredentials::createFromPlugin(
116            function ($context) {
117                return array();
118            }
119        );
120        $call->setCallCredentials($call_credentials);
121        $call->cancel();
122        list($response, $status) = $call->wait();
123        $this->assertSame(\Grpc\STATUS_CANCELLED, $status->code);
124    }
125
126    /**
127     * @expectedException InvalidArgumentException
128     */
129    public function testInvalidMethodName()
130    {
131        $invalid_client = new DummyInvalidClient('host', [
132            'credentials' => Grpc\ChannelCredentials::createInsecure(),
133        ]);
134        $div_arg = new Math\DivArgs();
135        $invalid_client->InvalidUnaryCall($div_arg);
136    }
137
138    /**
139     * @expectedException Exception
140     */
141    public function testMissingCredentials()
142    {
143        $invalid_client = new DummyInvalidClient('host', [
144        ]);
145    }
146
147    public function testPrimaryUserAgentString()
148    {
149        $invalid_client = new DummyInvalidClient('host', [
150            'credentials' => Grpc\ChannelCredentials::createInsecure(),
151            'grpc.primary_user_agent' => 'testUserAgent',
152        ]);
153    }
154
155    public function testWriteFlags()
156    {
157        $div_arg = new Math\DivArgs();
158        $div_arg->setDividend(7);
159        $div_arg->setDivisor(4);
160        $call = self::$client->Div($div_arg, [],
161                                   ['flags' => Grpc\WRITE_NO_COMPRESS]);
162        $this->assertTrue(is_string($call->getPeer()));
163        list($response, $status) = $call->wait();
164        $this->assertSame(1, $response->getQuotient());
165        $this->assertSame(3, $response->getRemainder());
166        $this->assertSame(\Grpc\STATUS_OK, $status->code);
167    }
168
169    public function testWriteFlagsServerStreaming()
170    {
171        $fib_arg = new Math\FibArgs();
172        $fib_arg->setLimit(7);
173        $call = self::$client->Fib($fib_arg, [],
174                                   ['flags' => Grpc\WRITE_NO_COMPRESS]);
175        $result_array = iterator_to_array($call->responses());
176        $status = $call->getStatus();
177        $this->assertSame(\Grpc\STATUS_OK, $status->code);
178    }
179
180    public function testWriteFlagsClientStreaming()
181    {
182        $call = self::$client->Sum();
183        $num = new Math\Num();
184        $num->setNum(1);
185        $call->write($num, ['flags' => Grpc\WRITE_NO_COMPRESS]);
186        list($response, $status) = $call->wait();
187        $this->assertSame(\Grpc\STATUS_OK, $status->code);
188    }
189
190    public function testWriteFlagsBidiStreaming()
191    {
192        $call = self::$client->DivMany();
193        $div_arg = new Math\DivArgs();
194        $div_arg->setDividend(7);
195        $div_arg->setDivisor(4);
196        $call->write($div_arg, ['flags' => Grpc\WRITE_NO_COMPRESS]);
197        $response = $call->read();
198        $call->writesDone();
199        $status = $call->getStatus();
200        $this->assertSame(\Grpc\STATUS_OK, $status->code);
201    }
202
203    public function testSimpleRequest()
204    {
205        $div_arg = new Math\DivArgs();
206        $div_arg->setDividend(7);
207        $div_arg->setDivisor(4);
208        $call = self::$client->Div($div_arg);
209        $this->assertTrue(is_string($call->getPeer()));
210        list($response, $status) = $call->wait();
211        $this->assertSame(1, $response->getQuotient());
212        $this->assertSame(3, $response->getRemainder());
213        $this->assertSame(\Grpc\STATUS_OK, $status->code);
214    }
215
216    public function testServerStreaming()
217    {
218        $fib_arg = new Math\FibArgs();
219        $fib_arg->setLimit(7);
220        $call = self::$client->Fib($fib_arg);
221        $this->assertTrue(is_string($call->getPeer()));
222        $result_array = iterator_to_array($call->responses());
223        $extract_num = function ($num) {
224                         return $num->getNum();
225                       };
226        $values = array_map($extract_num, $result_array);
227        $this->assertSame([1, 1, 2, 3, 5, 8, 13], $values);
228        $status = $call->getStatus();
229        $this->assertSame(\Grpc\STATUS_OK, $status->code);
230    }
231
232    public function testClientStreaming()
233    {
234        $call = self::$client->Sum();
235        $this->assertTrue(is_string($call->getPeer()));
236        for ($i = 0; $i < 7; ++$i) {
237            $num = new Math\Num();
238            $num->setNum($i);
239            $call->write($num);
240        }
241        list($response, $status) = $call->wait();
242        $this->assertSame(21, $response->getNum());
243        $this->assertSame(\Grpc\STATUS_OK, $status->code);
244    }
245
246    public function testBidiStreaming()
247    {
248        $call = self::$client->DivMany();
249        $this->assertTrue(is_string($call->getPeer()));
250        for ($i = 0; $i < 7; ++$i) {
251            $div_arg = new Math\DivArgs();
252            $div_arg->setDividend(2 * $i + 1);
253            $div_arg->setDivisor(2);
254            $call->write($div_arg);
255            $response = $call->read();
256            $this->assertSame($i, $response->getQuotient());
257            $this->assertSame(1, $response->getRemainder());
258        }
259        $call->writesDone();
260        $status = $call->getStatus();
261        $this->assertSame(\Grpc\STATUS_OK, $status->code);
262    }
263}
264
265class DummyInvalidClient extends \Grpc\BaseStub
266{
267    public function InvalidUnaryCall(\Math\DivArgs $argument,
268                                     $metadata = [],
269                                     $options = [])
270    {
271        return $this->_simpleRequest('invalidMethodName',
272                                     $argument,
273                                     function () {},
274                                     $metadata,
275                                     $options);
276    }
277}
278