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 // 17*cc02d7e2SAndroid Build Coastguard Worker // 18*cc02d7e2SAndroid Build Coastguard Worker 19*cc02d7e2SAndroid Build Coastguard Worker #ifndef GRPC_TEST_CPP_QPS_SERVER_H 20*cc02d7e2SAndroid Build Coastguard Worker #define GRPC_TEST_CPP_QPS_SERVER_H 21*cc02d7e2SAndroid Build Coastguard Worker 22*cc02d7e2SAndroid Build Coastguard Worker #include <vector> 23*cc02d7e2SAndroid Build Coastguard Worker 24*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/cpu.h> 25*cc02d7e2SAndroid Build Coastguard Worker #include <grpc/support/log.h> 26*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/channel.h> 27*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/resource_quota.h> 28*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/security/server_credentials.h> 29*cc02d7e2SAndroid Build Coastguard Worker #include <grpcpp/server_builder.h> 30*cc02d7e2SAndroid Build Coastguard Worker 31*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/gprpp/crash.h" 32*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/control.pb.h" 33*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/testing/messages.pb.h" 34*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/end2end/data/ssl_test_data.h" 35*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/util/port.h" 36*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/qps/usage_timer.h" 37*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/util/test_credentials_provider.h" 38*cc02d7e2SAndroid Build Coastguard Worker 39*cc02d7e2SAndroid Build Coastguard Worker namespace grpc { 40*cc02d7e2SAndroid Build Coastguard Worker namespace testing { 41*cc02d7e2SAndroid Build Coastguard Worker 42*cc02d7e2SAndroid Build Coastguard Worker class Server { 43*cc02d7e2SAndroid Build Coastguard Worker public: Server(const ServerConfig & config)44*cc02d7e2SAndroid Build Coastguard Worker explicit Server(const ServerConfig& config) 45*cc02d7e2SAndroid Build Coastguard Worker : timer_(new UsageTimer), last_reset_poll_count_(0) { 46*cc02d7e2SAndroid Build Coastguard Worker cores_ = gpr_cpu_num_cores(); 47*cc02d7e2SAndroid Build Coastguard Worker if (config.port()) { // positive for a fixed port, negative for inproc 48*cc02d7e2SAndroid Build Coastguard Worker port_ = config.port(); 49*cc02d7e2SAndroid Build Coastguard Worker } else { // zero for dynamic port 50*cc02d7e2SAndroid Build Coastguard Worker port_ = grpc_pick_unused_port_or_die(); 51*cc02d7e2SAndroid Build Coastguard Worker } 52*cc02d7e2SAndroid Build Coastguard Worker } ~Server()53*cc02d7e2SAndroid Build Coastguard Worker virtual ~Server() {} 54*cc02d7e2SAndroid Build Coastguard Worker Mark(bool reset)55*cc02d7e2SAndroid Build Coastguard Worker ServerStats Mark(bool reset) { 56*cc02d7e2SAndroid Build Coastguard Worker UsageTimer::Result timer_result; 57*cc02d7e2SAndroid Build Coastguard Worker int cur_poll_count = GetPollCount(); 58*cc02d7e2SAndroid Build Coastguard Worker int poll_count = cur_poll_count - last_reset_poll_count_; 59*cc02d7e2SAndroid Build Coastguard Worker if (reset) { 60*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<UsageTimer> timer(new UsageTimer); 61*cc02d7e2SAndroid Build Coastguard Worker timer.swap(timer_); 62*cc02d7e2SAndroid Build Coastguard Worker timer_result = timer->Mark(); 63*cc02d7e2SAndroid Build Coastguard Worker last_reset_poll_count_ = cur_poll_count; 64*cc02d7e2SAndroid Build Coastguard Worker } else { 65*cc02d7e2SAndroid Build Coastguard Worker timer_result = timer_->Mark(); 66*cc02d7e2SAndroid Build Coastguard Worker } 67*cc02d7e2SAndroid Build Coastguard Worker 68*cc02d7e2SAndroid Build Coastguard Worker ServerStats stats; 69*cc02d7e2SAndroid Build Coastguard Worker stats.set_time_elapsed(timer_result.wall); 70*cc02d7e2SAndroid Build Coastguard Worker stats.set_time_system(timer_result.system); 71*cc02d7e2SAndroid Build Coastguard Worker stats.set_time_user(timer_result.user); 72*cc02d7e2SAndroid Build Coastguard Worker stats.set_total_cpu_time(timer_result.total_cpu_time); 73*cc02d7e2SAndroid Build Coastguard Worker stats.set_idle_cpu_time(timer_result.idle_cpu_time); 74*cc02d7e2SAndroid Build Coastguard Worker stats.set_cq_poll_count(poll_count); 75*cc02d7e2SAndroid Build Coastguard Worker return stats; 76*cc02d7e2SAndroid Build Coastguard Worker } 77*cc02d7e2SAndroid Build Coastguard Worker SetPayload(PayloadType type,int size,Payload * payload)78*cc02d7e2SAndroid Build Coastguard Worker static bool SetPayload(PayloadType type, int size, Payload* payload) { 79*cc02d7e2SAndroid Build Coastguard Worker // TODO(yangg): Support UNCOMPRESSABLE payload. 80*cc02d7e2SAndroid Build Coastguard Worker if (type != PayloadType::COMPRESSABLE) { 81*cc02d7e2SAndroid Build Coastguard Worker return false; 82*cc02d7e2SAndroid Build Coastguard Worker } 83*cc02d7e2SAndroid Build Coastguard Worker payload->set_type(type); 84*cc02d7e2SAndroid Build Coastguard Worker // Don't waste time creating a new payload of identical size. 85*cc02d7e2SAndroid Build Coastguard Worker if (payload->body().length() != static_cast<size_t>(size)) { 86*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<char[]> body(new char[size]()); 87*cc02d7e2SAndroid Build Coastguard Worker payload->set_body(body.get(), size); 88*cc02d7e2SAndroid Build Coastguard Worker } 89*cc02d7e2SAndroid Build Coastguard Worker return true; 90*cc02d7e2SAndroid Build Coastguard Worker } 91*cc02d7e2SAndroid Build Coastguard Worker port()92*cc02d7e2SAndroid Build Coastguard Worker int port() const { return port_; } cores()93*cc02d7e2SAndroid Build Coastguard Worker int cores() const { return cores_; } CreateServerCredentials(const ServerConfig & config)94*cc02d7e2SAndroid Build Coastguard Worker static std::shared_ptr<ServerCredentials> CreateServerCredentials( 95*cc02d7e2SAndroid Build Coastguard Worker const ServerConfig& config) { 96*cc02d7e2SAndroid Build Coastguard Worker if (config.has_security_params()) { 97*cc02d7e2SAndroid Build Coastguard Worker std::string type; 98*cc02d7e2SAndroid Build Coastguard Worker if (config.security_params().cred_type().empty()) { 99*cc02d7e2SAndroid Build Coastguard Worker type = kTlsCredentialsType; 100*cc02d7e2SAndroid Build Coastguard Worker } else { 101*cc02d7e2SAndroid Build Coastguard Worker type = config.security_params().cred_type(); 102*cc02d7e2SAndroid Build Coastguard Worker } 103*cc02d7e2SAndroid Build Coastguard Worker 104*cc02d7e2SAndroid Build Coastguard Worker return GetCredentialsProvider()->GetServerCredentials(type); 105*cc02d7e2SAndroid Build Coastguard Worker } else { 106*cc02d7e2SAndroid Build Coastguard Worker return InsecureServerCredentials(); 107*cc02d7e2SAndroid Build Coastguard Worker } 108*cc02d7e2SAndroid Build Coastguard Worker } 109*cc02d7e2SAndroid Build Coastguard Worker GetPollCount()110*cc02d7e2SAndroid Build Coastguard Worker virtual int GetPollCount() { 111*cc02d7e2SAndroid Build Coastguard Worker // For sync server. 112*cc02d7e2SAndroid Build Coastguard Worker return 0; 113*cc02d7e2SAndroid Build Coastguard Worker } 114*cc02d7e2SAndroid Build Coastguard Worker 115*cc02d7e2SAndroid Build Coastguard Worker virtual std::shared_ptr<Channel> InProcessChannel( 116*cc02d7e2SAndroid Build Coastguard Worker const ChannelArguments& args) = 0; 117*cc02d7e2SAndroid Build Coastguard Worker 118*cc02d7e2SAndroid Build Coastguard Worker protected: ApplyConfigToBuilder(const ServerConfig & config,ServerBuilder * builder)119*cc02d7e2SAndroid Build Coastguard Worker static void ApplyConfigToBuilder(const ServerConfig& config, 120*cc02d7e2SAndroid Build Coastguard Worker ServerBuilder* builder) { 121*cc02d7e2SAndroid Build Coastguard Worker if (config.resource_quota_size() > 0) { 122*cc02d7e2SAndroid Build Coastguard Worker builder->SetResourceQuota(ResourceQuota("AsyncQpsServerTest") 123*cc02d7e2SAndroid Build Coastguard Worker .Resize(config.resource_quota_size())); 124*cc02d7e2SAndroid Build Coastguard Worker } 125*cc02d7e2SAndroid Build Coastguard Worker for (const auto& channel_arg : config.channel_args()) { 126*cc02d7e2SAndroid Build Coastguard Worker switch (channel_arg.value_case()) { 127*cc02d7e2SAndroid Build Coastguard Worker case ChannelArg::kStrValue: 128*cc02d7e2SAndroid Build Coastguard Worker builder->AddChannelArgument(channel_arg.name(), 129*cc02d7e2SAndroid Build Coastguard Worker channel_arg.str_value()); 130*cc02d7e2SAndroid Build Coastguard Worker break; 131*cc02d7e2SAndroid Build Coastguard Worker case ChannelArg::kIntValue: 132*cc02d7e2SAndroid Build Coastguard Worker builder->AddChannelArgument(channel_arg.name(), 133*cc02d7e2SAndroid Build Coastguard Worker channel_arg.int_value()); 134*cc02d7e2SAndroid Build Coastguard Worker break; 135*cc02d7e2SAndroid Build Coastguard Worker case ChannelArg::VALUE_NOT_SET: 136*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_ERROR, "Channel arg '%s' does not have a value", 137*cc02d7e2SAndroid Build Coastguard Worker channel_arg.name().c_str()); 138*cc02d7e2SAndroid Build Coastguard Worker break; 139*cc02d7e2SAndroid Build Coastguard Worker } 140*cc02d7e2SAndroid Build Coastguard Worker } 141*cc02d7e2SAndroid Build Coastguard Worker } 142*cc02d7e2SAndroid Build Coastguard Worker 143*cc02d7e2SAndroid Build Coastguard Worker private: 144*cc02d7e2SAndroid Build Coastguard Worker int port_; 145*cc02d7e2SAndroid Build Coastguard Worker int cores_; 146*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<UsageTimer> timer_; 147*cc02d7e2SAndroid Build Coastguard Worker int last_reset_poll_count_; 148*cc02d7e2SAndroid Build Coastguard Worker }; 149*cc02d7e2SAndroid Build Coastguard Worker 150*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<Server> CreateSynchronousServer(const ServerConfig& config); 151*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<Server> CreateAsyncServer(const ServerConfig& config); 152*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<Server> CreateAsyncGenericServer(const ServerConfig& config); 153*cc02d7e2SAndroid Build Coastguard Worker std::unique_ptr<Server> CreateCallbackServer(const ServerConfig& config); 154*cc02d7e2SAndroid Build Coastguard Worker 155*cc02d7e2SAndroid Build Coastguard Worker } // namespace testing 156*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc 157*cc02d7e2SAndroid Build Coastguard Worker 158*cc02d7e2SAndroid Build Coastguard Worker #endif // GRPC_TEST_CPP_QPS_SERVER_H 159