3 * Copyright 2018 gRPC authors.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
19 #include "test/cpp/end2end/interceptors_util.h"
24 std::atomic<int> DummyInterceptor::num_times_run_;
25 std::atomic<int> DummyInterceptor::num_times_run_reverse_;
26 std::atomic<int> DummyInterceptor::num_times_cancel_;
28 void MakeCall(const std::shared_ptr<Channel>& channel) {
29 auto stub = grpc::testing::EchoTestService::NewStub(channel);
32 req.mutable_param()->set_echo_metadata(true);
33 ctx.AddMetadata("testkey", "testvalue");
34 req.set_message("Hello");
36 Status s = stub->Echo(&ctx, req, &resp);
37 EXPECT_EQ(s.ok(), true);
38 EXPECT_EQ(resp.message(), "Hello");
41 void MakeClientStreamingCall(const std::shared_ptr<Channel>& channel) {
42 auto stub = grpc::testing::EchoTestService::NewStub(channel);
45 req.mutable_param()->set_echo_metadata(true);
46 ctx.AddMetadata("testkey", "testvalue");
47 req.set_message("Hello");
49 string expected_resp = "";
50 auto writer = stub->RequestStream(&ctx, &resp);
51 for (int i = 0; i < 10; i++) {
53 expected_resp += "Hello";
56 Status s = writer->Finish();
57 EXPECT_EQ(s.ok(), true);
58 EXPECT_EQ(resp.message(), expected_resp);
61 void MakeServerStreamingCall(const std::shared_ptr<Channel>& channel) {
62 auto stub = grpc::testing::EchoTestService::NewStub(channel);
65 req.mutable_param()->set_echo_metadata(true);
66 ctx.AddMetadata("testkey", "testvalue");
67 req.set_message("Hello");
69 string expected_resp = "";
70 auto reader = stub->ResponseStream(&ctx, req);
72 while (reader->Read(&resp)) {
73 EXPECT_EQ(resp.message(), "Hello");
77 Status s = reader->Finish();
78 EXPECT_EQ(s.ok(), true);
81 void MakeBidiStreamingCall(const std::shared_ptr<Channel>& channel) {
82 auto stub = grpc::testing::EchoTestService::NewStub(channel);
86 ctx.AddMetadata("testkey", "testvalue");
87 auto stream = stub->BidiStream(&ctx);
88 for (auto i = 0; i < 10; i++) {
89 req.set_message("Hello" + std::to_string(i));
92 EXPECT_EQ(req.message(), resp.message());
94 ASSERT_TRUE(stream->WritesDone());
95 Status s = stream->Finish();
96 EXPECT_EQ(s.ok(), true);
99 void MakeCallbackCall(const std::shared_ptr<Channel>& channel) {
100 auto stub = grpc::testing::EchoTestService::NewStub(channel);
104 std::condition_variable cv;
106 req.mutable_param()->set_echo_metadata(true);
107 ctx.AddMetadata("testkey", "testvalue");
108 req.set_message("Hello");
110 stub->experimental_async()->Echo(&ctx, &req, &resp,
111 [&resp, &mu, &done, &cv](Status s) {
112 // gpr_log(GPR_ERROR, "got the callback");
113 EXPECT_EQ(s.ok(), true);
114 EXPECT_EQ(resp.message(), "Hello");
115 std::lock_guard<std::mutex> l(mu);
119 std::unique_lock<std::mutex> l(mu);
125 bool CheckMetadata(const std::multimap<grpc::string_ref, grpc::string_ref>& map,
126 const string& key, const string& value) {
127 for (const auto& pair : map) {
128 if (pair.first.starts_with(key) && pair.second.starts_with(value)) {
135 bool CheckMetadata(const std::multimap<grpc::string, grpc::string>& map,
136 const string& key, const string& value) {
137 for (const auto& pair : map) {
138 if (pair.first == key && pair.second == value) {
145 std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
146 CreateDummyClientInterceptors() {
147 std::vector<std::unique_ptr<experimental::ClientInterceptorFactoryInterface>>
149 // Add 20 dummy interceptors before hijacking interceptor
150 creators.reserve(20);
151 for (auto i = 0; i < 20; i++) {
152 creators.push_back(std::unique_ptr<DummyInterceptorFactory>(
153 new DummyInterceptorFactory()));
158 } // namespace testing