Add a test to export two TestService on the same server, only with different
package names. Make sure they work as intended.

This is based on []
	Change on 2015/01/08 by yangg <yangg@google.com>
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=83558743
diff --git a/Makefile b/Makefile
index 153d092..8be4196 100644
--- a/Makefile
+++ b/Makefile
@@ -965,6 +965,24 @@
 	$(Q) mkdir -p `dirname $@`
 	$(Q) $(PROTOC) --cpp_out=gens --grpc_out=gens --plugin=protoc-gen-grpc=bins/$(CONFIG)/cpp_plugin $<
 
+deps/$(CONFIG)/gens/test/cpp/util/echo_duplicate.pb.dep:
+	$(Q) mkdir -p `dirname $@`
+	$(Q) touch $@
+
+gens/test/cpp/util/echo_duplicate.pb.cc: test/cpp/util/echo_duplicate.proto protoc_plugins
+	$(E) "[PROTOC]  Generating protobuf CC file from $<"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(PROTOC) --cpp_out=gens --grpc_out=gens --plugin=protoc-gen-grpc=bins/$(CONFIG)/cpp_plugin $<
+
+deps/$(CONFIG)/gens/test/cpp/util/messages.pb.dep:
+	$(Q) mkdir -p `dirname $@`
+	$(Q) touch $@
+
+gens/test/cpp/util/messages.pb.cc: test/cpp/util/messages.proto protoc_plugins
+	$(E) "[PROTOC]  Generating protobuf CC file from $<"
+	$(Q) mkdir -p `dirname $@`
+	$(Q) $(PROTOC) --cpp_out=gens --grpc_out=gens --plugin=protoc-gen-grpc=bins/$(CONFIG)/cpp_plugin $<
+
 
 deps/$(CONFIG)/%.dep : %.c
 	$(E) "[DEP]     Generating dependencies for $<"
@@ -1643,7 +1661,9 @@
 
 
 LIBGRPC++_TEST_UTIL_SRC = \
+    gens/test/cpp/util/messages.pb.cc \
     gens/test/cpp/util/echo.pb.cc \
+    gens/test/cpp/util/echo_duplicate.pb.cc \
     test/cpp/util/create_test_channel.cc \
     test/cpp/end2end/async_test_server.cc \
 
@@ -5199,10 +5219,10 @@
 
 else
 
-bins/$(CONFIG)/end2end_test: $(END2END_TEST_OBJS) libs/$(CONFIG)/libgrpc_test_util.a libs/$(CONFIG)/libgrpc++.a libs/$(CONFIG)/libgrpc.a libs/$(CONFIG)/libgpr.a
+bins/$(CONFIG)/end2end_test: $(END2END_TEST_OBJS) libs/$(CONFIG)/libgrpc++_test_util.a libs/$(CONFIG)/libgrpc_test_util.a libs/$(CONFIG)/libgrpc++.a libs/$(CONFIG)/libgrpc.a libs/$(CONFIG)/libgpr.a
 	$(E) "[LD]      Linking $@"
 	$(Q) mkdir -p `dirname $@`
-	$(Q) $(LDXX) $(LDFLAGS) $(END2END_TEST_OBJS) $(GTEST_LIB) libs/$(CONFIG)/libgrpc_test_util.a libs/$(CONFIG)/libgrpc++.a libs/$(CONFIG)/libgrpc.a libs/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS) $(LDLIBS_SECURE) -o bins/$(CONFIG)/end2end_test
+	$(Q) $(LDXX) $(LDFLAGS) $(END2END_TEST_OBJS) $(GTEST_LIB) libs/$(CONFIG)/libgrpc++_test_util.a libs/$(CONFIG)/libgrpc_test_util.a libs/$(CONFIG)/libgrpc++.a libs/$(CONFIG)/libgrpc.a libs/$(CONFIG)/libgpr.a $(LDLIBSXX) $(LDLIBS) $(LDLIBS_SECURE) -o bins/$(CONFIG)/end2end_test
 
 endif
 
diff --git a/build.json b/build.json
index d60f4e5..2541572 100644
--- a/build.json
+++ b/build.json
@@ -386,7 +386,9 @@
       "name": "grpc++_test_util",
       "build": "test",
       "src": [
+        "test/cpp/util/messages.proto",
         "test/cpp/util/echo.proto",
+        "test/cpp/util/echo_duplicate.proto",
         "test/cpp/util/create_test_channel.cc",
         "test/cpp/end2end/async_test_server.cc"
       ],
