The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
2310 lines
66 KiB
2310 lines
66 KiB
<?php |
|
/* |
|
* |
|
* Copyright 2015 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. |
|
* |
|
*/ |
|
|
|
//==============Channel Test==================== |
|
|
|
function callbackFunc($context) |
|
{ |
|
return []; |
|
} |
|
|
|
function callbackFunc2($context) |
|
{ |
|
return ["k1" => "v1"]; |
|
} |
|
|
|
function assertConnecting($state) |
|
{ |
|
assert(($state == GRPC\CHANNEL_CONNECTING || $state == GRPC\CHANNEL_TRANSIENT_FAILURE) == true); |
|
} |
|
|
|
function waitUntilNotIdle($channel) { |
|
for ($i = 0; $i < 10; $i++) { |
|
$now = Grpc\Timeval::now(); |
|
$deadline = $now->add(new Grpc\Timeval(10000)); |
|
if ($channel->watchConnectivityState(GRPC\CHANNEL_IDLE, |
|
$deadline)) { |
|
return true; |
|
} |
|
} |
|
assert(true == false); |
|
} |
|
|
|
// Set up |
|
$channel = new Grpc\Channel('localhost:0', ['credentials' => Grpc\ChannelCredentials::createInsecure()]); |
|
|
|
// Test InsecureCredentials |
|
assert('Grpc\Channel' == get_class($channel)); |
|
|
|
// Test ConnectivityState |
|
$state = $channel->getConnectivityState(); |
|
assert(0 == $state); |
|
|
|
// Test GetConnectivityStateWithInt |
|
$state = $channel->getConnectivityState(123); |
|
assert(0 == $state); |
|
|
|
// Test GetConnectivityStateWithString |
|
$state = $channel->getConnectivityState('hello'); |
|
assert(0 == $state); |
|
|
|
// Test GetConnectivityStateWithBool |
|
$state = $channel->getConnectivityState(true); |
|
assert(0 == $state); |
|
|
|
$channel->close(); |
|
|
|
// Test GetTarget |
|
$channel = new Grpc\Channel('localhost:8888', ['credentials' => Grpc\ChannelCredentials::createInsecure()]); |
|
$target = $channel->getTarget(); |
|
assert(is_string($target) == true); |
|
$channel->close(); |
|
|
|
// Test WatchConnectivityState |
|
$channel = new Grpc\Channel('localhost:0', ['credentials' => Grpc\ChannelCredentials::createInsecure()]); |
|
$now = Grpc\Timeval::now(); |
|
$deadline = $now->add(new Grpc\Timeval(100*1000)); |
|
|
|
$state = $channel->watchConnectivityState(1, $deadline); |
|
assert($state == true); |
|
|
|
unset($now); |
|
unset($deadline); |
|
|
|
$channel->close(); |
|
|
|
// Test InvalidConstructorWithNull |
|
try { |
|
$channel = new Grpc\Channel(); |
|
assert($channel == NULL); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
|
|
// Test InvalidConstructorWith |
|
try { |
|
$channel = new Grpc\Channel('localhost:0', 'invalid'); |
|
assert($channel == NULL); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
|
|
// Test InvalideCredentials |
|
try { |
|
$channel = new Grpc\Channel('localhost:0', ['credentials' => new Grpc\Timeval(100)]); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
|
|
// Test InvalidOptionsArrray |
|
try { |
|
$channel = new Grpc\Channel('localhost:0', ['abc' => []]); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
|
|
// Test InvalidGetConnectivityStateWithArray |
|
$channel = new Grpc\Channel('localhost:0', ['credentials' => Grpc\ChannelCredentials::createInsecure()]); |
|
try { |
|
$channel->getConnectivityState([]); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
|
|
// Test InvalidWatchConnectivityState |
|
try { |
|
$channel->watchConnectivityState([]); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
|
|
// Test InvalidWatchConnectivityState2 |
|
try { |
|
$channel->watchConnectivityState(1, 'hi'); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
|
|
$channel->close(); |
|
|
|
// Test PersistentChannelSameHost |
|
$channel1 = new Grpc\Channel('localhost:1', []); |
|
$channel2 = new Grpc\Channel('localhost:1', []); |
|
$state = $channel1->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assertConnecting($state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelDifferentHost |
|
$channel1 = new Grpc\Channel('localhost:1', ["grpc_target_persist_bound" => 3,]); |
|
$channel2 = new Grpc\Channel('localhost:2', []); |
|
$state = $channel1->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelSameArgs |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 3, |
|
"abc" => "def", |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', ["abc" => "def"]); |
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assertConnecting($state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelDifferentArgs |
|
$channel1 = new Grpc\Channel('localhost:1', []); |
|
$channel2 = new Grpc\Channel('localhost:1', ["abc" => "def"]); |
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelSameChannelCredentials |
|
$creds1 = Grpc\ChannelCredentials::createSsl(); |
|
$creds2 = Grpc\ChannelCredentials::createSsl(); |
|
|
|
$channel1 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds1, |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds2]); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
print "state: ".$state."......................"; |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assertConnecting($state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelDifferentChannelCredentials |
|
$creds1 = Grpc\ChannelCredentials::createSsl(); |
|
$creds2 = Grpc\ChannelCredentials::createSsl( |
|
file_get_contents(dirname(__FILE__).'/../data/ca.pem')); |
|
|
|
$channel1 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds1, |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds2]); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
|
|
// Test PersistentChannelSameChannelCredentialsRootCerts |
|
$creds1 = Grpc\ChannelCredentials::createSsl( |
|
file_get_contents(dirname(__FILE__).'/../data/ca.pem')); |
|
$creds2 = Grpc\ChannelCredentials::createSsl( |
|
file_get_contents(dirname(__FILE__).'/../data/ca.pem')); |
|
|
|
$channel1 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds1, |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds2]); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assertConnecting($state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelDifferentSecureChannelCredentials |
|
$creds1 = Grpc\ChannelCredentials::createSsl(); |
|
$creds2 = Grpc\ChannelCredentials::createInsecure(); |
|
|
|
$channel1 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds1, |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds2]); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelSharedChannelClose1 |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', []); |
|
|
|
$channel1->close(); |
|
|
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelSharedChannelClose2 |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', []); |
|
|
|
$channel1->close(); |
|
|
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
try{ |
|
$state = $channel1->getConnectivityState(); |
|
} |
|
catch(\Exception $e){ |
|
} |
|
|
|
$channel2->close(); |
|
|
|
//Test PersistentChannelCreateAfterClose |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
|
|
$channel1->close(); |
|
|
|
$channel2 = new Grpc\Channel('localhost:1', []); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel2->close(); |
|
|
|
//Test PersistentChannelSharedMoreThanTwo |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', []); |
|
$channel3 = new Grpc\Channel('localhost:1', []); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel3->getConnectivityState(); |
|
assertConnecting($state); |
|
|
|
$channel1->close(); |
|
|
|
//Test PersistentChannelWithCallCredentials |
|
$creds = Grpc\ChannelCredentials::createSsl(); |
|
$callCreds = Grpc\CallCredentials::createFromPlugin( |
|
'callbackFunc'); |
|
$credsWithCallCreds = Grpc\ChannelCredentials::createComposite( |
|
$creds, $callCreds); |
|
|
|
$channel1 = new Grpc\Channel('localhost:1', |
|
["credentials" => |
|
$credsWithCallCreds, |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["credentials" => |
|
$credsWithCallCreds]); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelWithDifferentCallCredentials |
|
$callCreds1 = Grpc\CallCredentials::createFromPlugin('callbackFunc'); |
|
$callCreds2 = Grpc\CallCredentials::createFromPlugin('callbackFunc2'); |
|
|
|
$creds1 = Grpc\ChannelCredentials::createSsl(); |
|
$creds2 = Grpc\ChannelCredentials::createComposite( |
|
$creds1, $callCreds1); |
|
$creds3 = Grpc\ChannelCredentials::createComposite( |
|
$creds1, $callCreds2); |
|
|
|
$channel1 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds1, |
|
"grpc_target_persist_bound" => 3, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds2]); |
|
$channel3 = new Grpc\Channel('localhost:1', |
|
["credentials" => $creds3]); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
$state = $channel3->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
$channel3->close(); |
|
|
|
// Test PersistentChannelForceNew |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 2, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["force_new" => true]); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelForceNewOldChannelIdle1 |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 2, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["force_new" => true]); |
|
$channel3 = new Grpc\Channel('localhost:1', []); |
|
|
|
$state = $channel2->getConnectivityState(true); |
|
waitUntilNotIdle($channel2); |
|
$state = $channel1->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
$state = $channel2->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel3->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelForceNewOldChannelIdle2 |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 2, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', []); |
|
|
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel2); |
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
$state = $channel2->getConnectivityState(); |
|
assertConnecting($state); |
|
|
|
$channel1->close(); |
|
$channel2->close(); |
|
|
|
// Test PersistentChannelForceNewOldChannelClose1 |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 2, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["force_new" => true]); |
|
$channel3 = new Grpc\Channel('localhost:1', []); |
|
|
|
$channel1->close(); |
|
|
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
$state = $channel3->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
$channel2->close(); |
|
$channel3->close(); |
|
|
|
// Test PersistentChannelForceNewOldChannelClose2 |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 2, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["force_new" => true]); |
|
// channel3 shares with channel1 |
|
$channel3 = new Grpc\Channel('localhost:1', []); |
|
|
|
$channel1->close(); |
|
|
|
$state = $channel2->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
// channel3 is still usable |
|
$state = $channel3->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
// channel 1 is closed |
|
try{ |
|
$channel1->getConnectivityState(); |
|
} |
|
catch(\Exception $e){ |
|
} |
|
|
|
$channel2->close(); |
|
$channel3->close(); |
|
|
|
// Test PersistentChannelForceNewNewChannelClose |
|
$channel1 = new Grpc\Channel('localhost:1', [ |
|
"grpc_target_persist_bound" => 2, |
|
]); |
|
$channel2 = new Grpc\Channel('localhost:1', |
|
["force_new" => true]); |
|
$channel3 = new Grpc\Channel('localhost:1', []); |
|
|
|
$channel2->close(); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assert(GRPC\CHANNEL_IDLE == $state); |
|
|
|
// can still connect on channel1 |
|
$state = $channel1->getConnectivityState(true); |
|
waitUntilNotIdle($channel1); |
|
|
|
$state = $channel1->getConnectivityState(); |
|
assertConnecting($state); |
|
|
|
$channel1->close(); |
|
|
|
//============== Call Test ==================== |
|
$server = new Grpc\Server([]); |
|
$port = $server->addHttp2Port('0.0.0.0:53000'); |
|
$channel = new Grpc\Channel('localhost:'.$port, []); |
|
$call = new Grpc\Call($channel, |
|
'/foo', |
|
Grpc\Timeval::infFuture()); |
|
|
|
// Test AddEmptyMetadata |
|
$batch = [ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
]; |
|
$result = $call->startBatch($batch); |
|
assert($result->send_metadata == true); |
|
|
|
// Test testAddSingleMetadata |
|
$batch = [ |
|
Grpc\OP_SEND_INITIAL_METADATA => ['key' => ['value']], |
|
]; |
|
$call = new Grpc\Call($channel, |
|
'/foo', |
|
Grpc\Timeval::infFuture()); |
|
$result = $call->startBatch($batch); |
|
assert($result->send_metadata == true); |
|
|
|
// Test AddMultiValue |
|
$batch = [ |
|
Grpc\OP_SEND_INITIAL_METADATA => ['key' => ['value1', 'value2']], |
|
]; |
|
$call = new Grpc\Call($channel, |
|
'/foo', |
|
Grpc\Timeval::infFuture()); |
|
$result = $call->startBatch($batch); |
|
assert($result->send_metadata == true); |
|
|
|
// Test AddSingleAndMultiValueMetadata |
|
$batch = [ |
|
Grpc\OP_SEND_INITIAL_METADATA => ['key1' => ['value1'], |
|
'key2' => ['value2', |
|
'value3', ], ], |
|
]; |
|
$call = new Grpc\Call($channel, |
|
'/foo', |
|
Grpc\Timeval::infFuture()); |
|
$result = $call->startBatch($batch); |
|
assert($result->send_metadata == true); |
|
|
|
// Test AddMultiAndMultiValueMetadata |
|
$batch = [ |
|
Grpc\OP_SEND_INITIAL_METADATA => ['key1' => ['value1'], |
|
'key2' => ['value2', |
|
'value3', ], ], |
|
]; |
|
$call = new Grpc\Call($channel, |
|
'/foo', |
|
Grpc\Timeval::infFuture()); |
|
$result = $call->startBatch($batch); |
|
assert($result->send_metadata == true); |
|
|
|
// Test GetPeer |
|
assert(is_string($call->getPeer()) == true); |
|
|
|
// Test Cancel |
|
assert($call->cancel == NULL); |
|
|
|
// Test InvalidStartBatchKey |
|
$batch = [ |
|
'invalid' => ['key1' => 'value1'], |
|
]; |
|
try{ |
|
$result = $call->startBatch($batch); |
|
} |
|
catch(\Exception $e){ |
|
} |
|
|
|
// Test InvalideMetadataStrKey |
|
$batch = [ |
|
Grpc\OP_SEND_INITIAL_METADATA => ['Key' => ['value1', 'value2']], |
|
]; |
|
$call = new Grpc\Call($channel, |
|
'/foo', |
|
Grpc\Timeval::infFuture()); |
|
try{ |
|
$result = $call->startBatch($batch); |
|
} |
|
catch(\Exception $e){ |
|
} |
|
|
|
// Test InvalidMetadataIntKey |
|
$batch = [ |
|
Grpc\OP_SEND_INITIAL_METADATA => [1 => ['value1', 'value2']], |
|
]; |
|
$call = new Grpc\Call($channel, |
|
'/foo', |
|
Grpc\Timeval::infFuture()); |
|
try{ |
|
$result = $call->startBatch($batch); |
|
} |
|
catch(\Exception $e){ |
|
} |
|
|
|
// Test InvalidMetadataInnerValue |
|
$batch = [ |
|
Grpc\OP_SEND_INITIAL_METADATA => ['key1' => 'value1'], |
|
]; |
|
$call = new Grpc\Call($channel, |
|
'/foo', |
|
Grpc\Timeval::infFuture()); |
|
try{ |
|
$result = $call->startBatch($batch); |
|
} |
|
catch(\Exception $e){ |
|
} |
|
|
|
// Test InvalidConstuctor |
|
try { |
|
$call = new Grpc\Call(); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidConstuctor2 |
|
try { |
|
$call = new Grpc\Call('hi', 'hi', 'hi'); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidSetCredentials |
|
try{ |
|
$call->setCredentials('hi'); |
|
} |
|
catch(\Exception $e){ |
|
} |
|
|
|
// Test InvalidSetCredentials2 |
|
try { |
|
$call->setCredentials([]); |
|
} catch (\Exception $e) {} |
|
|
|
|
|
//============== CallCredentials Test 2 ==================== |
|
// Set Up |
|
$credentials = Grpc\ChannelCredentials::createSsl( |
|
file_get_contents(dirname(__FILE__).'/../data/ca.pem')); |
|
$server_credentials = Grpc\ServerCredentials::createSsl( |
|
null, |
|
file_get_contents(dirname(__FILE__).'/../data/server1.key'), |
|
file_get_contents(dirname(__FILE__).'/../data/server1.pem')); |
|
$server = new Grpc\Server(); |
|
$port = $server->addSecureHttp2Port('0.0.0.0:0', |
|
$server_credentials); |
|
$server->start(); |
|
$host_override = 'foo.test.google.fr'; |
|
$channel = new Grpc\Channel( |
|
'localhost:'.$port, |
|
[ |
|
'grpc.ssl_target_name_override' => $host_override, |
|
'grpc.default_authority' => $host_override, |
|
'credentials' => $credentials, |
|
] |
|
); |
|
function callCredscallbackFunc($context) |
|
{ |
|
is_string($context->service_url); |
|
is_string($context->method_name); |
|
return ['k1' => ['v1'], 'k2' => ['v2']]; |
|
} |
|
|
|
// Test CreateFromPlugin |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$status_text = 'xyz'; |
|
$call = new Grpc\Call($channel, |
|
'/abc/dummy_method', |
|
$deadline, |
|
$host_override); |
|
$call_credentials = Grpc\CallCredentials::createFromPlugin( |
|
'callCredscallbackFunc'); |
|
$call->setCredentials($call_credentials); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
|
|
$event = $server->requestCall(); |
|
assert(is_array($event->metadata) == true); |
|
|
|
$metadata = $event->metadata; |
|
assert(array_key_exists('k1', $metadata) == true); |
|
assert(array_key_exists('k2', $metadata) == true); |
|
assert($metadata['k1'] == ['v1']); |
|
assert($metadata['k2'] == ['v2']); |
|
assert('/abc/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' => $status_text, |
|
], |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_status == true); |
|
assert($event->cancelled == false); |
|
|
|
$event = $call->startBatch([ |
|
Grpc\OP_RECV_INITIAL_METADATA => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
assert([] == $event->metadata); |
|
|
|
$status = $event->status; |
|
assert([] == $status->metadata); |
|
assert(Grpc\STATUS_OK == $status->code); |
|
assert($status_text == $status->details); |
|
|
|
unset($call); |
|
unset($server_call); |
|
|
|
function invalidKeyCallbackFunc($context) |
|
{ |
|
is_string($context->service_url); |
|
is_string($context->method_name); |
|
return ['K1' => ['v1']]; |
|
} |
|
|
|
// Test CallbackWithInvalidKey |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$status_text = 'xyz'; |
|
$call = new Grpc\Call($channel, |
|
'/abc/dummy_method', |
|
$deadline, |
|
$host_override); |
|
$call_credentials = Grpc\CallCredentials::createFromPlugin( |
|
'invalidKeyCallbackFunc'); |
|
$call->setCredentials($call_credentials); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
assert(($event->status->code == Grpc\STATUS_UNAVAILABLE) == true); |
|
|
|
function invalidReturnCallbackFunc($context) |
|
{ |
|
is_string($context->service_url); |
|
is_string($context->method_name); |
|
return 'a string'; |
|
} |
|
|
|
// Test CallbackWithInvalidReturnValue |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$status_text = 'xyz'; |
|
$call = new Grpc\Call($channel, |
|
'/abc/dummy_method', |
|
$deadline, |
|
$host_override); |
|
$call_credentials = Grpc\CallCredentials::createFromPlugin( |
|
'invalidReturnCallbackFunc'); |
|
$call->setCredentials($call_credentials); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
|
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
assert(($event->status->code == Grpc\STATUS_UNAVAILABLE) == true); |
|
|
|
unset($channel); |
|
unset($server); |
|
|
|
//============== CallCredentials Test ==================== |
|
//Set Up |
|
$credentials = Grpc\ChannelCredentials::createSsl( |
|
file_get_contents(dirname(__FILE__).'/../data/ca.pem')); |
|
$call_credentials = Grpc\CallCredentials::createFromPlugin('callbackFunc'); |
|
$credentials = Grpc\ChannelCredentials::createComposite( |
|
$credentials, |
|
$call_credentials |
|
); |
|
$server_credentials = Grpc\ServerCredentials::createSsl( |
|
null, |
|
file_get_contents(dirname(__FILE__).'/../data/server1.key'), |
|
file_get_contents(dirname(__FILE__).'/../data/server1.pem')); |
|
$server = new Grpc\Server(); |
|
$port = $server->addSecureHttp2Port('0.0.0.0:0', |
|
$server_credentials); |
|
$server->start(); |
|
$host_override = 'foo.test.google.fr'; |
|
$channel = new Grpc\Channel( |
|
'localhost:'.$port, |
|
[ |
|
'grpc.ssl_target_name_override' => $host_override, |
|
'grpc.default_authority' => $host_override, |
|
'credentials' => $credentials, |
|
] |
|
); |
|
|
|
// Test CreateComposite |
|
$call_credentials2 = Grpc\CallCredentials::createFromPlugin('callbackFunc'); |
|
$call_credentials3 = Grpc\CallCredentials::createComposite( |
|
$call_credentials, |
|
$call_credentials2 |
|
); |
|
assert('Grpc\CallCredentials' == get_class($call_credentials3)); |
|
|
|
// Test CreateFromPluginInvalidParam |
|
try{ |
|
$call_credentials = Grpc\CallCredentials::createFromPlugin( |
|
'callbackFunc' |
|
); |
|
} |
|
catch(\Exception $e){} |
|
|
|
// Test CreateCompositeInvalidParam |
|
try{ |
|
$call_credentials3 = Grpc\CallCredentials::createComposite( |
|
$call_credentials, |
|
$credentials |
|
); |
|
} |
|
catch(\Exception $e){} |
|
|
|
unset($channel); |
|
unset($server); |
|
|
|
|
|
//============== EndToEnd Test ==================== |
|
// Set Up |
|
$server = new Grpc\Server([]); |
|
$port = $server->addHttp2Port('0.0.0.0:0'); |
|
$channel = new Grpc\Channel('localhost:'.$port, []); |
|
$server->start(); |
|
|
|
// Test SimpleRequestBody |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$status_text = 'xyz'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
|
|
$event = $server->requestCall(); |
|
assert('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' => $status_text, |
|
], |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_status == true); |
|
assert($event->cancelled == false) |
|
; |
|
$event = $call->startBatch([ |
|
Grpc\OP_RECV_INITIAL_METADATA => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
$status = $event->status; |
|
assert([] == $status->metadata); |
|
assert(Grpc\STATUS_OK == $status->code); |
|
assert($status_text == $status->details); |
|
|
|
unset($call); |
|
unset($server_call); |
|
|
|
// Test MessageWriteFlags |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'message_write_flags_test'; |
|
$status_text = 'xyz'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text, |
|
'flags' => Grpc\WRITE_NO_COMPRESS, ], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
|
|
$event = $server->requestCall(); |
|
assert('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' => $status_text, |
|
], |
|
]); |
|
$event = $call->startBatch([ |
|
Grpc\OP_RECV_INITIAL_METADATA => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
$status = $event->status; |
|
|
|
assert([] == $status->metadata); |
|
assert(Grpc\STATUS_OK == $status->code); |
|
assert($status_text == $status->details); |
|
|
|
unset($call); |
|
unset($server_call); |
|
|
|
// Test ClientServerFullRequestResponse |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text], |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
assert($event->send_message == true); |
|
|
|
$event = $server->requestCall(); |
|
assert('dummy_method' == $event->method); |
|
$server_call = $event->call; |
|
|
|
$event = $server_call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $reply_text], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => [], |
|
'code' => Grpc\STATUS_OK, |
|
'details' => $status_text, |
|
], |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_status == true); |
|
assert($event->send_message == true); |
|
assert($event->cancelled == false); |
|
assert($req_text == $event->message); |
|
|
|
$event = $call->startBatch([ |
|
Grpc\OP_RECV_INITIAL_METADATA => true, |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
assert([] == $event->metadata); |
|
assert($reply_text == $event->message); |
|
$status = $event->status; |
|
assert([] == $status->metadata); |
|
assert(Grpc\STATUS_OK == $status->code); |
|
assert($status_text == $status->details); |
|
|
|
unset($call); |
|
unset($server_call); |
|
|
|
// Test InvalidClientMessageArray |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
try { |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => 'invalid', |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidClientMessageString |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
try{ |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => 0], |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidClientMessageFlags |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
try{ |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => 'abc', |
|
'flags' => 'invalid', |
|
], |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidServerStatusMetadata |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text], |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
assert($event->send_message == true); |
|
|
|
$event = $server->requestCall(); |
|
assert('dummy_method' == $event->method); |
|
$server_call = $event->call; |
|
try { |
|
$event = $server_call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $reply_text], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => 'invalid', |
|
'code' => Grpc\STATUS_OK, |
|
'details' => $status_text, |
|
], |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidServerStatusCode |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text], |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
assert($event->send_message == true); |
|
|
|
$event = $server->requestCall(); |
|
assert('dummy_method' == $event->method); |
|
$server_call = $event->call; |
|
try { |
|
$event = $server_call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $reply_text], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => [], |
|
'code' => 'invalid', |
|
'details' => $status_text, |
|
], |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test MissingServerStatusCode |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text], |
|
]); |
|
$event = $server->requestCall(); |
|
$server_call = $event->call; |
|
try { |
|
$event = $server_call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $reply_text], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => [], |
|
'details' => $status_text, |
|
], |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidServerStatusDetails |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text], |
|
]); |
|
$event = $server->requestCall(); |
|
$server_call = $event->call; |
|
try { |
|
$event = $server_call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $reply_text], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => [], |
|
'code' => Grpc\STATUS_OK, |
|
'details' => 0, |
|
], |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test MissingServerStatusDetails |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text], |
|
]); |
|
$event = $server->requestCall(); |
|
$server_call = $event->call; |
|
try { |
|
$event = $server_call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $reply_text], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => [], |
|
'code' => Grpc\STATUS_OK, |
|
], |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidStartBatchKey |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
try { |
|
$event = $call->startBatch([ |
|
9999999 => [], |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test InvalidStartBatch |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline); |
|
try { |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => [], |
|
'code' => Grpc\STATUS_OK, |
|
'details' => 'abc', |
|
], |
|
]); |
|
} catch (\Exception $e) {} |
|
|
|
// Test GetTarget |
|
assert(is_string($channel->getTarget()) == true); |
|
|
|
// Test GetConnectivityState |
|
assert(($channel->getConnectivityState() == |
|
Grpc\CHANNEL_IDLE) == true); |
|
|
|
// Test WatchConnectivityStateFailed |
|
$idle_state = $channel->getConnectivityState(); |
|
assert(($idle_state == Grpc\CHANNEL_IDLE) == true); |
|
|
|
$now = Grpc\Timeval::now(); |
|
$delta = new Grpc\Timeval(50000); // should timeout |
|
$deadline = $now->add($delta); |
|
assert($channel->watchConnectivityState( |
|
$idle_state, $deadline) == false); |
|
|
|
// Test WatchConnectivityStateSuccess() |
|
$idle_state = $channel->getConnectivityState(true); |
|
assert(($idle_state == Grpc\CHANNEL_IDLE) == true); |
|
|
|
$now = Grpc\Timeval::now(); |
|
$delta = new Grpc\Timeval(3000000); // should finish well before |
|
$deadline = $now->add($delta); |
|
$new_state = $channel->getConnectivityState(); |
|
assert($new_state != $idle_state); |
|
|
|
// Test WatchConnectivityStateDoNothing |
|
$idle_state = $channel->getConnectivityState(); |
|
$now = Grpc\Timeval::now(); |
|
$delta = new Grpc\Timeval(50000); |
|
$deadline = $now->add($delta); |
|
assert(!$channel->watchConnectivityState( |
|
$idle_state, $deadline)); |
|
|
|
$new_state = $channel->getConnectivityState(); |
|
assert($new_state == Grpc\CHANNEL_IDLE); |
|
|
|
// Test GetConnectivityStateInvalidParam |
|
try { |
|
$channel->getConnectivityState(new Grpc\Timeval()); |
|
} catch (\Exception $e) {} |
|
// Test WatchConnectivityStateInvalidParam |
|
try { |
|
$channel->watchConnectivityState(0, 1000); |
|
} catch (\Exception $e) {} |
|
// Test ChannelConstructorInvalidParam |
|
try { |
|
$channel = new Grpc\Channel('localhost:'.$port, null); |
|
} catch (\Exception $e) {} |
|
// testClose() |
|
$channel->close(); |
|
|
|
|
|
//============== SecureEndToEnd Test ==================== |
|
// Set Up |
|
|
|
$credentials = Grpc\ChannelCredentials::createSsl( |
|
file_get_contents(dirname(__FILE__).'/../data/ca.pem')); |
|
$server_credentials = Grpc\ServerCredentials::createSsl( |
|
null, |
|
file_get_contents(dirname(__FILE__).'/../data/server1.key'), |
|
file_get_contents(dirname(__FILE__).'/../data/server1.pem')); |
|
$server = new Grpc\Server(); |
|
$port = $server->addSecureHttp2Port('0.0.0.0:0', |
|
$server_credentials); |
|
$server->start(); |
|
$host_override = 'foo.test.google.fr'; |
|
$channel = new Grpc\Channel( |
|
'localhost:'.$port, |
|
[ |
|
'grpc.ssl_target_name_override' => $host_override, |
|
'grpc.default_authority' => $host_override, |
|
'credentials' => $credentials, |
|
] |
|
); |
|
|
|
// Test SimpleRequestBody |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$status_text = 'xyz'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline, |
|
$host_override); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
|
|
$event = $server->requestCall(); |
|
assert('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' => $status_text, |
|
], |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_status == true); |
|
assert($event->cancelled == false); |
|
|
|
$event = $call->startBatch([ |
|
Grpc\OP_RECV_INITIAL_METADATA => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
assert([] == $event->metadata); |
|
$status = $event->status; |
|
assert([] == $status->metadata); |
|
assert(Grpc\STATUS_OK == $status->code); |
|
assert($status_text == $status->details); |
|
|
|
unset($call); |
|
unset($server_call); |
|
|
|
// Test MessageWriteFlags |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'message_write_flags_test'; |
|
$status_text = 'xyz'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline, |
|
$host_override); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text, |
|
'flags' => Grpc\WRITE_NO_COMPRESS, ], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
|
|
$event = $server->requestCall(); |
|
assert('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' => $status_text, |
|
], |
|
]); |
|
$event = $call->startBatch([ |
|
Grpc\OP_RECV_INITIAL_METADATA => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
assert([] == $event->metadata); |
|
$status = $event->status; |
|
assert([] == $status->metadata); |
|
assert(Grpc\STATUS_OK == $status->code); |
|
assert($status_text == $status->details);unset($call); |
|
|
|
unset($call); |
|
unset($server_call); |
|
|
|
// Test ClientServerFullRequestResponse |
|
$deadline = Grpc\Timeval::infFuture(); |
|
$req_text = 'client_server_full_request_response'; |
|
$reply_text = 'reply:client_server_full_request_response'; |
|
$status_text = 'status:client_server_full_response_text'; |
|
$call = new Grpc\Call($channel, |
|
'dummy_method', |
|
$deadline, |
|
$host_override); |
|
$event = $call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
Grpc\OP_SEND_MESSAGE => ['message' => $req_text], |
|
]); |
|
assert($event->send_metadata == true); |
|
assert($event->send_close == true); |
|
assert($event->send_message == true); |
|
|
|
$event = $server->requestCall(); |
|
assert('dummy_method' == $event->method); |
|
|
|
$server_call = $event->call; |
|
$event = $server_call->startBatch([ |
|
Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_MESSAGE => ['message' => $reply_text], |
|
Grpc\OP_SEND_STATUS_FROM_SERVER => [ |
|
'metadata' => [], |
|
'code' => Grpc\STATUS_OK, |
|
'details' => $status_text, |
|
], |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_CLOSE_ON_SERVER => true, |
|
]); |
|
assert($event->send_metadata); |
|
assert($event->send_status); |
|
assert($event->send_message); |
|
assert(!$event->cancelled); |
|
assert($req_text == $event->message); |
|
|
|
$event = $call->startBatch([ |
|
Grpc\OP_RECV_INITIAL_METADATA => true, |
|
Grpc\OP_RECV_MESSAGE => true, |
|
Grpc\OP_RECV_STATUS_ON_CLIENT => true, |
|
]); |
|
assert([] == $event->metadata); |
|
assert($reply_text == $event->message); |
|
$status = $event->status; |
|
assert([] == $status->metadata); |
|
assert(Grpc\STATUS_OK == $status->code); |
|
assert($status_text == $status->details); |
|
|
|
unset($call); |
|
unset($server_call); |
|
|
|
$channel->close(); |
|
|
|
|
|
//============== Timeval Test ==================== |
|
// Test ConstructorWithInt |
|
$time = new Grpc\Timeval(1234); |
|
assert($time != NULL); |
|
assert('Grpc\Timeval' == get_class($time)); |
|
|
|
// Test ConstructorWithNegative |
|
$time = new Grpc\Timeval(-123); |
|
assert($time != NULL); |
|
assert('Grpc\Timeval' == get_class($time)); |
|
|
|
// Test ConstructorWithZero |
|
$time = new Grpc\Timeval(0); |
|
assert($time != NULL); |
|
assert('Grpc\Timeval' == get_class($time)); |
|
|
|
// Test ConstructorWithOct |
|
$time = new Grpc\Timeval(0123); |
|
assert($time != NULL); |
|
assert('Grpc\Timeval' == get_class($time)); |
|
|
|
// Test ConstructorWithHex |
|
$time = new Grpc\Timeval(0x1A); |
|
assert($time != NULL); |
|
assert('Grpc\Timeval' == get_class($time)); |
|
|
|
// Test ConstructorWithFloat |
|
$time = new Grpc\Timeval(123.456); |
|
assert($time != NULL); |
|
assert('Grpc\Timeval' == get_class($time)); |
|
|
|
// Test CompareSame |
|
$zero = Grpc\Timeval::zero(); |
|
assert(0 == Grpc\Timeval::compare($zero, $zero)); |
|
|
|
// Test PastIsLessThanZero |
|
$zero = Grpc\Timeval::zero(); |
|
$past = Grpc\Timeval::infPast(); |
|
assert(0 > Grpc\Timeval::compare($past, $zero)); |
|
assert(0 < Grpc\Timeval::compare($zero, $past)); |
|
|
|
// Test FutureIsGreaterThanZero |
|
$zero = Grpc\Timeval::zero(); |
|
$future = Grpc\Timeval::infFuture(); |
|
assert(0 > Grpc\Timeval::compare($zero, $future)); |
|
assert(0 < Grpc\Timeval::compare($future, $zero)); |
|
|
|
// Test NowIsBetweenZeroAndFuture |
|
$zero = Grpc\Timeval::zero(); |
|
$future = Grpc\Timeval::infFuture(); |
|
$now = Grpc\Timeval::now(); |
|
assert(0 > Grpc\Timeval::compare($zero, $now)); |
|
assert(0 > Grpc\Timeval::compare($now, $future)); |
|
|
|
// Test NowAndAdd |
|
$now = Grpc\Timeval::now(); |
|
assert($now != NULL); |
|
$delta = new Grpc\Timeval(1000); |
|
$deadline = $now->add($delta); |
|
assert(0 < Grpc\Timeval::compare($deadline, $now)); |
|
|
|
// Test NowAndSubtract |
|
$now = Grpc\Timeval::now(); |
|
$delta = new Grpc\Timeval(1000); |
|
$deadline = $now->subtract($delta); |
|
assert(0 > Grpc\Timeval::compare($deadline, $now)); |
|
|
|
// Test AddAndSubtract |
|
$now = Grpc\Timeval::now(); |
|
$delta = new Grpc\Timeval(1000); |
|
$deadline = $now->add($delta); |
|
$back_to_now = $deadline->subtract($delta); |
|
assert(0 == Grpc\Timeval::compare($back_to_now, $now)); |
|
|
|
// Test Similar |
|
$a = Grpc\Timeval::now(); |
|
$delta = new Grpc\Timeval(1000); |
|
$b = $a->add($delta); |
|
$thresh = new Grpc\Timeval(1100); |
|
assert(Grpc\Timeval::similar($a, $b, $thresh)); |
|
$thresh = new Grpc\Timeval(900); |
|
assert(!Grpc\Timeval::similar($a, $b, $thresh)); |
|
|
|
// Test SleepUntil |
|
$curr_microtime = microtime(true); |
|
$now = Grpc\Timeval::now(); |
|
$delta = new Grpc\Timeval(1000); |
|
$deadline = $now->add($delta); |
|
$deadline->sleepUntil(); |
|
$done_microtime = microtime(true); |
|
assert(($done_microtime - $curr_microtime) > 0.0009); |
|
|
|
// Test ConstructorInvalidParam |
|
try { |
|
$delta = new Grpc\Timeval('abc'); |
|
} catch (\Exception $e) {} |
|
// Test AddInvalidParam |
|
$a = Grpc\Timeval::now(); |
|
try { |
|
$a->add(1000); |
|
} catch (\Exception $e) {} |
|
// Test SubtractInvalidParam |
|
$a = Grpc\Timeval::now(); |
|
try { |
|
$a->subtract(1000); |
|
} catch (\Exception $e) {} |
|
// Test CompareInvalidParam |
|
try { |
|
$a = Grpc\Timeval::compare(1000, 1100); |
|
} catch (\Exception $e) {} |
|
// Test SimilarInvalidParam |
|
try { |
|
$a = Grpc\Timeval::similar(1000, 1100, 1200); |
|
} catch (\Exception $e) {} |
|
unset($time); |
|
|
|
//============== Server Test ==================== |
|
//Set Up |
|
$server = NULL; |
|
|
|
// Test ConstructorWithNull |
|
$server = new Grpc\Server(); |
|
assert($server != NULL); |
|
|
|
// Test ConstructorWithNullArray |
|
$server = new Grpc\Server([]); |
|
assert($server != NULL); |
|
|
|
// Test ConstructorWithArray |
|
$server = new Grpc\Server(['ip' => '127.0.0.1', |
|
'port' => '8080', ]); |
|
assert($server != NULL); |
|
|
|
// Test RequestCall |
|
$server = new Grpc\Server(); |
|
$port = $server->addHttp2Port('0.0.0.0:0'); |
|
$server->start(); |
|
$channel = new Grpc\Channel('localhost:'.$port, |
|
[ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure() |
|
]); |
|
|
|
$deadline = Grpc\Timeval::infFuture(); |
|
$call = new Grpc\Call($channel, 'dummy_method', $deadline); |
|
|
|
$event = $call->startBatch([Grpc\OP_SEND_INITIAL_METADATA => [], |
|
Grpc\OP_SEND_CLOSE_FROM_CLIENT => true, |
|
]); |
|
|
|
$c = $server->requestCall(); |
|
assert('dummy_method' == $c->method); |
|
assert(is_string($c->host)); |
|
|
|
unset($call); |
|
unset($channel); |
|
|
|
// Test InvalidConstructorWithNumKeyOfArray |
|
try{ |
|
$server = new Grpc\Server([10 => '127.0.0.1', |
|
20 => '8080', ]); |
|
} |
|
catch(\Exception $e){} |
|
|
|
// Test Invalid ArgumentException |
|
try{ |
|
$server = new Grpc\Server(['127.0.0.1', '8080']); |
|
} |
|
catch(\Exception $e){} |
|
|
|
// Test InvalidAddHttp2Port |
|
$server = new Grpc\Server([]); |
|
try{ |
|
$port = $server->addHttp2Port(['0.0.0.0:0']); |
|
} |
|
catch(\Exception $e){} |
|
|
|
// Test InvalidAddSecureHttp2Port |
|
$server = new Grpc\Server([]); |
|
try{ |
|
$port = $server->addSecureHttp2Port(['0.0.0.0:0']); |
|
} |
|
catch(\Exception $e){} |
|
|
|
// Test InvalidAddSecureHttp2Port2 |
|
$server = new Grpc\Server(); |
|
try{ |
|
$port = $server->addSecureHttp2Port('0.0.0.0:0'); |
|
} |
|
catch(\Exception $e){} |
|
|
|
// Test InvalidAddSecureHttp2Port3 |
|
$server = new Grpc\Server(); |
|
try{ |
|
$port = $server->addSecureHttp2Port('0.0.0.0:0', 'invalid'); |
|
} |
|
catch(\Exception $e){} |
|
unset($server); |
|
|
|
|
|
//============== ChannelCredential Test ==================== |
|
// Test CreateSslWith3Null |
|
$channel_credentials = Grpc\ChannelCredentials::createSsl(null, null, |
|
null); |
|
assert($channel_credentials != NULL); |
|
|
|
// Test CreateSslWith3NullString |
|
$channel_credentials = Grpc\ChannelCredentials::createSsl('', '', ''); |
|
assert($channel_credentials != NULL); |
|
|
|
// Test CreateInsecure |
|
$channel_credentials = Grpc\ChannelCredentials::createInsecure(); |
|
assert($channel_credentials == NULL); |
|
|
|
// Test InvalidCreateSsl() |
|
try { |
|
$channel_credentials = Grpc\ChannelCredentials::createSsl([]); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
try { |
|
$channel_credentials = Grpc\ChannelCredentials::createComposite( |
|
'something', 'something'); |
|
} |
|
catch (\Exception $e) { |
|
} |
|
|
|
//============== Interceptor Test ==================== |
|
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 SimpleRequest |
|
{ |
|
private $data; |
|
public function __construct($data) |
|
{ |
|
$this->data = $data; |
|
} |
|
public function setData($data) |
|
{ |
|
$this->data = $data; |
|
} |
|
public function serializeToString() |
|
{ |
|
return $this->data; |
|
} |
|
} |
|
|
|
class InterceptorClient 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( |
|
SimpleRequest $argument, |
|
$metadata = [], |
|
$options = [] |
|
) { |
|
return $this->_simpleRequest( |
|
'/dummy_method', |
|
$argument, |
|
[], |
|
$metadata, |
|
$options |
|
); |
|
} |
|
|
|
/** |
|
* A client-to-server streaming RPC. |
|
* @param array $metadata metadata |
|
* @param array $options call options |
|
*/ |
|
public function StreamCall( |
|
$metadata = [], |
|
$options = [] |
|
) { |
|
return $this->_clientStreamRequest('/dummy_method', [], $metadata, $options); |
|
} |
|
} |
|
|
|
class ChangeMetadataInterceptor extends Grpc\Interceptor |
|
{ |
|
public function interceptUnaryUnary($method, |
|
$argument, |
|
$deserialize, |
|
array $metadata = [], |
|
array $options = [], |
|
$continuation) |
|
{ |
|
$metadata["foo"] = array('interceptor_from_unary_request'); |
|
return $continuation($method, $argument, $deserialize, $metadata, $options); |
|
} |
|
public function interceptStreamUnary($method, $deserialize, array $metadata = [], array $options = [], $continuation) |
|
{ |
|
$metadata["foo"] = array('interceptor_from_stream_request'); |
|
return $continuation($method, $deserialize, $metadata, $options); |
|
} |
|
} |
|
|
|
class ChangeMetadataInterceptor2 extends Grpc\Interceptor |
|
{ |
|
public function interceptUnaryUnary($method, |
|
$argument, |
|
$deserialize, |
|
array $metadata = [], |
|
array $options = [], |
|
$continuation) |
|
{ |
|
if (array_key_exists('foo', $metadata)) { |
|
$metadata['bar'] = array('ChangeMetadataInterceptor should be executed first'); |
|
} else { |
|
$metadata["bar"] = array('interceptor_from_unary_request'); |
|
} |
|
return $continuation($method, $argument, $deserialize, $metadata, $options); |
|
} |
|
public function interceptStreamUnary($method, |
|
$deserialize, |
|
array $metadata = [], |
|
array $options = [], |
|
$continuation) |
|
{ |
|
if (array_key_exists('foo', $metadata)) { |
|
$metadata['bar'] = array('ChangeMetadataInterceptor should be executed first'); |
|
} else { |
|
$metadata["bar"] = array('interceptor_from_stream_request'); |
|
} |
|
return $continuation($method, $deserialize, $metadata, $options); |
|
} |
|
} |
|
|
|
class ChangeRequestCall |
|
{ |
|
private $call; |
|
|
|
public function __construct($call) |
|
{ |
|
$this->call = $call; |
|
} |
|
public function getCall() |
|
{ |
|
return $this->call; |
|
} |
|
|
|
public function write($request) |
|
{ |
|
$request->setData('intercepted_stream_request'); |
|
$this->getCall()->write($request); |
|
} |
|
|
|
public function wait() |
|
{ |
|
return $this->getCall()->wait(); |
|
} |
|
} |
|
|
|
class ChangeRequestInterceptor extends Grpc\Interceptor |
|
{ |
|
public function interceptUnaryUnary($method, |
|
$argument, |
|
$deserialize, |
|
array $metadata = [], |
|
array $options = [], |
|
$continuation) |
|
{ |
|
$argument->setData('intercepted_unary_request'); |
|
return $continuation($method, $argument, $deserialize, $metadata, $options); |
|
} |
|
public function interceptStreamUnary($method, $deserialize, array $metadata = [], array $options = [], $continuation) |
|
{ |
|
return new ChangeRequestCall( |
|
$continuation($method, $deserialize, $metadata, $options) |
|
); |
|
} |
|
} |
|
|
|
class StopCallInterceptor extends Grpc\Interceptor |
|
{ |
|
public function interceptUnaryUnary($method, |
|
$argument, |
|
array $metadata = [], |
|
array $options = [], |
|
$continuation) |
|
{ |
|
$metadata["foo"] = array('interceptor_from_request_response'); |
|
} |
|
public function interceptStreamUnary($method, |
|
array $metadata = [], |
|
array $options = [], |
|
$continuation) |
|
{ |
|
$metadata["foo"] = array('interceptor_from_request_response'); |
|
} |
|
} |
|
|
|
// Set Up |
|
$server = new Grpc\Server([]); |
|
$port = $server->addHttp2Port('0.0.0.0:0'); |
|
$channel = new Grpc\Channel('localhost:'.$port, [ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure()]); |
|
$server->start(); |
|
|
|
// Test ClientChangeMetadataOneInterceptor |
|
$req_text = 'client_request'; |
|
$channel_matadata_interceptor = new ChangeMetadataInterceptor(); |
|
$intercept_channel = Grpc\Interceptor::intercept($channel, $channel_matadata_interceptor); |
|
$client = new InterceptorClient('localhost:'.$port, [ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure(), |
|
], $intercept_channel); |
|
$req = new SimpleRequest($req_text); |
|
$unary_call = $client->UnaryCall($req); |
|
$event = $server->requestCall(); |
|
assert('/dummy_method' == $event->method); |
|
assert(['interceptor_from_unary_request'] == $event->metadata['foo']); |
|
|
|
$stream_call = $client->StreamCall(); |
|
$stream_call->write($req); |
|
$event = $server->requestCall(); |
|
assert('/dummy_method' == $event->method); |
|
assert(['interceptor_from_stream_request'] == $event->metadata['foo']); |
|
|
|
unset($unary_call); |
|
unset($stream_call); |
|
unset($server_call); |
|
|
|
// Test ClientChangeMetadataTwoInterceptor |
|
$req_text = 'client_request'; |
|
$channel_matadata_interceptor = new ChangeMetadataInterceptor(); |
|
$channel_matadata_intercepto2 = new ChangeMetadataInterceptor2(); |
|
// test intercept separately. |
|
$intercept_channel1 = Grpc\Interceptor::intercept($channel, $channel_matadata_interceptor); |
|
$intercept_channel2 = Grpc\Interceptor::intercept($intercept_channel1, $channel_matadata_intercepto2); |
|
$client = new InterceptorClient('localhost:'.$port, [ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure(), |
|
], $intercept_channel2); |
|
|
|
$req = new SimpleRequest($req_text); |
|
$unary_call = $client->UnaryCall($req); |
|
$event = $server->requestCall(); |
|
assert('/dummy_method' == $event->method); |
|
assert(['interceptor_from_unary_request'] == $event->metadata['foo']); |
|
assert(['interceptor_from_unary_request'] == $event->metadata['bar']); |
|
|
|
$stream_call = $client->StreamCall(); |
|
$stream_call->write($req); |
|
$event = $server->requestCall(); |
|
assert('/dummy_method' == $event->method); |
|
assert(['interceptor_from_stream_request'] == $event->metadata['foo']); |
|
assert(['interceptor_from_stream_request'] == $event->metadata['bar']); |
|
|
|
unset($unary_call); |
|
unset($stream_call); |
|
unset($server_call); |
|
|
|
// test intercept by array. |
|
$intercept_channel3 = Grpc\Interceptor::intercept($channel, |
|
[$channel_matadata_intercepto2, $channel_matadata_interceptor]); |
|
$client = new InterceptorClient('localhost:'.$port, [ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure(), |
|
], $intercept_channel3); |
|
|
|
$req = new SimpleRequest($req_text); |
|
$unary_call = $client->UnaryCall($req); |
|
$event = $server->requestCall(); |
|
assert('/dummy_method' == $event->method); |
|
assert(['interceptor_from_unary_request'] == $event->metadata['foo']); |
|
assert(['interceptor_from_unary_request'] == $event->metadata['bar']); |
|
|
|
$stream_call = $client->StreamCall(); |
|
$stream_call->write($req); |
|
$event = $server->requestCall(); |
|
assert('/dummy_method' == $event->method); |
|
assert(['interceptor_from_stream_request'] == $event->metadata['foo']); |
|
assert(['interceptor_from_stream_request'] == $event->metadata['bar']); |
|
|
|
unset($unary_call); |
|
unset($stream_call); |
|
unset($server_call); |
|
|
|
|
|
// Test ClientChangeRequestInterceptor |
|
$req_text = 'client_request'; |
|
$change_request_interceptor = new ChangeRequestInterceptor(); |
|
$intercept_channel = Grpc\Interceptor::intercept($channel, |
|
$change_request_interceptor); |
|
$client = new InterceptorClient('localhost:'.$port, [ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure(), |
|
], $intercept_channel); |
|
|
|
$req = new SimpleRequest($req_text); |
|
$unary_call = $client->UnaryCall($req); |
|
|
|
$event = $server->requestCall(); |
|
assert('/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, |
|
]); |
|
assert('intercepted_unary_request' == $event->message); |
|
|
|
$stream_call = $client->StreamCall(); |
|
$stream_call->write($req); |
|
$event = $server->requestCall(); |
|
assert('/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, |
|
]); |
|
assert('intercepted_stream_request' == $event->message); |
|
|
|
unset($unary_call); |
|
unset($stream_call); |
|
unset($server_call); |
|
|
|
// Test ClientChangeStopCallInterceptor |
|
$req_text = 'client_request'; |
|
$channel_request_interceptor = new StopCallInterceptor(); |
|
$intercept_channel = Grpc\Interceptor::intercept($channel, |
|
$channel_request_interceptor); |
|
$client = new InterceptorClient('localhost:'.$port, [ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure(), |
|
], $intercept_channel); |
|
|
|
$req = new SimpleRequest($req_text); |
|
$unary_call = $client->UnaryCall($req); |
|
assert($unary_call == NULL); |
|
|
|
|
|
$stream_call = $client->StreamCall(); |
|
assert($stream_call == NULL); |
|
|
|
unset($unary_call); |
|
unset($stream_call); |
|
unset($server_call); |
|
|
|
// Test GetInterceptorChannelConnectivityState |
|
$channel = new Grpc\Channel( |
|
'localhost:0', |
|
[ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure() |
|
] |
|
); |
|
$interceptor_channel = Grpc\Interceptor::intercept($channel, new Grpc\Interceptor()); |
|
$state = $interceptor_channel->getConnectivityState(); |
|
assert(0 == $state); |
|
$channel->close(); |
|
|
|
// Test InterceptorChannelWatchConnectivityState |
|
$channel = new Grpc\Channel( |
|
'localhost:0', |
|
[ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure() |
|
] |
|
); |
|
$interceptor_channel = Grpc\Interceptor::intercept($channel, new Grpc\Interceptor()); |
|
$now = Grpc\Timeval::now(); |
|
$deadline = $now->add(new Grpc\Timeval(100*1000)); |
|
$state = $interceptor_channel->watchConnectivityState(1, $deadline); |
|
assert($state); |
|
unset($time); |
|
unset($deadline); |
|
$channel->close(); |
|
|
|
// Test InterceptorChannelClose |
|
$channel = new Grpc\Channel( |
|
'localhost:0', |
|
[ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure() |
|
] |
|
); |
|
$interceptor_channel = Grpc\Interceptor::intercept($channel, new Grpc\Interceptor()); |
|
assert($interceptor_channel != NULL); |
|
$channel->close(); |
|
|
|
// Test InterceptorChannelGetTarget |
|
$channel = new Grpc\Channel( |
|
'localhost:8888', |
|
[ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure() |
|
] |
|
); |
|
$interceptor_channel = Grpc\Interceptor::intercept($channel, new Grpc\Interceptor()); |
|
$target = $interceptor_channel->getTarget(); |
|
assert(is_string($target)); |
|
|
|
$channel->close(); |
|
unset($server); |
|
|
|
|
|
//============== CallInvoker Test ==================== |
|
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(); |
|
} |
|
} |
|
|
|
// Set Up |
|
$server = new Grpc\Server([]); |
|
$port = $server->addHttp2Port('0.0.0.0:0'); |
|
$server->start(); |
|
|
|
// Test CreateDefaultCallInvoker |
|
$call_invoker = new \Grpc\DefaultCallInvoker(); |
|
|
|
// Test CreateCallInvoker |
|
$call_invoker = new CallInvokerUpdateChannel(); |
|
|
|
// Test CallInvokerAccessChannel |
|
$call_invoker = new CallInvokerUpdateChannel(); |
|
$stub = new \Grpc\BaseStub('localhost:50051', |
|
['credentials' => \Grpc\ChannelCredentials::createInsecure(), |
|
'grpc_call_invoker' => $call_invoker]); |
|
assert($call_invoker->getChannel()->getTarget() == 'localhost:50050'); |
|
$call_invoker->getChannel()->close(); |
|
|
|
// Test ClientChangeRequestCallInvoker |
|
$req_text = 'client_request'; |
|
$call_invoker = new CallInvokerChangeRequest(); |
|
$client = new CallInvokerClient('localhost:'.$port, [ |
|
'force_new' => true, |
|
'credentials' => Grpc\ChannelCredentials::createInsecure(), |
|
'grpc_call_invoker' => $call_invoker, |
|
]); |
|
|
|
$req = new CallInvokerSimpleRequest($req_text); |
|
$unary_call = $client->UnaryCall($req); |
|
|
|
$event = $server->requestCall(); |
|
assert('/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, |
|
]); |
|
assert('intercepted_unary_request' == $event->message); |
|
$call_invoker->getChannel()->close(); |
|
unset($unary_call); |
|
unset($server_call); |
|
|
|
unset($server); |
|
|
|
<<<<<<< HEAD |
|
<<<<<<< HEAD |
|
echo "Went Through All Unit Tests..............\r\n"; |
|
======= |
|
echo "Went Through All Unit Tests.............."; |
|
>>>>>>> add MemoryLeakTest |
|
======= |
|
echo "Went Through All Unit Tests..............\r\n"; |
|
>>>>>>> complete memory leak test |
|
|
|
|
|
|