php: stress test client

pull/6417/head
Stanley Cheung 9 years ago
parent acae9fe6e7
commit 55643fee6b
  1. 249
      src/php/tests/interop/interop_client.php
  2. 17
      src/php/tests/interop/metrics_client.php
  3. 83
      src/php/tests/interop/stress_client.php

@ -388,141 +388,148 @@ function timeoutOnSleepingServer($stub)
'Call status was not DEADLINE_EXCEEDED'); 'Call status was not DEADLINE_EXCEEDED');
} }
$args = getopt('', ['server_host:', 'server_port:', 'test_case:', function interop_main($args)
'use_tls::', 'use_test_ca::', {
'server_host_override:', 'oauth_scope:', if (!array_key_exists('server_host', $args)) {
'default_service_account:', ]); throw new Exception('Missing argument: --server_host is required');
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('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 (!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']; if ($args['server_port'] == 443) {
$server_address = $args['server_host'];
} else {
$server_address = $args['server_host'].':'.$args['server_port'];
}
$host_override = 'foo.test.google.fr'; $test_case = $args['test_case'];
if (array_key_exists('server_host_override', $args)) {
$host_override = $args['server_host_override'];
}
$use_tls = false; $host_override = 'foo.test.google.fr';
if (array_key_exists('use_tls', $args) && if (array_key_exists('server_host_override', $args)) {
$args['use_tls'] != 'false') { $host_override = $args['server_host_override'];
$use_tls = true; }
}
$use_test_ca = false; $use_tls = false;
if (array_key_exists('use_test_ca', $args) && if (array_key_exists('use_tls', $args) &&
$args['use_test_ca'] != 'false') { $args['use_tls'] != 'false') {
$use_test_ca = true; $use_tls = true;
} }
$opts = []; $use_test_ca = false;
if (array_key_exists('use_test_ca', $args) &&
$args['use_test_ca'] != 'false') {
$use_test_ca = true;
}
if ($use_tls) { $opts = [];
if ($use_test_ca) {
$ssl_credentials = Grpc\ChannelCredentials::createSsl( if ($use_tls) {
file_get_contents(dirname(__FILE__).'/../data/ca.pem')); 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 { } else {
$ssl_credentials = Grpc\ChannelCredentials::createSsl(); $opts['credentials'] = Grpc\ChannelCredentials::createInsecure();
} }
$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', if (in_array($test_case, ['service_account_creds',
'compute_engine_creds', 'jwt_token_creds', ])) { 'compute_engine_creds', 'jwt_token_creds', ])) {
if ($test_case == 'jwt_token_creds') { if ($test_case == 'jwt_token_creds') {
$auth_credentials = ApplicationDefaultCredentials::getCredentials(); $auth_credentials = ApplicationDefaultCredentials::getCredentials();
} else { } else {
$auth_credentials = ApplicationDefaultCredentials::getCredentials(
$args['oauth_scope']
);
}
$opts['update_metadata'] = $auth_credentials->getUpdateMetadataFunc();
}
if ($test_case == 'oauth2_auth_token') {
$auth_credentials = ApplicationDefaultCredentials::getCredentials( $auth_credentials = ApplicationDefaultCredentials::getCredentials(
$args['oauth_scope'] $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;
} }
$opts['update_metadata'] = $auth_credentials->getUpdateMetadataFunc();
}
if ($test_case == 'oauth2_auth_token') { $stub = new grpc\testing\TestServiceClient($server_address, $opts);
$auth_credentials = ApplicationDefaultCredentials::getCredentials(
$args['oauth_scope'] echo "Connecting to $server_address\n";
); echo "Running test case $test_case\n";
$token = $auth_credentials->fetchAuthToken();
$update_metadata = switch ($test_case) {
function ($metadata, case 'empty_unary':
$authUri = null, emptyUnary($stub);
ClientInterface $client = null) use ($token) { break;
$metadata_copy = $metadata; case 'large_unary':
$metadata_copy[CredentialsLoader::AUTH_METADATA_KEY] = largeUnary($stub);
[sprintf('%s %s', break;
$token['token_type'], case 'client_streaming':
$token['access_token'])]; clientStreaming($stub);
break;
return $metadata_copy; case 'server_streaming':
}; serverStreaming($stub);
$opts['update_metadata'] = $update_metadata; 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);
}
} }
$stub = new grpc\testing\TestServiceClient($server_address, $opts); if (isset($_SERVER['PHP_SELF']) && preg_match('/interop_client/', $_SERVER['PHP_SELF'])) {
$args = getopt('', ['server_host:', 'server_port:', 'test_case:',
echo "Connecting to $server_address\n"; 'use_tls::', 'use_test_ca::',
echo "Running test case $test_case\n"; 'server_host_override:', 'oauth_scope:',
'default_service_account:', ]);
switch ($test_case) { interop_main($args);
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);
} }

