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