|  | @@ -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;
 | 
	
	
		
			
				|  | @@ -64,40 +65,6 @@ namespace grpc {
 | 
	
		
			
				|  |  |  namespace testing {
 | 
	
		
			
				|  |  |  namespace {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -const char* kServerCancelAfterReads = "cancel_after_reads";
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -// When echo_deadline is requested, deadline seen in the ServerContext is set in
 | 
	
		
			
				|  |  | -// the response in seconds.
 | 
	
		
			
				|  |  | -void MaybeEchoDeadline(ServerContext* context, const EchoRequest* request,
 | 
	
		
			
				|  |  | -                       EchoResponse* response) {
 | 
	
		
			
				|  |  | -  if (request->has_param() && request->param().echo_deadline()) {
 | 
	
		
			
				|  |  | -    gpr_timespec deadline = gpr_inf_future(GPR_CLOCK_REALTIME);
 | 
	
		
			
				|  |  | -    if (context->deadline() != system_clock::time_point::max()) {
 | 
	
		
			
				|  |  | -      Timepoint2Timespec(context->deadline(), &deadline);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    response->mutable_param()->set_request_deadline(deadline.tv_sec);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -void CheckServerAuthContext(const ServerContext* context,
 | 
	
		
			
				|  |  | -                            const grpc::string& expected_client_identity) {
 | 
	
		
			
				|  |  | -  std::shared_ptr<const AuthContext> auth_ctx = context->auth_context();
 | 
	
		
			
				|  |  | -  std::vector<grpc::string_ref> ssl =
 | 
	
		
			
				|  |  | -      auth_ctx->FindPropertyValues("transport_security_type");
 | 
	
		
			
				|  |  | -  EXPECT_EQ(1u, ssl.size());
 | 
	
		
			
				|  |  | -  EXPECT_EQ("ssl", ToString(ssl[0]));
 | 
	
		
			
				|  |  | -  if (expected_client_identity.length() == 0) {
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(auth_ctx->GetPeerIdentityPropertyName().empty());
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty());
 | 
	
		
			
				|  |  | -    EXPECT_FALSE(auth_ctx->IsPeerAuthenticated());
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | -    auto identity = auth_ctx->GetPeerIdentity();
 | 
	
		
			
				|  |  | -    EXPECT_TRUE(auth_ctx->IsPeerAuthenticated());
 | 
	
		
			
				|  |  | -    EXPECT_EQ(1u, identity.size());
 | 
	
		
			
				|  |  | -    EXPECT_EQ(expected_client_identity, identity[0]);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  bool CheckIsLocalhost(const grpc::string& addr) {
 | 
	
		
			
				|  |  |    const grpc::string kIpv6("ipv6:[::1]:");
 | 
	
		
			
				|  |  |    const grpc::string kIpv4MappedIpv6("ipv6:[::ffff:127.0.0.1]:");
 | 
	
	
		
			
				|  | @@ -212,138 +179,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:
 |