|
|
|
@ -104,6 +104,22 @@ bool CheckIsLocalhost(const grpc::string& addr) { |
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
class Proxy : public ::grpc::cpp::test::util::TestService::Service { |
|
|
|
|
public: |
|
|
|
|
Proxy(std::shared_ptr<ChannelInterface> channel) |
|
|
|
|
: stub_(grpc::cpp::test::util::TestService::NewStub(channel)) {} |
|
|
|
|
|
|
|
|
|
Status Echo(ServerContext* server_context, const EchoRequest* request, |
|
|
|
|
EchoResponse* response) GRPC_OVERRIDE { |
|
|
|
|
std::unique_ptr<ClientContext> client_context = |
|
|
|
|
ClientContext::FromServerContext(*server_context); |
|
|
|
|
return stub_->Echo(client_context.get(), *request, response); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
std::unique_ptr<::grpc::cpp::test::util::TestService::Stub> stub_; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service { |
|
|
|
|
public: |
|
|
|
|
TestServiceImpl() : signal_client_(false), host_() {} |
|
|
|
@ -241,7 +257,9 @@ class TestServiceImplDupPkg |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
class End2endTest : public ::testing::Test { |
|
|
|
|
/* Param is whether or not to use a proxy -- some tests use TEST_F as they don't
|
|
|
|
|
need this functionality */ |
|
|
|
|
class End2endTest : public ::testing::TestWithParam<bool> { |
|
|
|
|
protected: |
|
|
|
|
End2endTest() |
|
|
|
|
: kMaxMessageSize_(8192), special_service_("special"), thread_pool_(2) {} |
|
|
|
@ -267,21 +285,41 @@ class End2endTest : public ::testing::Test { |
|
|
|
|
server_ = builder.BuildAndStart(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void TearDown() GRPC_OVERRIDE { server_->Shutdown(); } |
|
|
|
|
void TearDown() GRPC_OVERRIDE { |
|
|
|
|
server_->Shutdown(); |
|
|
|
|
if (proxy_server_) proxy_server_->Shutdown(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ResetStub() { |
|
|
|
|
void ResetStub(bool use_proxy) { |
|
|
|
|
SslCredentialsOptions ssl_opts = {test_root_cert, "", ""}; |
|
|
|
|
ChannelArguments args; |
|
|
|
|
args.SetSslTargetNameOverride("foo.test.google.fr"); |
|
|
|
|
args.SetString(GRPC_ARG_SECONDARY_USER_AGENT_STRING, "end2end_test"); |
|
|
|
|
channel_ = CreateChannel(server_address_.str(), SslCredentials(ssl_opts), |
|
|
|
|
args); |
|
|
|
|
if (use_proxy) { |
|
|
|
|
proxy_service_.reset(new Proxy(channel_)); |
|
|
|
|
int port = grpc_pick_unused_port_or_die(); |
|
|
|
|
std::ostringstream proxyaddr; |
|
|
|
|
proxyaddr << "localhost:" << port; |
|
|
|
|
ServerBuilder builder; |
|
|
|
|
builder.AddListeningPort(proxyaddr.str(), InsecureServerCredentials()); |
|
|
|
|
builder.RegisterService(proxy_service_.get()); |
|
|
|
|
builder.SetThreadPool(&thread_pool_); |
|
|
|
|
proxy_server_ = builder.BuildAndStart(); |
|
|
|
|
|
|
|
|
|
channel_ = CreateChannel(proxyaddr.str(), InsecureCredentials(), |
|
|
|
|
ChannelArguments()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
stub_ = std::move(grpc::cpp::test::util::TestService::NewStub(channel_)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
std::shared_ptr<ChannelInterface> channel_; |
|
|
|
|
std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_; |
|
|
|
|
std::unique_ptr<Server> server_; |
|
|
|
|
std::unique_ptr<Server> proxy_server_; |
|
|
|
|
std::unique_ptr<Proxy> proxy_service_; |
|
|
|
|
std::ostringstream server_address_; |
|
|
|
|
const int kMaxMessageSize_; |
|
|
|
|
TestServiceImpl service_; |
|
|
|
@ -306,7 +344,7 @@ static void SendRpc(grpc::cpp::test::util::TestService::Stub* stub, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, SimpleRpcWithHost) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
|
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
@ -321,13 +359,13 @@ TEST_F(End2endTest, SimpleRpcWithHost) { |
|
|
|
|
EXPECT_TRUE(s.ok()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, SimpleRpc) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, SimpleRpc) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
SendRpc(stub_.get(), 1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, MultipleRpcs) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, MultipleRpcs) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
std::vector<std::thread*> threads; |
|
|
|
|
for (int i = 0; i < 10; ++i) { |
|
|
|
|
threads.push_back(new std::thread(SendRpc, stub_.get(), 10)); |
|
|
|
@ -339,8 +377,8 @@ TEST_F(End2endTest, MultipleRpcs) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Set a 10us deadline and make sure proper error is returned.
|
|
|
|
|
TEST_F(End2endTest, RpcDeadlineExpires) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, RpcDeadlineExpires) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -354,8 +392,8 @@ TEST_F(End2endTest, RpcDeadlineExpires) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Set a long but finite deadline.
|
|
|
|
|
TEST_F(End2endTest, RpcLongDeadline) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, RpcLongDeadline) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -370,8 +408,8 @@ TEST_F(End2endTest, RpcLongDeadline) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Ask server to echo back the deadline it sees.
|
|
|
|
|
TEST_F(End2endTest, EchoDeadline) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, EchoDeadline) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -392,8 +430,8 @@ TEST_F(End2endTest, EchoDeadline) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Ask server to echo back the deadline it sees. The rpc has no deadline.
|
|
|
|
|
TEST_F(End2endTest, EchoDeadlineForNoDeadlineRpc) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, EchoDeadlineForNoDeadlineRpc) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -407,8 +445,8 @@ TEST_F(End2endTest, EchoDeadlineForNoDeadlineRpc) { |
|
|
|
|
gpr_inf_future(GPR_CLOCK_REALTIME).tv_sec); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, UnimplementedRpc) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, UnimplementedRpc) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -422,7 +460,7 @@ TEST_F(End2endTest, UnimplementedRpc) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, RequestStreamOneRequest) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -437,7 +475,7 @@ TEST_F(End2endTest, RequestStreamOneRequest) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, RequestStreamTwoRequests) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -453,7 +491,7 @@ TEST_F(End2endTest, RequestStreamTwoRequests) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, ResponseStream) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -473,7 +511,7 @@ TEST_F(End2endTest, ResponseStream) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, BidiStream) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -506,7 +544,7 @@ TEST_F(End2endTest, BidiStream) { |
|
|
|
|
// Talk to the two services with the same name but different package names.
|
|
|
|
|
// The two stubs are created on the same channel.
|
|
|
|
|
TEST_F(End2endTest, DiffPackageServices) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -561,8 +599,8 @@ void CancelRpc(ClientContext* context, int delay_us, TestServiceImpl* service) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Client cancels rpc after 10ms
|
|
|
|
|
TEST_F(End2endTest, ClientCancelsRpc) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, ClientCancelsRpc) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -578,8 +616,8 @@ TEST_F(End2endTest, ClientCancelsRpc) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Server cancels rpc after 1ms
|
|
|
|
|
TEST_F(End2endTest, ServerCancelsRpc) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, ServerCancelsRpc) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -593,7 +631,7 @@ TEST_F(End2endTest, ServerCancelsRpc) { |
|
|
|
|
|
|
|
|
|
// Client cancels request stream after sending two messages
|
|
|
|
|
TEST_F(End2endTest, ClientCancelsRequestStream) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -613,7 +651,7 @@ TEST_F(End2endTest, ClientCancelsRequestStream) { |
|
|
|
|
|
|
|
|
|
// Client cancels server stream after sending some messages
|
|
|
|
|
TEST_F(End2endTest, ClientCancelsResponseStream) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -645,7 +683,7 @@ TEST_F(End2endTest, ClientCancelsResponseStream) { |
|
|
|
|
|
|
|
|
|
// Client cancels bidi stream after sending some messages
|
|
|
|
|
TEST_F(End2endTest, ClientCancelsBidi) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -677,7 +715,7 @@ TEST_F(End2endTest, ClientCancelsBidi) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, RpcMaxMessageSize) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message(string(kMaxMessageSize_ * 2, 'a')); |
|
|
|
@ -702,7 +740,7 @@ bool MetadataContains(const std::multimap<grpc::string, grpc::string>& metadata, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, SetPerCallCredentials) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -724,7 +762,7 @@ TEST_F(End2endTest, SetPerCallCredentials) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, InsecurePerCallCredentials) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -739,7 +777,7 @@ TEST_F(End2endTest, InsecurePerCallCredentials) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, OverridePerCallCredentials) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -772,7 +810,7 @@ TEST_F(End2endTest, OverridePerCallCredentials) { |
|
|
|
|
// Client sends 20 requests and the server returns CANCELLED status after
|
|
|
|
|
// reading 10 requests.
|
|
|
|
|
TEST_F(End2endTest, RequestStreamServerEarlyCancelTest) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
ClientContext context; |
|
|
|
@ -791,7 +829,7 @@ TEST_F(End2endTest, RequestStreamServerEarlyCancelTest) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, ClientAuthContext) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("Hello"); |
|
|
|
@ -816,8 +854,8 @@ TEST_F(End2endTest, ClientAuthContext) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Make the response larger than the flow control window.
|
|
|
|
|
TEST_F(End2endTest, HugeResponse) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, HugeResponse) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("huge response"); |
|
|
|
@ -842,7 +880,7 @@ void ReaderThreadFunc(ClientReaderWriter<EchoRequest, EchoResponse>* stream, gpr |
|
|
|
|
|
|
|
|
|
// Run a Read and a WritesDone simultaneously.
|
|
|
|
|
TEST_F(End2endTest, SimultaneousReadWritesDone) { |
|
|
|
|
ResetStub(); |
|
|
|
|
ResetStub(false); |
|
|
|
|
ClientContext context; |
|
|
|
|
gpr_event ev; |
|
|
|
|
gpr_event_init(&ev); |
|
|
|
@ -855,8 +893,8 @@ TEST_F(End2endTest, SimultaneousReadWritesDone) { |
|
|
|
|
reader_thread.join(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
TEST_F(End2endTest, Peer) { |
|
|
|
|
ResetStub(); |
|
|
|
|
TEST_P(End2endTest, Peer) { |
|
|
|
|
ResetStub(GetParam()); |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
request.set_message("hello"); |
|
|
|
@ -870,6 +908,8 @@ TEST_F(End2endTest, Peer) { |
|
|
|
|
EXPECT_TRUE(CheckIsLocalhost(context.peer())); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
INSTANTIATE_TEST_CASE_P(End2end, End2endTest, ::testing::Values(false, true)); |
|
|
|
|
|
|
|
|
|
} // namespace testing
|
|
|
|
|
} // namespace grpc
|
|
|
|
|
|
|
|
|
|