aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Tim Emiola <tbetbetbe@users.noreply.github.com>2015-04-30 15:19:51 -0400
committerGravatar Tim Emiola <tbetbetbe@users.noreply.github.com>2015-04-30 15:19:51 -0400
commitbe02e15cf668020c0ed1b3ae8ca2c4cc0d6daee3 (patch)
tree9e91cfbafb7b5e4dab934bc6637896cfd38a1386
parent6d42a73bb984e19eb1bf84e2a952eec861cea464 (diff)
parent4fbc53e82d11a66f8570e71c65a087f210fd10ca (diff)
Merge pull request #1429 from stanley-cheung/php_auth_interop_test
Php auth interop test
-rw-r--r--src/php/composer.json3
-rw-r--r--src/php/composer.lock302
-rwxr-xr-xsrc/php/tests/interop/interop_client.php89
3 files changed, 375 insertions, 19 deletions
diff --git a/src/php/composer.json b/src/php/composer.json
index 3c0cb37231..ba7a1302f2 100644
--- a/src/php/composer.json
+++ b/src/php/composer.json
@@ -5,7 +5,8 @@
"homepage": "http://grpc.io",
"license": "BSD-3-Clause",
"require": {
- "php": ">=5.5.0"
+ "php": ">=5.5.0",
+ "google/auth": "dev-master"
},
"autoload": {
"psr-4": {
diff --git a/src/php/composer.lock b/src/php/composer.lock
index 47fc70fd2d..c2d723def4 100644
--- a/src/php/composer.lock
+++ b/src/php/composer.lock
@@ -4,12 +4,308 @@
"Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
"This file is @generated automatically"
],
- "hash": "65467a098f5fd8b8fe5f7f6e10226f8a",
- "packages": [],
+ "hash": "bb81ea5f72ddea2f594a172ff0f3b44d",
+ "packages": [
+ {
+ "name": "firebase/php-jwt",
+ "version": "2.0.0",
+ "target-dir": "Firebase/PHP-JWT",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/firebase/php-jwt.git",
+ "reference": "ffcfd888ce1e4f2d70cac2dc9b7301038332fe57"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/firebase/php-jwt/zipball/ffcfd888ce1e4f2d70cac2dc9b7301038332fe57",
+ "reference": "ffcfd888ce1e4f2d70cac2dc9b7301038332fe57",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.2.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Authentication/",
+ "Exceptions/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Neuman Vong",
+ "email": "neuman+pear@twilio.com",
+ "role": "Developer"
+ },
+ {
+ "name": "Anant Narayanan",
+ "email": "anant@php.net",
+ "role": "Developer"
+ }
+ ],
+ "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.",
+ "homepage": "https://github.com/firebase/php-jwt",
+ "time": "2015-04-01 18:46:38"
+ },
+ {
+ "name": "google/auth",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/google/google-auth-library-php.git",
+ "reference": "35f87159b327fa6416266948c1747c585a4ae3ad"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/google/google-auth-library-php/zipball/35f87159b327fa6416266948c1747c585a4ae3ad",
+ "reference": "35f87159b327fa6416266948c1747c585a4ae3ad",
+ "shasum": ""
+ },
+ "require": {
+ "firebase/php-jwt": "2.0.0",
+ "guzzlehttp/guzzle": "5.2.*",
+ "php": ">=5.4"
+ },
+ "require-dev": {
+ "phplint/phplint": "0.0.1",
+ "phpunit/phpunit": "3.7.*"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ],
+ "psr-4": {
+ "Google\\Auth\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "description": "Google Auth Library for PHP",
+ "homepage": "http://github.com/google/google-auth-library-php",
+ "keywords": [
+ "Authentication",
+ "google",
+ "oauth2"
+ ],
+ "time": "2015-04-30 11:57:19"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "5.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "475b29ccd411f2fa8a408e64576418728c032cfa"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/475b29ccd411f2fa8a408e64576418728c032cfa",
+ "reference": "475b29ccd411f2fa8a408e64576418728c032cfa",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/ringphp": "~1.0",
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "~4.0",
+ "psr/log": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library and framework for building RESTful web service clients",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "time": "2015-01-28 01:03:29"
+ },
+ {
+ "name": "guzzlehttp/ringphp",
+ "version": "1.0.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/RingPHP.git",
+ "reference": "52d868f13570a9a56e5fce6614e0ec75d0f13ac2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/RingPHP/zipball/52d868f13570a9a56e5fce6614e0ec75d0f13ac2",
+ "reference": "52d868f13570a9a56e5fce6614e0ec75d0f13ac2",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/streams": "~3.0",
+ "php": ">=5.4.0",
+ "react/promise": "~2.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "ext-curl": "Guzzle will use specific adapters if cURL is present"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Ring\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Provides a simple API and specification that abstracts away the details of HTTP into a single PHP function.",
+ "time": "2015-03-30 01:43:20"
+ },
+ {
+ "name": "guzzlehttp/streams",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/streams.git",
+ "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/streams/zipball/47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
+ "reference": "47aaa48e27dae43d39fc1cea0ccf0d84ac1a2ba5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Stream\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Provides a simple abstraction over streams of data",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "Guzzle",
+ "stream"
+ ],
+ "time": "2014-10-12 19:18:40"
+ },
+ {
+ "name": "react/promise",
+ "version": "v2.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/reactphp/promise.git",
+ "reference": "365fcee430dfa4ace1fbc75737ca60ceea7eeeef"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/reactphp/promise/zipball/365fcee430dfa4ace1fbc75737ca60ceea7eeeef",
+ "reference": "365fcee430dfa4ace1fbc75737ca60ceea7eeeef",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "React\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jan Sorgalla",
+ "email": "jsorgalla@googlemail.com"
+ }
+ ],
+ "description": "A lightweight implementation of CommonJS Promises/A for PHP",
+ "time": "2014-12-30 13:32:42"
+ }
+ ],
"packages-dev": [],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": [],
+ "stability-flags": {
+ "google/auth": 20
+ },
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
diff --git a/src/php/tests/interop/interop_client.php b/src/php/tests/interop/interop_client.php
index 6f81bfa6cd..22f85aa322 100755
--- a/src/php/tests/interop/interop_client.php
+++ b/src/php/tests/interop/interop_client.php
@@ -38,6 +38,7 @@ require 'empty.php';
require 'message_set.php';
require 'messages.php';
require 'test.php';
+
/**
* Assertion function that always exits with an error code if the assertion is
* falsy
@@ -45,7 +46,7 @@ require 'test.php';
* @param $error_message Message to display if the assertion is false
*/
function hardAssert($value, $error_message) {
- if(!$value) {
+ if (!$value) {
echo $error_message . "\n";
exit(1);
}
@@ -53,7 +54,7 @@ function hardAssert($value, $error_message) {
/**
* Run the empty_unary test.
- * Currently not tested against any server as of 2014-12-04
+ * Passes when run against the Node server as of 2015-04-30
* @param $stub Stub object that has service methods
*/
function emptyUnary($stub) {
@@ -64,11 +65,20 @@ function emptyUnary($stub) {
/**
* Run the large_unary test.
- * Passes when run against the C++ server as of 2014-12-04
- * Not tested against any other server as of 2014-12-04
+ * Passes when run against the C++/Node server as of 2015-04-30
* @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) {
$request_len = 271828;
$response_len = 314159;
@@ -79,6 +89,8 @@ function largeUnary($stub) {
$payload->setType(grpc\testing\PayloadType::COMPRESSABLE);
$payload->setBody(str_repeat("\0", $request_len));
$request->setPayload($payload);
+ $request->setFillUsername($fillUsername);
+ $request->setFillOauthScope($fillOauthScope);
list($result, $status) = $stub->UnaryCall($request)->wait();
hardAssert($status->code === Grpc\STATUS_OK, 'Call did not complete successfully');
@@ -90,11 +102,32 @@ function largeUnary($stub) {
'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.
+ * Passes when run against the cloud server as of 2015-04-30
+ * @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(Google\Auth\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 client_streaming test.
- * Not tested against any server as of 2014-12-04.
+ * Passes when run against the Node server as of 2015-04-30
* @param $stub Stub object that has service methods
*/
function clientStreaming($stub) {
@@ -117,7 +150,7 @@ function clientStreaming($stub) {
/**
* Run the server_streaming test.
- * Not tested against any server as of 2014-12-04.
+ * Passes when run against the Node server as of 2015-04-30
* @param $stub Stub object that has service methods.
*/
function serverStreaming($stub) {
@@ -148,7 +181,7 @@ function serverStreaming($stub) {
/**
* Run the ping_pong test.
- * Not tested against any server as of 2014-12-04.
+ * Passes when run against the Node server as of 2015-04-30
* @param $stub Stub object that has service methods.
*/
function pingPong($stub) {
@@ -182,6 +215,11 @@ function pingPong($stub) {
'Call did not complete successfully');
}
+/**
+ * Run the cancel_after_first_response test.
+ * Passes when run against the Node server as of 2015-04-30
+ * @param $stub Stub object that has service methods.
+ */
function cancelAfterFirstResponse($stub) {
$call = $stub->FullDuplexCall();
$request = new grpc\testing\StreamingOutputCallRequest();
@@ -201,7 +239,8 @@ function cancelAfterFirstResponse($stub) {
'Call status was not CANCELLED');
}
-$args = getopt('', array('server_host:', 'server_port:', 'test_case:'));
+$args = getopt('', array('server_host:', 'server_port:', 'test_case:',
+ 'server_host_override:', 'oauth_scope:'));
if (!array_key_exists('server_host', $args) ||
!array_key_exists('server_port', $args) ||
!array_key_exists('test_case', $args)) {
@@ -210,20 +249,37 @@ if (!array_key_exists('server_host', $args) ||
$server_address = $args['server_host'] . ':' . $args['server_port'];
-$credentials = Grpc\Credentials::createSsl(
- file_get_contents(dirname(__FILE__) . '/../data/ca.pem'));
+if (!array_key_exists('server_host_override', $args)) {
+ $args['server_host_override'] = 'foo.test.google.fr';
+}
+
+$ssl_cert_file = getenv('SSL_CERT_FILE');
+if (!$ssl_cert_file) {
+ $ssl_cert_file = dirname(__FILE__) . '/../data/ca.pem';
+}
+
+$credentials = Grpc\Credentials::createSsl(file_get_contents($ssl_cert_file));
+
+$opts = [
+ 'grpc.ssl_target_name_override' => $args['server_host_override'],
+ 'credentials' => $credentials,
+ ];
+
+if (array_key_exists('oauth_scope', $args)) {
+ $auth = Google\Auth\ApplicationDefaultCredentials::getCredentials(
+ $args['oauth_scope']);
+ $opts['update_metadata'] = $auth->getUpdateMetadataFunc();
+}
+
$stub = new grpc\testing\TestServiceClient(
new Grpc\BaseStub(
$server_address,
- [
- 'grpc.ssl_target_name_override' => 'foo.test.google.fr',
- 'credentials' => $credentials
- ]));
+ $opts));
echo "Connecting to $server_address\n";
echo "Running test case $args[test_case]\n";
-switch($args['test_case']) {
+switch ($args['test_case']) {
case 'empty_unary':
emptyUnary($stub);
break;
@@ -242,6 +298,9 @@ switch($args['test_case']) {
case 'cancel_after_first_response':
cancelAfterFirstResponse($stub);
break;
+ case 'service_account_creds':
+ serviceAccountCreds($stub, $args);
+ break;
default:
exit(1);
}