mirror of https://github.com/grpc/grpc.git
The C based gRPC (C++, Python, Ruby, Objective-C, PHP, C#)
https://grpc.io/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
3.2 KiB
94 lines
3.2 KiB
// |
|
// Copyright 2020 gRPC authors. |
|
// |
|
// Licensed under the Apache License, Version 2.0 (the "License"); |
|
// you may not use this file except in compliance with the License. |
|
// You may obtain a copy of the License at |
|
// |
|
// http://www.apache.org/licenses/LICENSE-2.0 |
|
// |
|
// Unless required by applicable law or agreed to in writing, software |
|
// distributed under the License is distributed on an "AS IS" BASIS, |
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
// See the License for the specific language governing permissions and |
|
// limitations under the License. |
|
// |
|
|
|
#include "absl/types/optional.h" |
|
|
|
#include "src/core/lib/gprpp/time.h" |
|
#include "src/proto/grpc/lookup/v1/rls.grpc.pb.h" |
|
#include "src/proto/grpc/lookup/v1/rls.pb.h" |
|
#include "test/cpp/end2end/counted_service.h" |
|
|
|
namespace grpc { |
|
namespace testing { |
|
|
|
using RlsService = |
|
CountedService<grpc::lookup::v1::RouteLookupService::Service>; |
|
|
|
class RlsServiceImpl : public RlsService { |
|
public: |
|
using ContextProcessingFunc = std::function<void(grpc::ServerContext*)>; |
|
|
|
explicit RlsServiceImpl(ContextProcessingFunc context_proc = nullptr) |
|
: context_proc_(std::move(context_proc)) {} |
|
|
|
grpc::Status RouteLookup( |
|
grpc::ServerContext* context, |
|
const grpc::lookup::v1::RouteLookupRequest* request, |
|
grpc::lookup::v1::RouteLookupResponse* response) override; |
|
|
|
void Start() {} |
|
|
|
void Shutdown() {} |
|
|
|
void SetResponse(grpc::lookup::v1::RouteLookupRequest request, |
|
grpc::lookup::v1::RouteLookupResponse response, |
|
grpc_core::Duration response_delay = grpc_core::Duration()); |
|
|
|
void RemoveResponse(const grpc::lookup::v1::RouteLookupRequest& request); |
|
|
|
std::vector<grpc::lookup::v1::RouteLookupRequest> GetUnmatchedRequests(); |
|
|
|
private: |
|
// Sorting thunk for RouteLookupRequest. |
|
struct RlsRequestLessThan { |
|
bool operator()(const grpc::lookup::v1::RouteLookupRequest& req1, |
|
const grpc::lookup::v1::RouteLookupRequest& req2) const { |
|
std::map<absl::string_view, absl::string_view> key_map1( |
|
req1.key_map().begin(), req1.key_map().end()); |
|
std::map<absl::string_view, absl::string_view> key_map2( |
|
req2.key_map().begin(), req2.key_map().end()); |
|
if (key_map1 < key_map2) return true; |
|
if (req1.reason() < req2.reason()) return true; |
|
if (req1.stale_header_data() < req2.stale_header_data()) return true; |
|
return false; |
|
} |
|
}; |
|
|
|
struct ResponseData { |
|
grpc::lookup::v1::RouteLookupResponse response; |
|
grpc_core::Duration response_delay; |
|
}; |
|
|
|
ContextProcessingFunc context_proc_; |
|
grpc::internal::Mutex mu_; |
|
std::map<grpc::lookup::v1::RouteLookupRequest, ResponseData, |
|
RlsRequestLessThan> |
|
responses_ ABSL_GUARDED_BY(&mu_); |
|
std::vector<grpc::lookup::v1::RouteLookupRequest> unmatched_requests_ |
|
ABSL_GUARDED_BY(&mu_); |
|
}; |
|
|
|
grpc::lookup::v1::RouteLookupRequest BuildRlsRequest( |
|
std::map<std::string, std::string> key, |
|
grpc::lookup::v1::RouteLookupRequest::Reason reason = |
|
grpc::lookup::v1::RouteLookupRequest::REASON_MISS, |
|
const char* stale_header_data = ""); |
|
|
|
grpc::lookup::v1::RouteLookupResponse BuildRlsResponse( |
|
std::vector<std::string> targets, const char* header_data = ""); |
|
|
|
} // namespace testing |
|
} // namespace grpc
|
|
|