Index: third_party/grpc/src/php/tests/interop/interop_client.php |
diff --git a/third_party/grpc/src/php/tests/interop/interop_client.php b/third_party/grpc/src/php/tests/interop/interop_client.php |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aebf80f6bf003900c9f60c0eb7e7edfe9e718dd8 |
--- /dev/null |
+++ b/third_party/grpc/src/php/tests/interop/interop_client.php |
@@ -0,0 +1,528 @@ |
+<?php |
+/* |
+ * |
+ * Copyright 2015, Google Inc. |
+ * All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions are |
+ * met: |
+ * |
+ * * Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * * Redistributions in binary form must reproduce the above |
+ * copyright notice, this list of conditions and the following disclaimer |
+ * in the documentation and/or other materials provided with the |
+ * distribution. |
+ * * Neither the name of Google Inc. nor the names of its |
+ * contributors may be used to endorse or promote products derived from |
+ * this software without specific prior written permission. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ * |
+ */ |
+require_once realpath(dirname(__FILE__).'/../../vendor/autoload.php'); |
+require 'empty.php'; |
+require 'messages.php'; |
+require 'test.php'; |
+use Google\Auth\CredentialsLoader; |
+use Google\Auth\ApplicationDefaultCredentials; |
+use GuzzleHttp\ClientInterface; |
+ |
+/** |
+ * Assertion function that always exits with an error code if the assertion is |
+ * falsy. |
+ * |
+ * @param $value Assertion value. Should be true. |
+ * @param $error_message Message to display if the assertion is false |
+ */ |
+function hardAssert($value, $error_message) |
+{ |
+ if (!$value) { |
+ echo $error_message."\n"; |
+ exit(1); |
+ } |
+} |
+ |
+/** |
+ * Run the empty_unary test. |
+ * |
+ * @param $stub Stub object that has service methods |
+ */ |
+function emptyUnary($stub) |
+{ |
+ list($result, $status) = $stub->EmptyCall(new grpc\testing\EmptyMessage())->wait(); |
+ hardAssert($status->code === Grpc\STATUS_OK, 'Call did not complete successfully'); |
+ hardAssert($result !== null, 'Call completed with a null response'); |
+} |
+ |
+/** |
+ * Run the large_unary test. |
+ * |
+ * @param $stub Stub object that has service methods |
+ */ |
+function largeUnary($stub) |
+{ |
+ performLargeUnary($stub); |
+} |
+ |
+/** |
+ * Shared code between large unary test and auth test. |
+ * |
+ * @param $stub Stub object that has service methods |
+ * @param $fillUsername boolean whether to fill result with username |
+ * @param $fillOauthScope boolean whether to fill result with oauth scope |
+ */ |
+function performLargeUnary($stub, $fillUsername = false, $fillOauthScope = false, |
+ $callback = false) |
+{ |
+ $request_len = 271828; |
+ $response_len = 314159; |
+ |
+ $request = new grpc\testing\SimpleRequest(); |
+ $request->setResponseType(grpc\testing\PayloadType::COMPRESSABLE); |
+ $request->setResponseSize($response_len); |
+ $payload = new grpc\testing\Payload(); |
+ $payload->setType(grpc\testing\PayloadType::COMPRESSABLE); |
+ $payload->setBody(str_repeat("\0", $request_len)); |
+ $request->setPayload($payload); |
+ $request->setFillUsername($fillUsername); |
+ $request->setFillOauthScope($fillOauthScope); |
+ |
+ $options = false; |
+ if ($callback) { |
+ $options['call_credentials_callback'] = $callback; |
+ } |
+ |
+ list($result, $status) = $stub->UnaryCall($request, [], $options)->wait(); |
+ hardAssert($status->code === Grpc\STATUS_OK, 'Call did not complete successfully'); |
+ hardAssert($result !== null, 'Call returned a null response'); |
+ $payload = $result->getPayload(); |
+ hardAssert($payload->getType() === grpc\testing\PayloadType::COMPRESSABLE, |
+ 'Payload had the wrong type'); |
+ hardAssert(strlen($payload->getBody()) === $response_len, |
+ 'Payload had the wrong length'); |
+ hardAssert($payload->getBody() === str_repeat("\0", $response_len), |
+ 'Payload had the wrong content'); |
+ |
+ return $result; |
+} |
+ |
+/** |
+ * Run the service account credentials auth test. |
+ * |
+ * @param $stub Stub object that has service methods |
+ * @param $args array command line args |
+ */ |
+function serviceAccountCreds($stub, $args) |
+{ |
+ if (!array_key_exists('oauth_scope', $args)) { |
+ throw new Exception('Missing oauth scope'); |
+ } |
+ $jsonKey = json_decode( |
+ file_get_contents(getenv(CredentialsLoader::ENV_VAR)), |
+ true); |
+ $result = performLargeUnary($stub, $fillUsername = true, $fillOauthScope = true); |
+ hardAssert($result->getUsername() == $jsonKey['client_email'], |
+ 'invalid email returned'); |
+ hardAssert(strpos($args['oauth_scope'], $result->getOauthScope()) !== false, |
+ 'invalid oauth scope returned'); |
+} |
+ |
+/** |
+ * Run the compute engine credentials auth test. |
+ * Has not been run from gcloud as of 2015-05-05. |
+ * |
+ * @param $stub Stub object that has service methods |
+ * @param $args array command line args |
+ */ |
+function computeEngineCreds($stub, $args) |
+{ |
+ if (!array_key_exists('oauth_scope', $args)) { |
+ throw new Exception('Missing oauth scope'); |
+ } |
+ if (!array_key_exists('default_service_account', $args)) { |
+ throw new Exception('Missing default_service_account'); |
+ } |
+ $result = performLargeUnary($stub, $fillUsername = true, $fillOauthScope = true); |
+ hardAssert($args['default_service_account'] == $result->getUsername(), |
+ 'invalid email returned'); |
+} |
+ |
+/** |
+ * Run the jwt token credentials auth test. |
+ * |
+ * @param $stub Stub object that has service methods |
+ * @param $args array command line args |
+ */ |
+function jwtTokenCreds($stub, $args) |
+{ |
+ $jsonKey = json_decode( |
+ file_get_contents(getenv(CredentialsLoader::ENV_VAR)), |
+ true); |
+ $result = performLargeUnary($stub, $fillUsername = true, $fillOauthScope = true); |
+ hardAssert($result->getUsername() == $jsonKey['client_email'], |
+ 'invalid email returned'); |
+} |
+ |
+/** |
+ * Run the oauth2_auth_token auth test. |
+ * |
+ * @param $stub Stub object that has service methods |
+ * @param $args array command line args |
+ */ |
+function oauth2AuthToken($stub, $args) |
+{ |
+ $jsonKey = json_decode( |
+ file_get_contents(getenv(CredentialsLoader::ENV_VAR)), |
+ true); |
+ $result = performLargeUnary($stub, $fillUsername = true, $fillOauthScope = true); |
+ hardAssert($result->getUsername() == $jsonKey['client_email'], |
+ 'invalid email returned'); |
+} |
+ |
+function updateAuthMetadataCallback($context) |
+{ |
+ $authUri = $context->service_url; |
+ $methodName = $context->method_name; |
+ $auth_credentials = ApplicationDefaultCredentials::getCredentials(); |
+ |
+ return $auth_credentials->updateMetadata($metadata = [], $authUri); |
+} |
+ |
+/** |
+ * Run the per_rpc_creds auth test. |
+ * |
+ * @param $stub Stub object that has service methods |
+ * @param $args array command line args |
+ */ |
+function perRpcCreds($stub, $args) |
+{ |
+ $jsonKey = json_decode( |
+ file_get_contents(getenv(CredentialsLoader::ENV_VAR)), |
+ true); |
+ |
+ $result = performLargeUnary($stub, $fillUsername = true, $fillOauthScope = true, |
+ 'updateAuthMetadataCallback'); |
+ hardAssert($result->getUsername() == $jsonKey['client_email'], |
+ 'invalid email returned'); |
+} |
+ |
+/** |
+ * Run the client_streaming test. |
+ * |
+ * @param $stub Stub object that has service methods |
+ */ |
+function clientStreaming($stub) |
+{ |
+ $request_lengths = [27182, 8, 1828, 45904]; |
+ |
+ $requests = array_map( |
+ function ($length) { |
+ $request = new grpc\testing\StreamingInputCallRequest(); |
+ $payload = new grpc\testing\Payload(); |
+ $payload->setBody(str_repeat("\0", $length)); |
+ $request->setPayload($payload); |
+ |
+ return $request; |
+ }, $request_lengths); |
+ |
+ $call = $stub->StreamingInputCall(); |
+ foreach ($requests as $request) { |
+ $call->write($request); |
+ } |
+ list($result, $status) = $call->wait(); |
+ hardAssert($status->code === Grpc\STATUS_OK, 'Call did not complete successfully'); |
+ hardAssert($result->getAggregatedPayloadSize() === 74922, |
+ 'aggregated_payload_size was incorrect'); |
+} |
+ |
+/** |
+ * Run the server_streaming test. |
+ * |
+ * @param $stub Stub object that has service methods. |
+ */ |
+function serverStreaming($stub) |
+{ |
+ $sizes = [31415, 9, 2653, 58979]; |
+ |
+ $request = new grpc\testing\StreamingOutputCallRequest(); |
+ $request->setResponseType(grpc\testing\PayloadType::COMPRESSABLE); |
+ foreach ($sizes as $size) { |
+ $response_parameters = new grpc\testing\ResponseParameters(); |
+ $response_parameters->setSize($size); |
+ $request->addResponseParameters($response_parameters); |
+ } |
+ |
+ $call = $stub->StreamingOutputCall($request); |
+ $i = 0; |
+ foreach ($call->responses() as $value) { |
+ hardAssert($i < 4, 'Too many responses'); |
+ $payload = $value->getPayload(); |
+ hardAssert($payload->getType() === grpc\testing\PayloadType::COMPRESSABLE, |
+ 'Payload '.$i.' had the wrong type'); |
+ hardAssert(strlen($payload->getBody()) === $sizes[$i], |
+ 'Response '.$i.' had the wrong length'); |
+ $i += 1; |
+ } |
+ hardAssert($call->getStatus()->code === Grpc\STATUS_OK, |
+ 'Call did not complete successfully'); |
+} |
+ |
+/** |
+ * Run the ping_pong test. |
+ * |
+ * @param $stub Stub object that has service methods. |
+ */ |
+function pingPong($stub) |
+{ |
+ $request_lengths = [27182, 8, 1828, 45904]; |
+ $response_lengths = [31415, 9, 2653, 58979]; |
+ |
+ $call = $stub->FullDuplexCall(); |
+ for ($i = 0; $i < 4; ++$i) { |
+ $request = new grpc\testing\StreamingOutputCallRequest(); |
+ $request->setResponseType(grpc\testing\PayloadType::COMPRESSABLE); |
+ $response_parameters = new grpc\testing\ResponseParameters(); |
+ $response_parameters->setSize($response_lengths[$i]); |
+ $request->addResponseParameters($response_parameters); |
+ $payload = new grpc\testing\Payload(); |
+ $payload->setBody(str_repeat("\0", $request_lengths[$i])); |
+ $request->setPayload($payload); |
+ |
+ $call->write($request); |
+ $response = $call->read(); |
+ |
+ hardAssert($response !== null, 'Server returned too few responses'); |
+ $payload = $response->getPayload(); |
+ hardAssert($payload->getType() === grpc\testing\PayloadType::COMPRESSABLE, |
+ 'Payload '.$i.' had the wrong type'); |
+ hardAssert(strlen($payload->getBody()) === $response_lengths[$i], |
+ 'Payload '.$i.' had the wrong length'); |
+ } |
+ $call->writesDone(); |
+ hardAssert($call->read() === null, 'Server returned too many responses'); |
+ hardAssert($call->getStatus()->code === Grpc\STATUS_OK, |
+ 'Call did not complete successfully'); |
+} |
+ |
+/** |
+ * Run the empty_stream test. |
+ * |
+ * @param $stub Stub object that has service methods. |
+ */ |
+function emptyStream($stub) |
+{ |
+ $call = $stub->FullDuplexCall(); |
+ $call->writesDone(); |
+ hardAssert($call->read() === null, 'Server returned too many responses'); |
+ hardAssert($call->getStatus()->code === Grpc\STATUS_OK, |
+ 'Call did not complete successfully'); |
+} |
+ |
+/** |
+ * Run the cancel_after_begin test. |
+ * |
+ * @param $stub Stub object that has service methods. |
+ */ |
+function cancelAfterBegin($stub) |
+{ |
+ $call = $stub->StreamingInputCall(); |
+ $call->cancel(); |
+ list($result, $status) = $call->wait(); |
+ hardAssert($status->code === Grpc\STATUS_CANCELLED, |
+ 'Call status was not CANCELLED'); |
+} |
+ |
+/** |
+ * Run the cancel_after_first_response test. |
+ * |
+ * @param $stub Stub object that has service methods. |
+ */ |
+function cancelAfterFirstResponse($stub) |
+{ |
+ $call = $stub->FullDuplexCall(); |
+ $request = new grpc\testing\StreamingOutputCallRequest(); |
+ $request->setResponseType(grpc\testing\PayloadType::COMPRESSABLE); |
+ $response_parameters = new grpc\testing\ResponseParameters(); |
+ $response_parameters->setSize(31415); |
+ $request->addResponseParameters($response_parameters); |
+ $payload = new grpc\testing\Payload(); |
+ $payload->setBody(str_repeat("\0", 27182)); |
+ $request->setPayload($payload); |
+ |
+ $call->write($request); |
+ $response = $call->read(); |
+ |
+ $call->cancel(); |
+ hardAssert($call->getStatus()->code === Grpc\STATUS_CANCELLED, |
+ 'Call status was not CANCELLED'); |
+} |
+ |
+function timeoutOnSleepingServer($stub) |
+{ |
+ $call = $stub->FullDuplexCall([], ['timeout' => 1000]); |
+ $request = new grpc\testing\StreamingOutputCallRequest(); |
+ $request->setResponseType(grpc\testing\PayloadType::COMPRESSABLE); |
+ $response_parameters = new grpc\testing\ResponseParameters(); |
+ $response_parameters->setSize(8); |
+ $request->addResponseParameters($response_parameters); |
+ $payload = new grpc\testing\Payload(); |
+ $payload->setBody(str_repeat("\0", 9)); |
+ $request->setPayload($payload); |
+ |
+ $call->write($request); |
+ $response = $call->read(); |
+ |
+ hardAssert($call->getStatus()->code === Grpc\STATUS_DEADLINE_EXCEEDED, |
+ 'Call status was not DEADLINE_EXCEEDED'); |
+} |
+ |
+$args = getopt('', ['server_host:', 'server_port:', 'test_case:', |
+ 'use_tls::', 'use_test_ca::', |
+ 'server_host_override:', 'oauth_scope:', |
+ 'default_service_account:', ]); |
+if (!array_key_exists('server_host', $args)) { |
+ throw new Exception('Missing argument: --server_host is required'); |
+} |
+if (!array_key_exists('server_port', $args)) { |
+ throw new Exception('Missing argument: --server_port is required'); |
+} |
+if (!array_key_exists('test_case', $args)) { |
+ throw new Exception('Missing argument: --test_case is required'); |
+} |
+ |
+if ($args['server_port'] == 443) { |
+ $server_address = $args['server_host']; |
+} else { |
+ $server_address = $args['server_host'].':'.$args['server_port']; |
+} |
+ |
+$test_case = $args['test_case']; |
+ |
+$host_override = 'foo.test.google.fr'; |
+if (array_key_exists('server_host_override', $args)) { |
+ $host_override = $args['server_host_override']; |
+} |
+ |
+$use_tls = false; |
+if (array_key_exists('use_tls', $args) && |
+ $args['use_tls'] != 'false') { |
+ $use_tls = true; |
+} |
+ |
+$use_test_ca = false; |
+if (array_key_exists('use_test_ca', $args) && |
+ $args['use_test_ca'] != 'false') { |
+ $use_test_ca = true; |
+} |
+ |
+$opts = []; |
+ |
+if ($use_tls) { |
+ if ($use_test_ca) { |
+ $ssl_credentials = Grpc\ChannelCredentials::createSsl( |
+ file_get_contents(dirname(__FILE__).'/../data/ca.pem')); |
+ } else { |
+ $ssl_credentials = Grpc\ChannelCredentials::createSsl(); |
+ } |
+ $opts['credentials'] = $ssl_credentials; |
+ $opts['grpc.ssl_target_name_override'] = $host_override; |
+} else { |
+ $opts['credentials'] = Grpc\ChannelCredentials::createInsecure(); |
+} |
+ |
+if (in_array($test_case, ['service_account_creds', |
+ 'compute_engine_creds', 'jwt_token_creds', ])) { |
+ if ($test_case == 'jwt_token_creds') { |
+ $auth_credentials = ApplicationDefaultCredentials::getCredentials(); |
+ } else { |
+ $auth_credentials = ApplicationDefaultCredentials::getCredentials( |
+ $args['oauth_scope'] |
+ ); |
+ } |
+ $opts['update_metadata'] = $auth_credentials->getUpdateMetadataFunc(); |
+} |
+ |
+if ($test_case == 'oauth2_auth_token') { |
+ $auth_credentials = ApplicationDefaultCredentials::getCredentials( |
+ $args['oauth_scope'] |
+ ); |
+ $token = $auth_credentials->fetchAuthToken(); |
+ $update_metadata = |
+ function ($metadata, |
+ $authUri = null, |
+ ClientInterface $client = null) use ($token) { |
+ $metadata_copy = $metadata; |
+ $metadata_copy[CredentialsLoader::AUTH_METADATA_KEY] = |
+ [sprintf('%s %s', |
+ $token['token_type'], |
+ $token['access_token'])]; |
+ |
+ return $metadata_copy; |
+ }; |
+ $opts['update_metadata'] = $update_metadata; |
+} |
+ |
+$stub = new grpc\testing\TestServiceClient($server_address, $opts); |
+ |
+echo "Connecting to $server_address\n"; |
+echo "Running test case $test_case\n"; |
+ |
+switch ($test_case) { |
+ case 'empty_unary': |
+ emptyUnary($stub); |
+ break; |
+ case 'large_unary': |
+ largeUnary($stub); |
+ break; |
+ case 'client_streaming': |
+ clientStreaming($stub); |
+ break; |
+ case 'server_streaming': |
+ serverStreaming($stub); |
+ break; |
+ case 'ping_pong': |
+ pingPong($stub); |
+ break; |
+ case 'empty_stream': |
+ emptyStream($stub); |
+ break; |
+ case 'cancel_after_begin': |
+ cancelAfterBegin($stub); |
+ break; |
+ case 'cancel_after_first_response': |
+ cancelAfterFirstResponse($stub); |
+ break; |
+ case 'timeout_on_sleeping_server': |
+ timeoutOnSleepingServer($stub); |
+ break; |
+ case 'service_account_creds': |
+ serviceAccountCreds($stub, $args); |
+ break; |
+ case 'compute_engine_creds': |
+ computeEngineCreds($stub, $args); |
+ break; |
+ case 'jwt_token_creds': |
+ jwtTokenCreds($stub, $args); |
+ break; |
+ case 'oauth2_auth_token': |
+ oauth2AuthToken($stub, $args); |
+ break; |
+ case 'per_rpc_creds': |
+ perRpcCreds($stub, $args); |
+ break; |
+ default: |
+ echo "Unsupported test case $test_case\n"; |
+ exit(1); |
+} |