1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker //
3*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2015 gRPC authors.
4*cc02d7e2SAndroid Build Coastguard Worker //
5*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
6*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
7*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
8*cc02d7e2SAndroid Build Coastguard Worker //
9*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
10*cc02d7e2SAndroid Build Coastguard Worker //
11*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
12*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
13*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
15*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
16*cc02d7e2SAndroid Build Coastguard Worker // is % allowed in string
17*cc02d7e2SAndroid Build Coastguard Worker //
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Worker #include <memory>
20*cc02d7e2SAndroid Build Coastguard Worker #include <string>
21*cc02d7e2SAndroid Build Coastguard Worker #include <thread>
22*cc02d7e2SAndroid Build Coastguard Worker #include <utility>
23*cc02d7e2SAndroid Build Coastguard Worker #include <vector>
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard Worker #include "absl/flags/flag.h"
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/log.h>
28*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/time.h>
29*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/create_channel.h>
30*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/grpcpp.h>
31*cc02d7e2SAndroid Build Coastguard Worker
32*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/gprpp/crash.h"
33*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/metrics.grpc.pb.h"
34*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/metrics.pb.h"
35*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/interop/interop_client.h"
36*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/interop/stress_interop_client.h"
37*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/create_test_channel.h"
38*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/metrics_server.h"
39*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/test_config.h"
40*cc02d7e2SAndroid Build Coastguard Worker
41*cc02d7e2SAndroid Build Coastguard Worker extern void gpr_default_log(gpr_log_func_args* args);
42*cc02d7e2SAndroid Build Coastguard Worker
43*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(int32_t, metrics_port, 8081, "The metrics server port.");
44*cc02d7e2SAndroid Build Coastguard Worker
45*cc02d7e2SAndroid Build Coastguard Worker // TODO(Capstan): Consider using absl::Duration
46*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(int32_t, sleep_duration_ms, 0,
47*cc02d7e2SAndroid Build Coastguard Worker "The duration (in millisec) between two"
48*cc02d7e2SAndroid Build Coastguard Worker " consecutive test calls (per server) issued by the server.");
49*cc02d7e2SAndroid Build Coastguard Worker
50*cc02d7e2SAndroid Build Coastguard Worker // TODO(Capstan): Consider using absl::Duration
51*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(int32_t, test_duration_secs, -1,
52*cc02d7e2SAndroid Build Coastguard Worker "The length of time (in seconds) to run"
53*cc02d7e2SAndroid Build Coastguard Worker " the test. Enter -1 if the test should run continuously until"
54*cc02d7e2SAndroid Build Coastguard Worker " forcefully terminated.");
55*cc02d7e2SAndroid Build Coastguard Worker
56*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(std::string, server_addresses, "localhost:8080",
57*cc02d7e2SAndroid Build Coastguard Worker "The list of server addresses. The format is: \n"
58*cc02d7e2SAndroid Build Coastguard Worker " \"<name_1>:<port_1>,<name_2>:<port_1>...<name_N>:<port_N>\"\n"
59*cc02d7e2SAndroid Build Coastguard Worker " Note: <name> can be servername or IP address.");
60*cc02d7e2SAndroid Build Coastguard Worker
61*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(int32_t, num_channels_per_server, 1,
62*cc02d7e2SAndroid Build Coastguard Worker "Number of channels for each server");
63*cc02d7e2SAndroid Build Coastguard Worker
64*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(int32_t, num_stubs_per_channel, 1,
65*cc02d7e2SAndroid Build Coastguard Worker "Number of stubs per each channels to server. This number also "
66*cc02d7e2SAndroid Build Coastguard Worker "indicates the max number of parallel RPC calls on each channel "
67*cc02d7e2SAndroid Build Coastguard Worker "at any given time.");
68*cc02d7e2SAndroid Build Coastguard Worker
69*cc02d7e2SAndroid Build Coastguard Worker // TODO(sreek): Add more test cases here in future
70*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(std::string, test_cases, "",
71*cc02d7e2SAndroid Build Coastguard Worker "List of test cases to call along with the"
72*cc02d7e2SAndroid Build Coastguard Worker " relative weights in the following format:\n"
73*cc02d7e2SAndroid Build Coastguard Worker " \"<testcase_1:w_1>,<testcase_2:w_2>...<testcase_n:w_n>\"\n"
74*cc02d7e2SAndroid Build Coastguard Worker " The following testcases are currently supported:\n"
75*cc02d7e2SAndroid Build Coastguard Worker " empty_unary\n"
76*cc02d7e2SAndroid Build Coastguard Worker " large_unary\n"
77*cc02d7e2SAndroid Build Coastguard Worker " large_compressed_unary\n"
78*cc02d7e2SAndroid Build Coastguard Worker " client_streaming\n"
79*cc02d7e2SAndroid Build Coastguard Worker " server_streaming\n"
80*cc02d7e2SAndroid Build Coastguard Worker " server_compressed_streaming\n"
81*cc02d7e2SAndroid Build Coastguard Worker " slow_consumer\n"
82*cc02d7e2SAndroid Build Coastguard Worker " half_duplex\n"
83*cc02d7e2SAndroid Build Coastguard Worker " ping_pong\n"
84*cc02d7e2SAndroid Build Coastguard Worker " cancel_after_begin\n"
85*cc02d7e2SAndroid Build Coastguard Worker " cancel_after_first_response\n"
86*cc02d7e2SAndroid Build Coastguard Worker " timeout_on_sleeping_server\n"
87*cc02d7e2SAndroid Build Coastguard Worker " empty_stream\n"
88*cc02d7e2SAndroid Build Coastguard Worker " status_code_and_message\n"
89*cc02d7e2SAndroid Build Coastguard Worker " custom_metadata\n"
90*cc02d7e2SAndroid Build Coastguard Worker " Example: \"empty_unary:20,large_unary:10,empty_stream:70\"\n"
91*cc02d7e2SAndroid Build Coastguard Worker " The above will execute 'empty_unary', 20% of the time,"
92*cc02d7e2SAndroid Build Coastguard Worker " 'large_unary', 10% of the time and 'empty_stream' the remaining"
93*cc02d7e2SAndroid Build Coastguard Worker " 70% of the time");
94*cc02d7e2SAndroid Build Coastguard Worker
95*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(int32_t, log_level, GPR_LOG_SEVERITY_INFO,
96*cc02d7e2SAndroid Build Coastguard Worker "Severity level of messages that should be logged. Any messages "
97*cc02d7e2SAndroid Build Coastguard Worker "greater than or equal to the level set here will be logged. "
98*cc02d7e2SAndroid Build Coastguard Worker "The choices are: 0 (GPR_LOG_SEVERITY_DEBUG), 1 "
99*cc02d7e2SAndroid Build Coastguard Worker "(GPR_LOG_SEVERITY_INFO) and 2 (GPR_LOG_SEVERITY_ERROR)");
100*cc02d7e2SAndroid Build Coastguard Worker
101*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(bool, do_not_abort_on_transient_failures, true,
102*cc02d7e2SAndroid Build Coastguard Worker "If set to 'true', abort() is not called in case of transient "
103*cc02d7e2SAndroid Build Coastguard Worker "failures like temporary connection failures.");
104*cc02d7e2SAndroid Build Coastguard Worker
105*cc02d7e2SAndroid Build Coastguard Worker // Options from client.cc (for compatibility with interop test).
106*cc02d7e2SAndroid Build Coastguard Worker // TODO(sreek): Consolidate overlapping options
107*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(bool, use_alts, false,
108*cc02d7e2SAndroid Build Coastguard Worker "Whether to use alts. Enable alts will disable tls.");
109*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(bool, use_tls, false, "Whether to use tls.");
110*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(bool, use_test_ca, false, "False to use SSL roots for google");
111*cc02d7e2SAndroid Build Coastguard Worker ABSL_FLAG(std::string, server_host_override, "",
112*cc02d7e2SAndroid Build Coastguard Worker "Override the server host which is sent in HTTP header");
113*cc02d7e2SAndroid Build Coastguard Worker
114*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::ALTS;
115*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::INSECURE;
116*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::kTestCaseList;
117*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::MetricsServiceImpl;
118*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::StressTestInteropClient;
119*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::TestCaseType;
120*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::TLS;
121*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::transport_security;
122*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::UNKNOWN_TEST;
123*cc02d7e2SAndroid Build Coastguard Worker using grpc::testing::WeightedRandomTestSelector;
124*cc02d7e2SAndroid Build Coastguard Worker
125*cc02d7e2SAndroid Build Coastguard Worker static int log_level = GPR_LOG_SEVERITY_DEBUG;
126*cc02d7e2SAndroid Build Coastguard Worker
127*cc02d7e2SAndroid Build Coastguard Worker // A simple wrapper to grp_default_log() function. This only logs messages at or
128*cc02d7e2SAndroid Build Coastguard Worker // above the current log level (set in 'log_level' variable)
TestLogFunction(gpr_log_func_args * args)129*cc02d7e2SAndroid Build Coastguard Worker void TestLogFunction(gpr_log_func_args* args) {
130*cc02d7e2SAndroid Build Coastguard Worker if (args->severity >= log_level) {
131*cc02d7e2SAndroid Build Coastguard Worker gpr_default_log(args);
132*cc02d7e2SAndroid Build Coastguard Worker }
133*cc02d7e2SAndroid Build Coastguard Worker }
134*cc02d7e2SAndroid Build Coastguard Worker
GetTestTypeFromName(const std::string & test_name)135*cc02d7e2SAndroid Build Coastguard Worker TestCaseType GetTestTypeFromName(const std::string& test_name) {
136*cc02d7e2SAndroid Build Coastguard Worker TestCaseType test_case = UNKNOWN_TEST;
137*cc02d7e2SAndroid Build Coastguard Worker
138*cc02d7e2SAndroid Build Coastguard Worker for (auto it = kTestCaseList.begin(); it != kTestCaseList.end(); it++) {
139*cc02d7e2SAndroid Build Coastguard Worker if (test_name == it->second) {
140*cc02d7e2SAndroid Build Coastguard Worker test_case = it->first;
141*cc02d7e2SAndroid Build Coastguard Worker break;
142*cc02d7e2SAndroid Build Coastguard Worker }
143*cc02d7e2SAndroid Build Coastguard Worker }
144*cc02d7e2SAndroid Build Coastguard Worker
145*cc02d7e2SAndroid Build Coastguard Worker return test_case;
146*cc02d7e2SAndroid Build Coastguard Worker }
147*cc02d7e2SAndroid Build Coastguard Worker
148*cc02d7e2SAndroid Build Coastguard Worker // Converts a string of comma delimited tokens to a vector of tokens
ParseCommaDelimitedString(const std::string & comma_delimited_str,std::vector<std::string> & tokens)149*cc02d7e2SAndroid Build Coastguard Worker bool ParseCommaDelimitedString(const std::string& comma_delimited_str,
150*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string>& tokens) {
151*cc02d7e2SAndroid Build Coastguard Worker size_t bpos = 0;
152*cc02d7e2SAndroid Build Coastguard Worker size_t epos = std::string::npos;
153*cc02d7e2SAndroid Build Coastguard Worker
154*cc02d7e2SAndroid Build Coastguard Worker while ((epos = comma_delimited_str.find(',', bpos)) != std::string::npos) {
155*cc02d7e2SAndroid Build Coastguard Worker tokens.emplace_back(comma_delimited_str.substr(bpos, epos - bpos));
156*cc02d7e2SAndroid Build Coastguard Worker bpos = epos + 1;
157*cc02d7e2SAndroid Build Coastguard Worker }
158*cc02d7e2SAndroid Build Coastguard Worker
159*cc02d7e2SAndroid Build Coastguard Worker tokens.emplace_back(comma_delimited_str.substr(bpos)); // Last token
160*cc02d7e2SAndroid Build Coastguard Worker return true;
161*cc02d7e2SAndroid Build Coastguard Worker }
162*cc02d7e2SAndroid Build Coastguard Worker
163*cc02d7e2SAndroid Build Coastguard Worker // Input: Test case string "<testcase_name:weight>,<testcase_name:weight>...."
164*cc02d7e2SAndroid Build Coastguard Worker // Output:
165*cc02d7e2SAndroid Build Coastguard Worker // - Whether parsing was successful (return value)
166*cc02d7e2SAndroid Build Coastguard Worker // - Vector of (test_type_enum, weight) pairs returned via 'tests' parameter
ParseTestCasesString(const std::string & test_cases,std::vector<std::pair<TestCaseType,int>> & tests)167*cc02d7e2SAndroid Build Coastguard Worker bool ParseTestCasesString(const std::string& test_cases,
168*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::pair<TestCaseType, int>>& tests) {
169*cc02d7e2SAndroid Build Coastguard Worker bool is_success = true;
170*cc02d7e2SAndroid Build Coastguard Worker
171*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> tokens;
172*cc02d7e2SAndroid Build Coastguard Worker ParseCommaDelimitedString(test_cases, tokens);
173*cc02d7e2SAndroid Build Coastguard Worker
174*cc02d7e2SAndroid Build Coastguard Worker for (auto it = tokens.begin(); it != tokens.end(); it++) {
175*cc02d7e2SAndroid Build Coastguard Worker // Token is in the form <test_name>:<test_weight>
176*cc02d7e2SAndroid Build Coastguard Worker size_t colon_pos = it->find(':');
177*cc02d7e2SAndroid Build Coastguard Worker if (colon_pos == std::string::npos) {
178*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "Error in parsing test case string: %s", it->c_str());
179*cc02d7e2SAndroid Build Coastguard Worker is_success = false;
180*cc02d7e2SAndroid Build Coastguard Worker break;
181*cc02d7e2SAndroid Build Coastguard Worker }
182*cc02d7e2SAndroid Build Coastguard Worker
183*cc02d7e2SAndroid Build Coastguard Worker std::string test_name = it->substr(0, colon_pos);
184*cc02d7e2SAndroid Build Coastguard Worker int weight = std::stoi(it->substr(colon_pos + 1));
185*cc02d7e2SAndroid Build Coastguard Worker TestCaseType test_case = GetTestTypeFromName(test_name);
186*cc02d7e2SAndroid Build Coastguard Worker if (test_case == UNKNOWN_TEST) {
187*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "Unknown test case: %s", test_name.c_str());
188*cc02d7e2SAndroid Build Coastguard Worker is_success = false;
189*cc02d7e2SAndroid Build Coastguard Worker break;
190*cc02d7e2SAndroid Build Coastguard Worker }
191*cc02d7e2SAndroid Build Coastguard Worker
192*cc02d7e2SAndroid Build Coastguard Worker tests.emplace_back(std::make_pair(test_case, weight));
193*cc02d7e2SAndroid Build Coastguard Worker }
194*cc02d7e2SAndroid Build Coastguard Worker
195*cc02d7e2SAndroid Build Coastguard Worker return is_success;
196*cc02d7e2SAndroid Build Coastguard Worker }
197*cc02d7e2SAndroid Build Coastguard Worker
198*cc02d7e2SAndroid Build Coastguard Worker // For debugging purposes
LogParameterInfo(const std::vector<std::string> & addresses,const std::vector<std::pair<TestCaseType,int>> & tests)199*cc02d7e2SAndroid Build Coastguard Worker void LogParameterInfo(const std::vector<std::string>& addresses,
200*cc02d7e2SAndroid Build Coastguard Worker const std::vector<std::pair<TestCaseType, int>>& tests) {
201*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "server_addresses: %s",
202*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_server_addresses).c_str());
203*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "test_cases : %s", absl::GetFlag(FLAGS_test_cases).c_str());
204*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "sleep_duration_ms: %d",
205*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_sleep_duration_ms));
206*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "test_duration_secs: %d",
207*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_test_duration_secs));
208*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "num_channels_per_server: %d",
209*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_num_channels_per_server));
210*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "num_stubs_per_channel: %d",
211*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_num_stubs_per_channel));
212*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "log_level: %d", absl::GetFlag(FLAGS_log_level));
213*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "do_not_abort_on_transient_failures: %s",
214*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_do_not_abort_on_transient_failures) ? "true"
215*cc02d7e2SAndroid Build Coastguard Worker : "false");
216*cc02d7e2SAndroid Build Coastguard Worker
217*cc02d7e2SAndroid Build Coastguard Worker int num = 0;
218*cc02d7e2SAndroid Build Coastguard Worker for (auto it = addresses.begin(); it != addresses.end(); it++) {
219*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "%d:%s", ++num, it->c_str());
220*cc02d7e2SAndroid Build Coastguard Worker }
221*cc02d7e2SAndroid Build Coastguard Worker
222*cc02d7e2SAndroid Build Coastguard Worker num = 0;
223*cc02d7e2SAndroid Build Coastguard Worker for (auto it = tests.begin(); it != tests.end(); it++) {
224*cc02d7e2SAndroid Build Coastguard Worker TestCaseType test_case = it->first;
225*cc02d7e2SAndroid Build Coastguard Worker int weight = it->second;
226*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "%d. TestCaseType: %d, Weight: %d", ++num, test_case,
227*cc02d7e2SAndroid Build Coastguard Worker weight);
228*cc02d7e2SAndroid Build Coastguard Worker }
229*cc02d7e2SAndroid Build Coastguard Worker }
230*cc02d7e2SAndroid Build Coastguard Worker
main(int argc,char ** argv)231*cc02d7e2SAndroid Build Coastguard Worker int main(int argc, char** argv) {
232*cc02d7e2SAndroid Build Coastguard Worker grpc::testing::InitTest(&argc, &argv, true);
233*cc02d7e2SAndroid Build Coastguard Worker
234*cc02d7e2SAndroid Build Coastguard Worker if (absl::GetFlag(FLAGS_log_level) > GPR_LOG_SEVERITY_ERROR ||
235*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_log_level) < GPR_LOG_SEVERITY_DEBUG) {
236*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "log_level should be an integer between %d and %d",
237*cc02d7e2SAndroid Build Coastguard Worker GPR_LOG_SEVERITY_DEBUG, GPR_LOG_SEVERITY_ERROR);
238*cc02d7e2SAndroid Build Coastguard Worker return 1;
239*cc02d7e2SAndroid Build Coastguard Worker }
240*cc02d7e2SAndroid Build Coastguard Worker
241*cc02d7e2SAndroid Build Coastguard Worker // Change the default log function to TestLogFunction which respects the
242*cc02d7e2SAndroid Build Coastguard Worker // log_level setting.
243*cc02d7e2SAndroid Build Coastguard Worker log_level = absl::GetFlag(FLAGS_log_level);
244*cc02d7e2SAndroid Build Coastguard Worker gpr_set_log_function(TestLogFunction);
245*cc02d7e2SAndroid Build Coastguard Worker
246*cc02d7e2SAndroid Build Coastguard Worker srand(time(nullptr));
247*cc02d7e2SAndroid Build Coastguard Worker
248*cc02d7e2SAndroid Build Coastguard Worker // Parse the server addresses
249*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> server_addresses;
250*cc02d7e2SAndroid Build Coastguard Worker ParseCommaDelimitedString(absl::GetFlag(FLAGS_server_addresses),
251*cc02d7e2SAndroid Build Coastguard Worker server_addresses);
252*cc02d7e2SAndroid Build Coastguard Worker
253*cc02d7e2SAndroid Build Coastguard Worker // Parse test cases and weights
254*cc02d7e2SAndroid Build Coastguard Worker if (absl::GetFlag(FLAGS_test_cases).length() == 0) {
255*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "No test cases supplied");
256*cc02d7e2SAndroid Build Coastguard Worker return 1;
257*cc02d7e2SAndroid Build Coastguard Worker }
258*cc02d7e2SAndroid Build Coastguard Worker
259*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::pair<TestCaseType, int>> tests;
260*cc02d7e2SAndroid Build Coastguard Worker if (!ParseTestCasesString(absl::GetFlag(FLAGS_test_cases), tests)) {
261*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "Error in parsing test cases string %s ",
262*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_test_cases).c_str());
263*cc02d7e2SAndroid Build Coastguard Worker return 1;
264*cc02d7e2SAndroid Build Coastguard Worker }
265*cc02d7e2SAndroid Build Coastguard Worker
266*cc02d7e2SAndroid Build Coastguard Worker LogParameterInfo(server_addresses, tests);
267*cc02d7e2SAndroid Build Coastguard Worker
268*cc02d7e2SAndroid Build Coastguard Worker WeightedRandomTestSelector test_selector(tests);
269*cc02d7e2SAndroid Build Coastguard Worker MetricsServiceImpl metrics_service;
270*cc02d7e2SAndroid Build Coastguard Worker
271*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "Starting test(s)..");
272*cc02d7e2SAndroid Build Coastguard Worker
273*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::thread> test_threads;
274*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::unique_ptr<StressTestInteropClient>> clients;
275*cc02d7e2SAndroid Build Coastguard Worker
276*cc02d7e2SAndroid Build Coastguard Worker // Create and start the test threads.
277*cc02d7e2SAndroid Build Coastguard Worker // Note that:
278*cc02d7e2SAndroid Build Coastguard Worker // - Each server can have multiple channels (as configured by
279*cc02d7e2SAndroid Build Coastguard Worker // FLAGS_num_channels_per_server).
280*cc02d7e2SAndroid Build Coastguard Worker //
281*cc02d7e2SAndroid Build Coastguard Worker // - Each channel can have multiple stubs (as configured by
282*cc02d7e2SAndroid Build Coastguard Worker // FLAGS_num_stubs_per_channel). This is to test calling multiple RPCs in
283*cc02d7e2SAndroid Build Coastguard Worker // parallel on the same channel.
284*cc02d7e2SAndroid Build Coastguard Worker int thread_idx = 0;
285*cc02d7e2SAndroid Build Coastguard Worker int server_idx = -1;
286*cc02d7e2SAndroid Build Coastguard Worker char buffer[256];
287*cc02d7e2SAndroid Build Coastguard Worker transport_security security_type =
288*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_use_alts)
289*cc02d7e2SAndroid Build Coastguard Worker ? ALTS
290*cc02d7e2SAndroid Build Coastguard Worker : (absl::GetFlag(FLAGS_use_tls) ? TLS : INSECURE);
291*cc02d7e2SAndroid Build Coastguard Worker for (auto it = server_addresses.begin(); it != server_addresses.end(); it++) {
292*cc02d7e2SAndroid Build Coastguard Worker ++server_idx;
293*cc02d7e2SAndroid Build Coastguard Worker // Create channel(s) for each server
294*cc02d7e2SAndroid Build Coastguard Worker for (int channel_idx = 0;
295*cc02d7e2SAndroid Build Coastguard Worker channel_idx < absl::GetFlag(FLAGS_num_channels_per_server);
296*cc02d7e2SAndroid Build Coastguard Worker channel_idx++) {
297*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "Starting test with %s channel_idx=%d..", it->c_str(),
298*cc02d7e2SAndroid Build Coastguard Worker channel_idx);
299*cc02d7e2SAndroid Build Coastguard Worker grpc::testing::ChannelCreationFunc channel_creation_func =
300*cc02d7e2SAndroid Build Coastguard Worker std::bind(static_cast<std::shared_ptr<grpc::Channel> (*)(
301*cc02d7e2SAndroid Build Coastguard Worker const std::string&, const std::string&,
302*cc02d7e2SAndroid Build Coastguard Worker grpc::testing::transport_security, bool)>(
303*cc02d7e2SAndroid Build Coastguard Worker grpc::CreateTestChannel),
304*cc02d7e2SAndroid Build Coastguard Worker *it, absl::GetFlag(FLAGS_server_host_override),
305*cc02d7e2SAndroid Build Coastguard Worker security_type, !absl::GetFlag(FLAGS_use_test_ca));
306*cc02d7e2SAndroid Build Coastguard Worker
307*cc02d7e2SAndroid Build Coastguard Worker // Create stub(s) for each channel
308*cc02d7e2SAndroid Build Coastguard Worker for (int stub_idx = 0;
309*cc02d7e2SAndroid Build Coastguard Worker stub_idx < absl::GetFlag(FLAGS_num_stubs_per_channel); stub_idx++) {
310*cc02d7e2SAndroid Build Coastguard Worker clients.emplace_back(new StressTestInteropClient(
311*cc02d7e2SAndroid Build Coastguard Worker ++thread_idx, *it, channel_creation_func, test_selector,
312*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_test_duration_secs),
313*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_sleep_duration_ms),
314*cc02d7e2SAndroid Build Coastguard Worker absl::GetFlag(FLAGS_do_not_abort_on_transient_failures)));
315*cc02d7e2SAndroid Build Coastguard Worker
316*cc02d7e2SAndroid Build Coastguard Worker bool is_already_created = false;
317*cc02d7e2SAndroid Build Coastguard Worker // QpsGauge name
318*cc02d7e2SAndroid Build Coastguard Worker std::snprintf(buffer, sizeof(buffer),
319*cc02d7e2SAndroid Build Coastguard Worker "/stress_test/server_%d/channel_%d/stub_%d/qps",
320*cc02d7e2SAndroid Build Coastguard Worker server_idx, channel_idx, stub_idx);
321*cc02d7e2SAndroid Build Coastguard Worker
322*cc02d7e2SAndroid Build Coastguard Worker test_threads.emplace_back(std::thread(
323*cc02d7e2SAndroid Build Coastguard Worker &StressTestInteropClient::MainLoop, clients.back().get(),
324*cc02d7e2SAndroid Build Coastguard Worker metrics_service.CreateQpsGauge(buffer, &is_already_created)));
325*cc02d7e2SAndroid Build Coastguard Worker
326*cc02d7e2SAndroid Build Coastguard Worker // The QpsGauge should not have been already created
327*cc02d7e2SAndroid Build Coastguard Worker GPR_ASSERT(!is_already_created);
328*cc02d7e2SAndroid Build Coastguard Worker }
329*cc02d7e2SAndroid Build Coastguard Worker }
330*cc02d7e2SAndroid Build Coastguard Worker }
331*cc02d7e2SAndroid Build Coastguard Worker
332*cc02d7e2SAndroid Build Coastguard Worker // Start metrics server before waiting for the stress test threads
333*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<grpc::Server> metrics_server;
334*cc02d7e2SAndroid Build Coastguard Worker if (absl::GetFlag(FLAGS_metrics_port) > 0) {
335*cc02d7e2SAndroid Build Coastguard Worker metrics_server =
336*cc02d7e2SAndroid Build Coastguard Worker metrics_service.StartServer(absl::GetFlag(FLAGS_metrics_port));
337*cc02d7e2SAndroid Build Coastguard Worker }
338*cc02d7e2SAndroid Build Coastguard Worker
339*cc02d7e2SAndroid Build Coastguard Worker // Wait for the stress test threads to complete
340*cc02d7e2SAndroid Build Coastguard Worker for (auto it = test_threads.begin(); it != test_threads.end(); it++) {
341*cc02d7e2SAndroid Build Coastguard Worker it->join();
342*cc02d7e2SAndroid Build Coastguard Worker }
343*cc02d7e2SAndroid Build Coastguard Worker
344*cc02d7e2SAndroid Build Coastguard Worker return 0;
345*cc02d7e2SAndroid Build Coastguard Worker }
346