xref: /aosp_15_r20/external/grpc-grpc/test/cpp/end2end/rls_server.h (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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 #ifndef GRPC_TEST_CPP_END2END_RLS_SERVER_H
18*cc02d7e2SAndroid Build Coastguard Worker #define GRPC_TEST_CPP_END2END_RLS_SERVER_H
19*cc02d7e2SAndroid Build Coastguard Worker 
20*cc02d7e2SAndroid Build Coastguard Worker #include "absl/types/optional.h"
21*cc02d7e2SAndroid Build Coastguard Worker 
22*cc02d7e2SAndroid Build Coastguard Worker #include "src/core/lib/gprpp/time.h"
23*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/lookup/v1/rls.grpc.pb.h"
24*cc02d7e2SAndroid Build Coastguard Worker #include "src/proto/grpc/lookup/v1/rls.pb.h"
25*cc02d7e2SAndroid Build Coastguard Worker #include "test/cpp/end2end/counted_service.h"
26*cc02d7e2SAndroid Build Coastguard Worker 
27*cc02d7e2SAndroid Build Coastguard Worker namespace grpc {
28*cc02d7e2SAndroid Build Coastguard Worker namespace testing {
29*cc02d7e2SAndroid Build Coastguard Worker 
30*cc02d7e2SAndroid Build Coastguard Worker using RlsService =
31*cc02d7e2SAndroid Build Coastguard Worker     CountedService<grpc::lookup::v1::RouteLookupService::Service>;
32*cc02d7e2SAndroid Build Coastguard Worker 
33*cc02d7e2SAndroid Build Coastguard Worker class RlsServiceImpl : public RlsService {
34*cc02d7e2SAndroid Build Coastguard Worker  public:
35*cc02d7e2SAndroid Build Coastguard Worker   using ContextProcessingFunc = std::function<void(grpc::ServerContext*)>;
36*cc02d7e2SAndroid Build Coastguard Worker 
37*cc02d7e2SAndroid Build Coastguard Worker   explicit RlsServiceImpl(ContextProcessingFunc context_proc = nullptr)
context_proc_(std::move (context_proc))38*cc02d7e2SAndroid Build Coastguard Worker       : context_proc_(std::move(context_proc)) {}
39*cc02d7e2SAndroid Build Coastguard Worker 
40*cc02d7e2SAndroid Build Coastguard Worker   grpc::Status RouteLookup(
41*cc02d7e2SAndroid Build Coastguard Worker       grpc::ServerContext* context,
42*cc02d7e2SAndroid Build Coastguard Worker       const grpc::lookup::v1::RouteLookupRequest* request,
43*cc02d7e2SAndroid Build Coastguard Worker       grpc::lookup::v1::RouteLookupResponse* response) override;
44*cc02d7e2SAndroid Build Coastguard Worker 
Start()45*cc02d7e2SAndroid Build Coastguard Worker   void Start() {}
46*cc02d7e2SAndroid Build Coastguard Worker 
Shutdown()47*cc02d7e2SAndroid Build Coastguard Worker   void Shutdown() {}
48*cc02d7e2SAndroid Build Coastguard Worker 
49*cc02d7e2SAndroid Build Coastguard Worker   void SetResponse(grpc::lookup::v1::RouteLookupRequest request,
50*cc02d7e2SAndroid Build Coastguard Worker                    grpc::lookup::v1::RouteLookupResponse response,
51*cc02d7e2SAndroid Build Coastguard Worker                    grpc_core::Duration response_delay = grpc_core::Duration());
52*cc02d7e2SAndroid Build Coastguard Worker 
53*cc02d7e2SAndroid Build Coastguard Worker   void RemoveResponse(const grpc::lookup::v1::RouteLookupRequest& request);
54*cc02d7e2SAndroid Build Coastguard Worker 
55*cc02d7e2SAndroid Build Coastguard Worker   std::vector<grpc::lookup::v1::RouteLookupRequest> GetUnmatchedRequests();
56*cc02d7e2SAndroid Build Coastguard Worker 
57*cc02d7e2SAndroid Build Coastguard Worker  private:
58*cc02d7e2SAndroid Build Coastguard Worker   // Sorting thunk for RouteLookupRequest.
59*cc02d7e2SAndroid Build Coastguard Worker   struct RlsRequestLessThan {
operatorRlsRequestLessThan60*cc02d7e2SAndroid Build Coastguard Worker     bool operator()(const grpc::lookup::v1::RouteLookupRequest& req1,
61*cc02d7e2SAndroid Build Coastguard Worker                     const grpc::lookup::v1::RouteLookupRequest& req2) const {
62*cc02d7e2SAndroid Build Coastguard Worker       std::map<absl::string_view, absl::string_view> key_map1(
63*cc02d7e2SAndroid Build Coastguard Worker           req1.key_map().begin(), req1.key_map().end());
64*cc02d7e2SAndroid Build Coastguard Worker       std::map<absl::string_view, absl::string_view> key_map2(
65*cc02d7e2SAndroid Build Coastguard Worker           req2.key_map().begin(), req2.key_map().end());
66*cc02d7e2SAndroid Build Coastguard Worker       if (key_map1 < key_map2) return true;
67*cc02d7e2SAndroid Build Coastguard Worker       if (req1.reason() < req2.reason()) return true;
68*cc02d7e2SAndroid Build Coastguard Worker       if (req1.stale_header_data() < req2.stale_header_data()) return true;
69*cc02d7e2SAndroid Build Coastguard Worker       return false;
70*cc02d7e2SAndroid Build Coastguard Worker     }
71*cc02d7e2SAndroid Build Coastguard Worker   };
72*cc02d7e2SAndroid Build Coastguard Worker 
73*cc02d7e2SAndroid Build Coastguard Worker   struct ResponseData {
74*cc02d7e2SAndroid Build Coastguard Worker     grpc::lookup::v1::RouteLookupResponse response;
75*cc02d7e2SAndroid Build Coastguard Worker     grpc_core::Duration response_delay;
76*cc02d7e2SAndroid Build Coastguard Worker   };
77*cc02d7e2SAndroid Build Coastguard Worker 
78*cc02d7e2SAndroid Build Coastguard Worker   ContextProcessingFunc context_proc_;
79*cc02d7e2SAndroid Build Coastguard Worker   grpc::internal::Mutex mu_;
80*cc02d7e2SAndroid Build Coastguard Worker   std::map<grpc::lookup::v1::RouteLookupRequest, ResponseData,
81*cc02d7e2SAndroid Build Coastguard Worker            RlsRequestLessThan>
82*cc02d7e2SAndroid Build Coastguard Worker       responses_ ABSL_GUARDED_BY(&mu_);
83*cc02d7e2SAndroid Build Coastguard Worker   std::vector<grpc::lookup::v1::RouteLookupRequest> unmatched_requests_
84*cc02d7e2SAndroid Build Coastguard Worker       ABSL_GUARDED_BY(&mu_);
85*cc02d7e2SAndroid Build Coastguard Worker };
86*cc02d7e2SAndroid Build Coastguard Worker 
87*cc02d7e2SAndroid Build Coastguard Worker grpc::lookup::v1::RouteLookupRequest BuildRlsRequest(
88*cc02d7e2SAndroid Build Coastguard Worker     std::map<std::string, std::string> key,
89*cc02d7e2SAndroid Build Coastguard Worker     grpc::lookup::v1::RouteLookupRequest::Reason reason =
90*cc02d7e2SAndroid Build Coastguard Worker         grpc::lookup::v1::RouteLookupRequest::REASON_MISS,
91*cc02d7e2SAndroid Build Coastguard Worker     const char* stale_header_data = "");
92*cc02d7e2SAndroid Build Coastguard Worker 
93*cc02d7e2SAndroid Build Coastguard Worker grpc::lookup::v1::RouteLookupResponse BuildRlsResponse(
94*cc02d7e2SAndroid Build Coastguard Worker     std::vector<std::string> targets, const char* header_data = "");
95*cc02d7e2SAndroid Build Coastguard Worker 
96*cc02d7e2SAndroid Build Coastguard Worker }  // namespace testing
97*cc02d7e2SAndroid Build Coastguard Worker }  // namespace grpc
98*cc02d7e2SAndroid Build Coastguard Worker 
99*cc02d7e2SAndroid Build Coastguard Worker #endif  // GRPC_TEST_CPP_END2END_RLS_SERVER_H
100