xref: /aosp_15_r20/external/grpc-grpc/test/cpp/qps/server.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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