• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1<?php
2/*
3 *
4 * Copyright 2016 gRPC authors.
5 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 *     http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 */
19
20include_once 'interop_client.php';
21
22function stress_main($args)
23{
24    mt_srand();
25    set_time_limit(0);
26
27    // open socket to listen as metrics server
28    $socket = socket_create(AF_INET, SOCK_STREAM, 0);
29    socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
30    if (@!socket_bind($socket, 'localhost', $args['metrics_port'])) {
31        echo "Cannot create socket for metrics server...\n";
32        exit(1);
33    }
34    socket_listen($socket);
35    socket_set_nonblock($socket);
36
37    $start_time = microtime(true);
38    $count = 0;
39    $deadline = $args['test_duration_secs'] ?
40                ($start_time + $args['test_duration_secs']) : false;
41    $num_test_cases = count($args['test_cases']);
42    $stub = false;
43
44    while (true) {
45        $current_time = microtime(true);
46        if ($deadline && $current_time > $deadline) {
47            break;
48        }
49        if ($client_connection = socket_accept($socket)) {
50            // there is an incoming request, respond with qps metrics
51            $input = socket_read($client_connection, 1024);
52            $qps = round($count / ($current_time - $start_time));
53            socket_write($client_connection, "qps: $qps");
54            socket_close($client_connection);
55        } else {
56            // do actual work, run one interop test case
57            $args['test_case'] =
58                $args['test_cases'][mt_rand(0, $num_test_cases - 1)];
59            $stub = @interop_main($args, $stub);
60            ++$count;
61        }
62    }
63    socket_close($socket);
64    echo "Number of interop tests run in $args[test_duration_secs] ".
65        "seconds: $count.\n";
66}
67
68// process command line arguments
69$raw_args = getopt('',
70  ['server_addresses::',
71   'test_cases:',
72   'metrics_port::',
73   'test_duration_secs::',
74   'num_channels_per_server::',
75   'num_stubs_per_channel::',
76  ]);
77
78$args = [];
79
80if (empty($raw_args['server_addresses'])) {
81    $args['server_host'] = 'localhost';
82    $args['server_port'] = '8080';
83} else {
84    $parts = explode(':', $raw_args['server_addresses']);
85    $args['server_host'] = $parts[0];
86    $args['server_port'] = (count($parts) == 2) ? $parts[1] : '';
87}
88
89$args['metrics_port'] = empty($raw_args['metrics_port']) ?
90    '8081' : $raw_args['metrics_port'];
91
92$args['test_duration_secs'] = empty($raw_args['test_duration_secs']) ||
93    $raw_args['test_duration_secs'] == -1 ?
94    false : $raw_args['test_duration_secs'];
95
96$test_cases = [];
97$test_case_strs = explode(',', $raw_args['test_cases']);
98foreach ($test_case_strs as $test_case_str) {
99    $parts = explode(':', $test_case_str);
100    $test_cases = array_merge($test_cases, array_fill(0, $parts[1], $parts[0]));
101}
102$args['test_cases'] = $test_cases;
103
104stress_main($args);
105