@@ -1348,6 +1350,7 @@
         "test/cpp/end2end/end2end_test.cc"
       ],
       "deps": [
+        "grpc++_test_util",
         "grpc_test_util",
         "grpc++",
         "grpc",
diff --git a/test/cpp/end2end/end2end_test.cc b/test/cpp/end2end/end2end_test.cc
index 83037b5..f63f6ad 100644
--- a/test/cpp/end2end/end2end_test.cc
+++ b/test/cpp/end2end/end2end_test.cc
@@ -34,6 +34,7 @@
 #include <chrono>
 #include <thread>
 
+#include "net/grpc/cpp/echo_duplicate_proto_cc.pb.h"
 #include "test/cpp/util/echo.pb.h"
 #include "src/cpp/server/rpc_service_method.h"
 #include "src/cpp/util/time.h"
@@ -55,7 +56,6 @@
 
 using grpc::cpp::test::util::EchoRequest;
 using grpc::cpp::test::util::EchoResponse;
-using grpc::cpp::test::util::TestService;
 using std::chrono::system_clock;
 
 namespace grpc {
@@ -77,10 +77,10 @@
 }
 }  // namespace
 
-class TestServiceImpl : public TestService::Service {
+class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service {
  public:
   Status Echo(ServerContext* context, const EchoRequest* request,
-              EchoResponse* response) {
+              EchoResponse* response) override {
     response->set_message(request->message());
     MaybeEchoDeadline(context, request, response);
     return Status::OK;
@@ -90,7 +90,7 @@
 
   Status RequestStream(ServerContext* context,
                        ServerReader<EchoRequest>* reader,
-                       EchoResponse* response) {
+                       EchoResponse* response) override {
     EchoRequest request;
     response->set_message("");
     while (reader->Read(&request)) {
@@ -102,7 +102,7 @@
   // Return 3 messages.
   // TODO(yangg) make it generic by adding a parameter into EchoRequest
   Status ResponseStream(ServerContext* context, const EchoRequest* request,
-                        ServerWriter<EchoResponse>* writer) {
+                        ServerWriter<EchoResponse>* writer) override {
     EchoResponse response;
     response.set_message(request->message() + "0");
     writer->Write(response);
@@ -114,8 +114,9 @@
     return Status::OK;
   }
 
-  Status BidiStream(ServerContext* context,
-                    ServerReaderWriter<EchoResponse, EchoRequest>* stream) {
+  Status BidiStream(
+      ServerContext* context,
+      ServerReaderWriter<EchoResponse, EchoRequest>* stream) override {
     EchoRequest request;
     EchoResponse response;
     while (stream->Read(&request)) {
@@ -127,6 +128,16 @@
   }
 };
 
+class TestServiceImplDupPkg
+    : public ::grpc::cpp::test::util::duplicate::TestService::Service {
+ public:
+  Status Echo(ServerContext* context, const EchoRequest* request,
+              EchoResponse* response) override {
+    response->set_message("no package");
+    return Status::OK;
+  }
+};
+
 class End2endTest : public ::testing::Test {
  protected:
   void SetUp() override {
@@ -136,6 +147,7 @@
     ServerBuilder builder;
     builder.AddPort(server_address_.str());
     builder.RegisterService(service_.service());
+    builder.RegisterService(dup_pkg_service_.service());
     server_ = builder.BuildAndStart();
   }
 
@@ -143,15 +155,21 @@
     server_->Shutdown();
   }
 
+  void ResetStub() {
+    std::shared_ptr<ChannelInterface> channel =
+        CreateChannel(server_address_.str(), ChannelArguments());
+    stub_.reset(grpc::cpp::test::util::TestService::NewStub(channel));
+  }
+
+  std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub_;
   std::unique_ptr<Server> server_;
   std::ostringstream server_address_;
   TestServiceImpl service_;
+  TestServiceImplDupPkg dup_pkg_service_;
 };
 
-static void SendRpc(const grpc::string& server_address, int num_rpcs) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address, ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+static void SendRpc(grpc::cpp::test::util::TestService::Stub* stub,
+                    int num_rpcs) {
   EchoRequest request;
   EchoResponse response;
   request.set_message("Hello");
@@ -162,18 +180,18 @@
     EXPECT_EQ(response.message(), request.message());
     EXPECT_TRUE(s.IsOk());
   }
-
-  delete stub;
 }
 
 TEST_F(End2endTest, SimpleRpc) {
-  SendRpc(server_address_.str(), 1);
+  ResetStub();
+  SendRpc(stub_.get(), 1);
 }
 
 TEST_F(End2endTest, MultipleRpcs) {
+  ResetStub();
   vector<std::thread*> threads;
   for (int i = 0; i < 10; ++i) {
-    threads.push_back(new std::thread(SendRpc, server_address_.str(), 10));
+    threads.push_back(new std::thread(SendRpc, stub_.get(), 10));
   }
   for (int i = 0; i < 10; ++i) {
     threads[i]->join();
@@ -183,9 +201,7 @@
 
 // Set a 10us deadline and make sure proper error is returned.
 TEST_F(End2endTest, RpcDeadlineExpires) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   request.set_message("Hello");
@@ -194,19 +210,15 @@
   std::chrono::system_clock::time_point deadline =
       std::chrono::system_clock::now() + std::chrono::microseconds(10);
   context.set_absolute_deadline(deadline);
-  Status s = stub->Echo(&context, request, &response);
+  Status s = stub_->Echo(&context, request, &response);
   // TODO(yangg) use correct error code when b/18793983 is fixed.
   // EXPECT_EQ(StatusCode::DEADLINE_EXCEEDED, s.code());
   EXPECT_EQ(StatusCode::CANCELLED, s.code());
-
-  delete stub;
 }
 
 // Set a long but finite deadline.
 TEST_F(End2endTest, RpcLongDeadline) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   request.set_message("Hello");
@@ -215,18 +227,14 @@
   std::chrono::system_clock::time_point deadline =
       std::chrono::system_clock::now() + std::chrono::hours(1);
   context.set_absolute_deadline(deadline);
-  Status s = stub->Echo(&context, request, &response);
+  Status s = stub_->Echo(&context, request, &response);
   EXPECT_EQ(response.message(), request.message());
   EXPECT_TRUE(s.IsOk());
-
-  delete stub;
 }
 
 // Ask server to echo back the deadline it sees.
 TEST_F(End2endTest, EchoDeadline) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   request.set_message("Hello");
@@ -236,7 +244,7 @@
   std::chrono::system_clock::time_point deadline =
       std::chrono::system_clock::now() + std::chrono::seconds(100);
   context.set_absolute_deadline(deadline);
-  Status s = stub->Echo(&context, request, &response);
+  Status s = stub_->Echo(&context, request, &response);
   EXPECT_EQ(response.message(), request.message());
   EXPECT_TRUE(s.IsOk());
   gpr_timespec sent_deadline;
@@ -244,56 +252,44 @@
   // Allow 1 second error.
   EXPECT_LE(response.param().request_deadline() - sent_deadline.tv_sec, 1);
   EXPECT_GE(response.param().request_deadline() - sent_deadline.tv_sec, -1);
-
-  delete stub;
 }
 
 // Ask server to echo back the deadline it sees. The rpc has no deadline.
 TEST_F(End2endTest, EchoDeadlineForNoDeadlineRpc) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   request.set_message("Hello");
   request.mutable_param()->set_echo_deadline(true);
 
   ClientContext context;
-  Status s = stub->Echo(&context, request, &response);
+  Status s = stub_->Echo(&context, request, &response);
   EXPECT_EQ(response.message(), request.message());
   EXPECT_TRUE(s.IsOk());
   EXPECT_EQ(response.param().request_deadline(), gpr_inf_future.tv_sec);
-
-  delete stub;
 }
 
 TEST_F(End2endTest, UnimplementedRpc) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   request.set_message("Hello");
 
   ClientContext context;
-  Status s = stub->Unimplemented(&context, request, &response);
+  Status s = stub_->Unimplemented(&context, request, &response);
   EXPECT_FALSE(s.IsOk());
   EXPECT_EQ(s.code(), grpc::StatusCode::UNIMPLEMENTED);
   EXPECT_EQ(s.details(), "");
   EXPECT_EQ(response.message(), "");
-
-  delete stub;
 }
 
 TEST_F(End2endTest, RequestStreamOneRequest) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   ClientContext context;
 
-  ClientWriter<EchoRequest>* stream = stub->RequestStream(&context, &response);
+  ClientWriter<EchoRequest>* stream = stub_->RequestStream(&context, &response);
   request.set_message("hello");
   EXPECT_TRUE(stream->Write(request));
   stream->WritesDone();
@@ -302,18 +298,15 @@
   EXPECT_TRUE(s.IsOk());
 
   delete stream;
-  delete stub;
 }
 
 TEST_F(End2endTest, RequestStreamTwoRequests) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   ClientContext context;
 
