|
|
|
@ -54,6 +54,7 @@ |
|
|
|
|
#include "test/core/end2end/data/ssl_test_data.h" |
|
|
|
|
#include "test/core/util/port.h" |
|
|
|
|
#include "test/core/util/test_config.h" |
|
|
|
|
#include "test/cpp/end2end/test_service_impl.h" |
|
|
|
|
#include "test/cpp/util/string_ref_helper.h" |
|
|
|
|
|
|
|
|
|
using grpc::testing::EchoRequest; |
|
|
|
@ -212,138 +213,6 @@ class Proxy : public ::grpc::testing::EchoTestService::Service { |
|
|
|
|
std::unique_ptr< ::grpc::testing::EchoTestService::Stub> stub_; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
class TestServiceImpl : public ::grpc::testing::EchoTestService::Service { |
|
|
|
|
public: |
|
|
|
|
TestServiceImpl() : signal_client_(false), host_() {} |
|
|
|
|
explicit TestServiceImpl(const grpc::string& host) |
|
|
|
|
: signal_client_(false), host_(new grpc::string(host)) {} |
|
|
|
|
|
|
|
|
|
Status Echo(ServerContext* context, const EchoRequest* request, |
|
|
|
|
EchoResponse* response) GRPC_OVERRIDE { |
|
|
|
|
response->set_message(request->message()); |
|
|
|
|
MaybeEchoDeadline(context, request, response); |
|
|
|
|
if (host_) { |
|
|
|
|
response->mutable_param()->set_host(*host_); |
|
|
|
|
} |
|
|
|
|
if (request->has_param() && request->param().client_cancel_after_us()) { |
|
|
|
|
{ |
|
|
|
|
std::unique_lock<std::mutex> lock(mu_); |
|
|
|
|
signal_client_ = true; |
|
|
|
|
} |
|
|
|
|
while (!context->IsCancelled()) { |
|
|
|
|
gpr_sleep_until(gpr_time_add( |
|
|
|
|
gpr_now(GPR_CLOCK_REALTIME), |
|
|
|
|
gpr_time_from_micros(request->param().client_cancel_after_us(), |
|
|
|
|
GPR_TIMESPAN))); |
|
|
|
|
} |
|
|
|
|
return Status::CANCELLED; |
|
|
|
|
} else if (request->has_param() && |
|
|
|
|
request->param().server_cancel_after_us()) { |
|
|
|
|
gpr_sleep_until(gpr_time_add( |
|
|
|
|
gpr_now(GPR_CLOCK_REALTIME), |
|
|
|
|
gpr_time_from_micros(request->param().server_cancel_after_us(), |
|
|
|
|
GPR_TIMESPAN))); |
|
|
|
|
return Status::CANCELLED; |
|
|
|
|
} else if (!request->has_param() || |
|
|
|
|
!request->param().skip_cancelled_check()) { |
|
|
|
|
EXPECT_FALSE(context->IsCancelled()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (request->has_param() && request->param().echo_metadata()) { |
|
|
|
|
const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata = |
|
|
|
|
context->client_metadata(); |
|
|
|
|
for (std::multimap<grpc::string_ref, grpc::string_ref>::const_iterator |
|
|
|
|
iter = client_metadata.begin(); |
|
|
|
|
iter != client_metadata.end(); ++iter) { |
|
|
|
|
context->AddTrailingMetadata(ToString(iter->first), |
|
|
|
|
ToString(iter->second)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (request->has_param() && |
|
|
|
|
(request->param().expected_client_identity().length() > 0 || |
|
|
|
|
request->param().check_auth_context())) { |
|
|
|
|
CheckServerAuthContext(context, |
|
|
|
|
request->param().expected_client_identity()); |
|
|
|
|
} |
|
|
|
|
if (request->has_param() && |
|
|
|
|
request->param().response_message_length() > 0) { |
|
|
|
|
response->set_message( |
|
|
|
|
grpc::string(request->param().response_message_length(), '\0')); |
|
|
|
|
} |
|
|
|
|
if (request->has_param() && request->param().echo_peer()) { |
|
|
|
|
response->mutable_param()->set_peer(context->peer()); |
|
|
|
|
} |
|
|
|
|
return Status::OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Unimplemented is left unimplemented to test the returned error.
|
|
|
|
|
|
|
|
|
|
Status RequestStream(ServerContext* context, |
|
|
|
|
ServerReader<EchoRequest>* reader, |
|
|
|
|
EchoResponse* response) GRPC_OVERRIDE { |
|
|
|
|
EchoRequest request; |
|
|
|
|
response->set_message(""); |
|
|
|
|
int cancel_after_reads = 0; |
|
|
|
|
const std::multimap<grpc::string_ref, grpc::string_ref>& |
|
|
|
|
client_initial_metadata = context->client_metadata(); |
|
|
|
|
if (client_initial_metadata.find(kServerCancelAfterReads) != |
|
|
|
|
client_initial_metadata.end()) { |
|
|
|
|
std::istringstream iss(ToString( |
|
|
|
|
client_initial_metadata.find(kServerCancelAfterReads)->second)); |
|
|
|
|
iss >> cancel_after_reads; |
|
|
|
|
gpr_log(GPR_INFO, "cancel_after_reads %d", cancel_after_reads); |
|
|
|
|
} |
|
|
|
|
while (reader->Read(&request)) { |
|
|
|
|
if (cancel_after_reads == 1) { |
|
|
|
|
gpr_log(GPR_INFO, "return cancel status"); |
|
|
|
|
return Status::CANCELLED; |
|
|
|
|
} else if (cancel_after_reads > 0) { |
|
|
|
|
cancel_after_reads--; |
|
|
|
|
} |
|
|
|
|
response->mutable_message()->append(request.message()); |
|
|
|
|
} |
|
|
|
|
return Status::OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Return 3 messages.
|
|
|
|
|
// TODO(yangg) make it generic by adding a parameter into EchoRequest
|
|
|
|
|
Status ResponseStream(ServerContext* context, const EchoRequest* request, |
|
|
|
|
ServerWriter<EchoResponse>* writer) GRPC_OVERRIDE { |
|
|
|
|
EchoResponse response; |
|
|
|
|
response.set_message(request->message() + "0"); |
|
|
|
|
writer->Write(response); |
|
|
|
|
response.set_message(request->message() + "1"); |
|
|
|
|
writer->Write(response); |
|
|
|
|
response.set_message(request->message() + "2"); |
|
|
|
|
writer->Write(response); |
|
|
|
|
|
|
|
|
|
return Status::OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Status BidiStream(ServerContext* context, |
|
|
|
|
ServerReaderWriter<EchoResponse, EchoRequest>* stream) |
|
|
|
|
GRPC_OVERRIDE { |
|
|
|
|
EchoRequest request; |
|
|
|
|
EchoResponse response; |
|
|
|
|
while (stream->Read(&request)) { |
|
|
|
|
gpr_log(GPR_INFO, "recv msg %s", request.message().c_str()); |
|
|
|
|
response.set_message(request.message()); |
|
|
|
|
stream->Write(response); |
|
|
|
|
} |
|
|
|
|
return Status::OK; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool signal_client() { |
|
|
|
|
std::unique_lock<std::mutex> lock(mu_); |
|
|
|
|
return signal_client_; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
bool signal_client_; |
|
|
|
|
std::mutex mu_; |
|
|
|
|
std::unique_ptr<grpc::string> host_; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
class TestServiceImplDupPkg |
|
|
|
|
: public ::grpc::testing::duplicate::EchoTestService::Service { |
|
|
|
|
public: |
|
|
|
|