| <?php |
| /* |
| * |
| * Copyright 2018 gRPC authors. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| * |
| */ |
| /** |
| * Interface exported by the server. |
| */ |
| require_once(dirname(__FILE__).'/../../lib/Grpc/BaseStub.php'); |
| require_once(dirname(__FILE__).'/../../lib/Grpc/AbstractCall.php'); |
| require_once(dirname(__FILE__).'/../../lib/Grpc/UnaryCall.php'); |
| require_once(dirname(__FILE__).'/../../lib/Grpc/ClientStreamingCall.php'); |
| require_once(dirname(__FILE__).'/../../lib/Grpc/Interceptor.php'); |
| require_once(dirname(__FILE__).'/../../lib/Grpc/CallInvoker.php'); |
| require_once(dirname(__FILE__).'/../../lib/Grpc/DefaultCallInvoker.php'); |
| require_once(dirname(__FILE__).'/../../lib/Grpc/Internal/InterceptorChannel.php'); |
| |
| class CallInvokerSimpleRequest |
| { |
| private $data; |
| public function __construct($data) |
| { |
| $this->data = $data; |
| } |
| public function setData($data) |
| { |
| $this->data = $data; |
| } |
| public function serializeToString() |
| { |
| return $this->data; |
| } |
| } |
| |
| class CallInvokerClient extends Grpc\BaseStub |
| { |
| |
| /** |
| * @param string $hostname hostname |
| * @param array $opts channel options |
| * @param Channel|InterceptorChannel $channel (optional) re-use channel object |
| */ |
| public function __construct($hostname, $opts, $channel = null) |
| { |
| parent::__construct($hostname, $opts, $channel); |
| } |
| |
| /** |
| * A simple RPC. |
| * @param SimpleRequest $argument input argument |
| * @param array $metadata metadata |
| * @param array $options call options |
| */ |
| public function UnaryCall( |
| CallInvokerSimpleRequest $argument, |
| $metadata = [], |
| $options = [] |
| ) { |
| return $this->_simpleRequest( |
| '/dummy_method', |
| $argument, |
| [], |
| $metadata, |
| $options |
| ); |
| } |
| } |
| |
| class CallInvokerUpdateChannel implements \Grpc\CallInvoker |
| { |
| private $channel; |
| |
| public function getChannel() { |
| return $this->channel; |
| } |
| |
| public function createChannelFactory($hostname, $opts) { |
| $this->channel = new \Grpc\Channel('localhost:50050', $opts); |
| return $this->channel; |
| } |
| |
| public function UnaryCall($channel, $method, $deserialize, $options) { |
| return new UnaryCall($channel, $method, $deserialize, $options); |
| } |
| |
| public function ClientStreamingCall($channel, $method, $deserialize, $options) { |
| return new ClientStreamingCall($channel, $method, $deserialize, $options); |
| } |
| |
| public function ServerStreamingCall($channel, $method, $deserialize, $options) { |
| return new ServerStreamingCall($channel, $method, $deserialize, $options); |
| } |
| |
| public function BidiStreamingCall($channel, $method, $deserialize, $options) { |
| return new BidiStreamingCall($channel, $method, $deserialize, $options); |
| } |
| } |
| |
| |
| class CallInvokerChangeRequest implements \Grpc\CallInvoker |
| { |
| private $channel; |
| |
| public function getChannel() { |
| return $this->channel; |
| } |
| public function createChannelFactory($hostname, $opts) { |
| $this->channel = new \Grpc\Channel($hostname, $opts); |
| return $this->channel; |
| } |
| |
| public function UnaryCall($channel, $method, $deserialize, $options) { |
| return new CallInvokerChangeRequestCall($channel, $method, $deserialize, $options); |
| } |
| |
| public function ClientStreamingCall($channel, $method, $deserialize, $options) { |
| return new ClientStreamingCall($channel, $method, $deserialize, $options); |
| } |
| |
| public function ServerStreamingCall($channel, $method, $deserialize, $options) { |
| return new ServerStreamingCall($channel, $method, $deserialize, $options); |
| } |
| |
| public function BidiStreamingCall($channel, $method, $deserialize, $options) { |
| return new BidiStreamingCall($channel, $method, $deserialize, $options); |
| } |
| } |
| |
| class CallInvokerChangeRequestCall |
| { |
| private $call; |
| |
| public function __construct($channel, $method, $deserialize, $options) |
| { |
| $this->call = new \Grpc\UnaryCall($channel, $method, $deserialize, $options); |
| } |
| |
| public function start($argument, $metadata, $options) { |
| $argument->setData('intercepted_unary_request'); |
| $this->call->start($argument, $metadata, $options); |
| } |
| |
| public function wait() |
| { |
| return $this->call->wait(); |
| } |
| } |
| |
| class CallInvokerTest extends PHPUnit_Framework_TestCase |
| { |
| public function setUp() |
| { |
| $this->server = new Grpc\Server([]); |
| $this->port = $this->server->addHttp2Port('0.0.0.0:0'); |
| $this->server->start(); |
| } |
| |
| public function tearDown() |
| { |
| unset($this->server); |
| } |
| |
| public function testCreateDefaultCallInvoker() |
| { |
| $call_invoker = new \Grpc\DefaultCallInvoker(); |
| } |
| |
| public function testCreateCallInvoker() |
| { |
| $call_invoker = new CallInvokerUpdateChannel(); |
| } |
| |
| public function testCallInvokerAccessChannel() |
| { |
| $call_invoker = new CallInvokerUpdateChannel(); |
| $stub = new \Grpc\BaseStub('localhost:50051', |
| ['credentials' => \Grpc\ChannelCredentials::createInsecure(), |
| 'grpc_call_invoker' => $call_invoker]); |
| $this->assertEquals($call_invoker->getChannel()->getTarget(), 'localhost:50050'); |
| $call_invoker->getChannel()->close(); |
| } |
| |
| public function testClientChangeRequestCallInvoker() |
| { |
| $req_text = 'client_request'; |
| $call_invoker = new CallInvokerChangeRequest(); |
| $client = new CallInvokerClient('localhost:'.$this->port, [ |
| 'force_new' => true, |
| 'credentials' => Grpc\ChannelCredentials::createInsecure(), |
| 'grpc_call_invoker' => $call_invoker, |
| ]); |
| |
| $req = new CallInvokerSimpleRequest($req_text); |
| $unary_call = $client->UnaryCall($req); |
| |
| $event = $this->server->requestCall(); |
| $this->assertSame('/dummy_method', $event->method); |
| $server_call = $event->call; |
| $event = $server_call->startBatch([ |
| Grpc\OP_SEND_INITIAL_METADATA => [], |
| Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
| 'metadata' => [], |
| 'code' => Grpc\STATUS_OK, |
| 'details' => '', |
| ], |
| Grpc\OP_RECV_MESSAGE => true, |
| Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
| ]); |
| $this->assertSame('intercepted_unary_request', $event->message); |
| $call_invoker->getChannel()->close(); |
| unset($unary_call); |
| unset($server_call); |
| } |
| } |