-  ClientWriter<EchoRequest>* stream = stub->RequestStream(&context, &response);
+  ClientWriter<EchoRequest>* stream = stub_->RequestStream(&context, &response);
   request.set_message("hello");
   EXPECT_TRUE(stream->Write(request));
   EXPECT_TRUE(stream->Write(request));
@@ -323,19 +316,17 @@
   EXPECT_TRUE(s.IsOk());
 
   delete stream;
-  delete stub;
 }
 
 TEST_F(End2endTest, ResponseStream) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   ClientContext context;
   request.set_message("hello");
 
-  ClientReader<EchoResponse>* stream = stub->ResponseStream(&context, &request);
+  ClientReader<EchoResponse>* stream =
+      stub_->ResponseStream(&context, &request);
   EXPECT_TRUE(stream->Read(&response));
   EXPECT_EQ(response.message(), request.message() + "0");
   EXPECT_TRUE(stream->Read(&response));
@@ -348,20 +339,17 @@
   EXPECT_TRUE(s.IsOk());
 
   delete stream;
-  delete stub;
 }
 
 TEST_F(End2endTest, BidiStream) {
-  std::shared_ptr<ChannelInterface> channel =
-      CreateChannel(server_address_.str(), ChannelArguments());
-  TestService::Stub* stub = TestService::NewStub(channel);
+  ResetStub();
   EchoRequest request;
   EchoResponse response;
   ClientContext context;
   grpc::string msg("hello");
 
   ClientReaderWriter<EchoRequest, EchoResponse>* stream =
-      stub->BidiStream(&context);
+      stub_->BidiStream(&context);
 
   request.set_message(msg + "0");
   EXPECT_TRUE(stream->Write(request));
@@ -385,7 +373,32 @@
   EXPECT_TRUE(s.IsOk());
 
   delete stream;
-  delete stub;
+}
+
+// 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) {
+  std::shared_ptr<ChannelInterface> channel =
+      CreateChannel(server_address_.str(), ChannelArguments());
+
+  EchoRequest request;
+  EchoResponse response;
+  request.set_message("Hello");
+
+  std::unique_ptr<grpc::cpp::test::util::TestService::Stub> stub(
+      grpc::cpp::test::util::TestService::NewStub(channel));
+  ClientContext context;
+  Status s = stub->Echo(&context, request, &response);
+  EXPECT_EQ(response.message(), request.message());
+  EXPECT_TRUE(s.IsOk());
+
+  std::unique_ptr<grpc::cpp::test::util::duplicate::TestService::Stub>
+      dup_pkg_stub(
+          grpc::cpp::test::util::duplicate::TestService::NewStub(channel));
+  ClientContext context2;
+  s = dup_pkg_stub->Echo(&context2, request, &response);
+  EXPECT_EQ("no package", response.message());
+  EXPECT_TRUE(s.IsOk());
 }
 
 }  // namespace testing
