1*cc02d7e2SAndroid Build Coastguard Worker //
2*cc02d7e2SAndroid Build Coastguard Worker // Copyright 2020 gRPC authors.
3*cc02d7e2SAndroid Build Coastguard Worker //
4*cc02d7e2SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*cc02d7e2SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*cc02d7e2SAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*cc02d7e2SAndroid Build Coastguard Worker //
8*cc02d7e2SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
9*cc02d7e2SAndroid Build Coastguard Worker //
10*cc02d7e2SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*cc02d7e2SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*cc02d7e2SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*cc02d7e2SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*cc02d7e2SAndroid Build Coastguard Worker // limitations under the License.
15*cc02d7e2SAndroid Build Coastguard Worker //
16*cc02d7e2SAndroid Build Coastguard Worker
17*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/end2end/rls_server.h"
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Worker #include <gmock/gmock.h>
20*cc02d7e2SAndroid Build Coastguard Worker
21*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/lookup/v1/rls.grpc.pb.h"
22*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/lookup/v1/rls.pb.h"
23*cc02d7e2SAndroid Build Coastguard Worker #include "test/core/util/test_config.h"
24*cc02d7e2SAndroid Build Coastguard Worker
25*cc02d7e2SAndroid Build Coastguard Worker using ::grpc::lookup::v1::RouteLookupRequest;
26*cc02d7e2SAndroid Build Coastguard Worker using ::grpc::lookup::v1::RouteLookupResponse;
27*cc02d7e2SAndroid Build Coastguard Worker
28*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
29*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
30*cc02d7e2SAndroid Build Coastguard Worker
RouteLookup(grpc::ServerContext * context,const RouteLookupRequest * request,RouteLookupResponse * response)31*cc02d7e2SAndroid Build Coastguard Worker ::grpc::Status RlsServiceImpl::RouteLookup(grpc::ServerContext* context,
32*cc02d7e2SAndroid Build Coastguard Worker const RouteLookupRequest* request,
33*cc02d7e2SAndroid Build Coastguard Worker RouteLookupResponse* response) {
34*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "RLS: Received request: %s",
35*cc02d7e2SAndroid Build Coastguard Worker request->DebugString().c_str());
36*cc02d7e2SAndroid Build Coastguard Worker if (context_proc_ != nullptr) {
37*cc02d7e2SAndroid Build Coastguard Worker context_proc_(context);
38*cc02d7e2SAndroid Build Coastguard Worker }
39*cc02d7e2SAndroid Build Coastguard Worker IncreaseRequestCount();
40*cc02d7e2SAndroid Build Coastguard Worker EXPECT_EQ(request->target_type(), "grpc");
41*cc02d7e2SAndroid Build Coastguard Worker // See if we have a configured response for this request.
42*cc02d7e2SAndroid Build Coastguard Worker ResponseData res;
43*cc02d7e2SAndroid Build Coastguard Worker {
44*cc02d7e2SAndroid Build Coastguard Worker grpc::internal::MutexLock lock(&mu_);
45*cc02d7e2SAndroid Build Coastguard Worker auto it = responses_.find(*request);
46*cc02d7e2SAndroid Build Coastguard Worker if (it == responses_.end()) {
47*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "RLS: no matching request, returning INTERNAL");
48*cc02d7e2SAndroid Build Coastguard Worker unmatched_requests_.push_back(*request);
49*cc02d7e2SAndroid Build Coastguard Worker return Status(StatusCode::INTERNAL, "no response entry");
50*cc02d7e2SAndroid Build Coastguard Worker }
51*cc02d7e2SAndroid Build Coastguard Worker res = it->second;
52*cc02d7e2SAndroid Build Coastguard Worker }
53*cc02d7e2SAndroid Build Coastguard Worker // Configured response found, so use it.
54*cc02d7e2SAndroid Build Coastguard Worker if (res.response_delay > grpc_core::Duration::Zero()) {
55*cc02d7e2SAndroid Build Coastguard Worker gpr_sleep_until(
56*cc02d7e2SAndroid Build Coastguard Worker grpc_timeout_milliseconds_to_deadline(res.response_delay.millis()));
57*cc02d7e2SAndroid Build Coastguard Worker }
58*cc02d7e2SAndroid Build Coastguard Worker IncreaseResponseCount();
59*cc02d7e2SAndroid Build Coastguard Worker *response = res.response;
60*cc02d7e2SAndroid Build Coastguard Worker gpr_log(GPR_INFO, "RLS: returning configured response: %s",
61*cc02d7e2SAndroid Build Coastguard Worker response->DebugString().c_str());
62*cc02d7e2SAndroid Build Coastguard Worker return Status::OK;
63*cc02d7e2SAndroid Build Coastguard Worker }
64*cc02d7e2SAndroid Build Coastguard Worker
SetResponse(RouteLookupRequest request,RouteLookupResponse response,grpc_core::Duration response_delay)65*cc02d7e2SAndroid Build Coastguard Worker void RlsServiceImpl::SetResponse(RouteLookupRequest request,
66*cc02d7e2SAndroid Build Coastguard Worker RouteLookupResponse response,
67*cc02d7e2SAndroid Build Coastguard Worker grpc_core::Duration response_delay) {
68*cc02d7e2SAndroid Build Coastguard Worker grpc::internal::MutexLock lock(&mu_);
69*cc02d7e2SAndroid Build Coastguard Worker responses_[std::move(request)] = {std::move(response), response_delay};
70*cc02d7e2SAndroid Build Coastguard Worker }
71*cc02d7e2SAndroid Build Coastguard Worker
RemoveResponse(const RouteLookupRequest & request)72*cc02d7e2SAndroid Build Coastguard Worker void RlsServiceImpl::RemoveResponse(const RouteLookupRequest& request) {
73*cc02d7e2SAndroid Build Coastguard Worker grpc::internal::MutexLock lock(&mu_);
74*cc02d7e2SAndroid Build Coastguard Worker responses_.erase(request);
75*cc02d7e2SAndroid Build Coastguard Worker }
76*cc02d7e2SAndroid Build Coastguard Worker
GetUnmatchedRequests()77*cc02d7e2SAndroid Build Coastguard Worker std::vector<RouteLookupRequest> RlsServiceImpl::GetUnmatchedRequests() {
78*cc02d7e2SAndroid Build Coastguard Worker grpc::internal::MutexLock lock(&mu_);
79*cc02d7e2SAndroid Build Coastguard Worker return std::move(unmatched_requests_);
80*cc02d7e2SAndroid Build Coastguard Worker }
81*cc02d7e2SAndroid Build Coastguard Worker
BuildRlsRequest(std::map<std::string,std::string> key,grpc::lookup::v1::RouteLookupRequest::Reason reason,const char * stale_header_data)82*cc02d7e2SAndroid Build Coastguard Worker grpc::lookup::v1::RouteLookupRequest BuildRlsRequest(
83*cc02d7e2SAndroid Build Coastguard Worker std::map<std::string, std::string> key,
84*cc02d7e2SAndroid Build Coastguard Worker grpc::lookup::v1::RouteLookupRequest::Reason reason,
85*cc02d7e2SAndroid Build Coastguard Worker const char* stale_header_data) {
86*cc02d7e2SAndroid Build Coastguard Worker grpc::lookup::v1::RouteLookupRequest request;
87*cc02d7e2SAndroid Build Coastguard Worker request.set_target_type("grpc");
88*cc02d7e2SAndroid Build Coastguard Worker request.mutable_key_map()->insert(key.begin(), key.end());
89*cc02d7e2SAndroid Build Coastguard Worker request.set_reason(reason);
90*cc02d7e2SAndroid Build Coastguard Worker request.set_stale_header_data(stale_header_data);
91*cc02d7e2SAndroid Build Coastguard Worker return request;
92*cc02d7e2SAndroid Build Coastguard Worker }
93*cc02d7e2SAndroid Build Coastguard Worker
BuildRlsResponse(std::vector<std::string> targets,const char * header_data)94*cc02d7e2SAndroid Build Coastguard Worker grpc::lookup::v1::RouteLookupResponse BuildRlsResponse(
95*cc02d7e2SAndroid Build Coastguard Worker std::vector<std::string> targets, const char* header_data) {
96*cc02d7e2SAndroid Build Coastguard Worker grpc::lookup::v1::RouteLookupResponse response;
97*cc02d7e2SAndroid Build Coastguard Worker response.mutable_targets()->Add(targets.begin(), targets.end());
98*cc02d7e2SAndroid Build Coastguard Worker response.set_header_data(header_data);
99*cc02d7e2SAndroid Build Coastguard Worker return response;
100*cc02d7e2SAndroid Build Coastguard Worker }
101*cc02d7e2SAndroid Build Coastguard Worker
102*cc02d7e2SAndroid Build Coastguard Worker } // namespace testing
103*cc02d7e2SAndroid Build Coastguard Worker } // namespace grpc
104