@ -0,0 +1,17 @@
<?php
$args = getopt('', ['metric_server_address:', 'total_only::']);
$parts = explode(':', $args['metric_server_address']);
$server_host = $parts[0];
$server_port = (count($parts) == 2) ? $parts[1] : '';
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
if (@!socket_connect($socket, $server_host, $server_port)) {
echo "Cannot connect to merics server...\n";
exit(1);
}
socket_write($socket, 'qps');
while ($out = socket_read($socket, 1024)) {
echo "$out\n";
}
socket_close($socket);

@ -0,0 +1,83 @@
<?php
include_once('interop_client.php');
function stress_main($args) {
mt_srand();
set_time_limit(0);
// open socket to listen as metrics server
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
if (@!socket_bind($socket, 'localhost', $args['metrics_port'])) {
echo "Cannot create socket for metrics server...\n";
exit(1);
}
socket_listen($socket);
socket_set_nonblock($socket);
$start_time = microtime(true);
$count = 0;
$deadline = $args['test_duration_secs'] ?
($start_time + $args['test_duration_secs']) : false;
$num_test_cases = count($args['test_cases']);
while (true) {
$current_time = microtime(true);
if ($deadline && $current_time > $deadline) {
break;
}
if ($client_connection = socket_accept($socket)) {
// there is an incoming request, respond with qps metrics
$input = socket_read($client_connection, 1024);
$qps = round($count / ($current_time - $start_time));
socket_write($client_connection, "qps: $qps");
socket_close($client_connection);
} else {
// do actual work, run one interop test case
$args['test_case'] =
$args['test_cases'][mt_rand(0, $num_test_cases - 1)];
@interop_main($args);
$count++;
}
}
socket_close($socket);
echo "Number of interop tests run in $args[test_duration_secs] seconds: $count.\n";
}
// process command line arguments
$raw_args = getopt('',
['server_addresses::',
'test_cases:',
'metrics_port::',
'test_duration_secs::',
'num_channels_per_server::',
'num_stubs_per_channel::']);
$args = [];
if (empty($raw_args['server_addresses'])) {
$args['server_host'] = 'localhost';
$args['server_port'] = '8080';
} else {
$parts = explode(':', $raw_args['server_addresses']);
$args['server_host'] = $parts[0];
$args['server_port'] = (count($parts) == 2) ? $parts[1] : '';
}
$args['metrics_port'] = empty($raw_args['metrics_port']) ?
'8081' : $args['metrics_port'];
$args['test_duration_secs'] = empty($raw_args['test_duration_secs']) ||
$raw_args['test_duration_secs'] == -1 ?
false : $raw_args['test_duration_secs'];
$test_cases = [];
$test_case_strs = explode(',', $raw_args['test_cases']);
foreach ($test_case_strs as $test_case_str) {
$parts = explode(':', $test_case_str);
$test_cases = array_merge($test_cases, array_fill(0, $parts[1], $parts[0]));
}
$args['test_cases'] = $test_cases;
stress_main($args);
Loading…
Cancel
Save