diff --git a/test/cpp/util/echo.proto b/test/cpp/util/echo.proto
index 1240399..bd5357f 100644
--- a/test/cpp/util/echo.proto
+++ b/test/cpp/util/echo.proto
@@ -1,25 +1,9 @@
 syntax = "proto2";
 
+import "test/cpp/util/messages.proto";
+
 package grpc.cpp.test.util;
 
-message RequestParams {
-  optional bool echo_deadline = 1;
-}
-
-message EchoRequest {
-  optional string message = 1;
-  optional RequestParams param = 2;
-}
-
-message ResponseParams {
-  optional int64 request_deadline = 1;
-}
-
-message EchoResponse {
-  optional string message = 1;
-  optional ResponseParams param = 2;
-}
-
 service TestService {
   rpc Echo(EchoRequest) returns (EchoResponse);
   rpc RequestStream(stream EchoRequest) returns (EchoResponse);
diff --git a/test/cpp/util/echo_duplicate.proto b/test/cpp/util/echo_duplicate.proto
new file mode 100644
index 0000000..c926683
--- /dev/null
+++ b/test/cpp/util/echo_duplicate.proto
@@ -0,0 +1,12 @@
+// This is a partial copy of echo.proto with a different package name.
+
+syntax = "proto2";
+
+import "test/cpp/util/messages.proto";
+
+package grpc.cpp.test.util.duplicate;
+
+service TestService {
+  rpc Echo(grpc.cpp.test.util.EchoRequest)
+      returns (grpc.cpp.test.util.EchoResponse);
+}
diff --git a/test/cpp/util/messages.proto b/test/cpp/util/messages.proto
new file mode 100644
index 0000000..d541821
--- /dev/null
+++ b/test/cpp/util/messages.proto
@@ -0,0 +1,21 @@
+syntax = "proto2";
+
+package grpc.cpp.test.util;
+
+message RequestParams {
+  optional bool echo_deadline = 1;
+}
+
+message EchoRequest {
+  optional string message = 1;
+  optional RequestParams param = 2;
+}
+
+message ResponseParams {
+  optional int64 request_deadline = 1;
+}
+
+message EchoResponse {
+  optional string message = 1;
+  optional ResponseParams param = 2;
+}