The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
234 lines
7.0 KiB
234 lines
7.0 KiB
<?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( |
|
'/phony_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 |
|
{ |
|
private $server; |
|
private $port; |
|
|
|
public function setUp(): void |
|
{ |
|
$this->server = new Grpc\Server([]); |
|
$this->port = $this->server->addHttp2Port('0.0.0.0:0'); |
|
$this->server->start(); |
|
} |
|
|
|
public function tearDown(): void |
|
{ |
|
unset($this->server); |
|
} |
|
|
|
public function testCreateDefaultCallInvoker() |
|
{ |
|
$call_invoker = new \Grpc\DefaultCallInvoker(); |
|
$this->assertNotNull($call_invoker); |
|
} |
|
|
|
public function testCreateCallInvoker() |
|
{ |
|
$call_invoker = new CallInvokerUpdateChannel(); |
|
$this->assertNotNull($call_invoker); |
|
} |
|
|
|
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('/phony_method', $event->method); |
|
$server_call = $event->call; |
|
$event = $server_call->startBatch([ |
|
Grpc\OP_RECV_MESSAGE => true, |
|
]); |
|
$this->assertSame('intercepted_unary_request', $event->message); |
|
$event = $server_call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => [], |
|
'code' => Grpc\STATUS_OK, |
|
'details' => '', |
|
], |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
$call_invoker->getChannel()->close(); |
|
unset($unary_call); |
|
unset($server_call); |
|
} |
|
}
|
|
|