Replace handwritten testService stub by the generated one
diff --git a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
index 13bbb53..1ca3dd2 100644
--- a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
+++ b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj
@@ -3,7 +3,7 @@
   <PropertyGroup>
     <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
     <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
-    <ProductVersion>10.0.0</ProductVersion>
+    <ProductVersion>8.0.30703</ProductVersion>
     <SchemaVersion>2.0</SchemaVersion>
     <ProjectGuid>{C61154BA-DD4A-4838-8420-0162A28925E0}</ProjectGuid>
     <OutputType>Library</OutputType>
@@ -72,7 +72,6 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Properties\AssemblyInfo.cs" />
-    <Compile Include="TestServiceGrpc.cs" />
     <Compile Include="Empty.cs" />
     <Compile Include="Messages.cs" />
     <Compile Include="InteropClientServerTest.cs" />
@@ -80,6 +79,7 @@
     <Compile Include="InteropServer.cs" />
     <Compile Include="InteropClient.cs" />
     <Compile Include="TestCredentials.cs" />
+    <Compile Include="TestGrpc.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
index a433659..02f8a36 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs
@@ -132,14 +132,14 @@
                     stubConfig = new StubConfiguration(OAuth2InterceptorFactory.Create(credential));
                 }
 
-                TestServiceGrpc.ITestServiceClient client = new TestServiceGrpc.TestServiceClientStub(channel, stubConfig);
+                TestService.ITestServiceClient client = new TestService.TestServiceClient(channel, stubConfig);
                 RunTestCase(options.testCase, client);
             }
 
             GrpcEnvironment.Shutdown();
         }
 
-        private void RunTestCase(string testCase, TestServiceGrpc.ITestServiceClient client)
+        private void RunTestCase(string testCase, TestService.ITestServiceClient client)
         {
             switch (testCase)
             {
@@ -181,7 +181,7 @@
             }
         }
 
-        public static void RunEmptyUnary(TestServiceGrpc.ITestServiceClient client)
+        public static void RunEmptyUnary(TestService.ITestServiceClient client)
         {
             Console.WriteLine("running empty_unary");
             var response = client.EmptyCall(Empty.DefaultInstance);
@@ -189,7 +189,7 @@
             Console.WriteLine("Passed!");
         }
 
-        public static void RunLargeUnary(TestServiceGrpc.ITestServiceClient client)
+        public static void RunLargeUnary(TestService.ITestServiceClient client)
         {
             Console.WriteLine("running large_unary");
             var request = SimpleRequest.CreateBuilder()
@@ -205,7 +205,7 @@
             Console.WriteLine("Passed!");
         }
 
-        public static void RunClientStreaming(TestServiceGrpc.ITestServiceClient client)
+        public static void RunClientStreaming(TestService.ITestServiceClient client)
         {
             Task.Run(async () =>
             {
@@ -222,7 +222,7 @@
             }).Wait();
         }
 
-        public static void RunServerStreaming(TestServiceGrpc.ITestServiceClient client)
+        public static void RunServerStreaming(TestService.ITestServiceClient client)
         {
             Task.Run(async () =>
             {
@@ -248,7 +248,7 @@
             }).Wait();
         }
 
-        public static void RunPingPong(TestServiceGrpc.ITestServiceClient client)
+        public static void RunPingPong(TestService.ITestServiceClient client)
         {
             Task.Run(async () =>
             {
@@ -303,7 +303,7 @@
             }).Wait();
         }
 
-        public static void RunEmptyStream(TestServiceGrpc.ITestServiceClient client)
+        public static void RunEmptyStream(TestService.ITestServiceClient client)
         {
             Task.Run(async () =>
             {
@@ -318,7 +318,7 @@
             }).Wait();
         }
 
-        public static void RunServiceAccountCreds(TestServiceGrpc.ITestServiceClient client)
+        public static void RunServiceAccountCreds(TestService.ITestServiceClient client)
         {
             Console.WriteLine("running service_account_creds");
             var request = SimpleRequest.CreateBuilder()
@@ -338,7 +338,7 @@
             Console.WriteLine("Passed!");
         }
 
-        public static void RunComputeEngineCreds(TestServiceGrpc.ITestServiceClient client)
+        public static void RunComputeEngineCreds(TestService.ITestServiceClient client)
         {
             Console.WriteLine("running compute_engine_creds");
             var request = SimpleRequest.CreateBuilder()
@@ -358,7 +358,7 @@
             Console.WriteLine("Passed!");
         }
 
-        public static void RunCancelAfterBegin(TestServiceGrpc.ITestServiceClient client)
+        public static void RunCancelAfterBegin(TestService.ITestServiceClient client)
         {
             Task.Run(async () =>
             {
@@ -383,7 +383,7 @@
             }).Wait();
         }
 
-        public static void RunCancelAfterFirstResponse(TestServiceGrpc.ITestServiceClient client)
+        public static void RunCancelAfterFirstResponse(TestService.ITestServiceClient client)
         {
             Task.Run(async () =>
             {
@@ -419,7 +419,7 @@
         }
 
         // This is not an official interop test, but it's useful.
-        public static void RunBenchmarkEmptyUnary(TestServiceGrpc.ITestServiceClient client)
+        public static void RunBenchmarkEmptyUnary(TestService.ITestServiceClient client)
         {
             BenchmarkUtil.RunBenchmark(10000, 10000,
                                        () => { client.EmptyCall(Empty.DefaultInstance); });
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
index 9e49ce0..ddbfc61 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs
@@ -50,7 +50,7 @@
         string host = "localhost";
         Server server;
         Channel channel;
-        TestServiceGrpc.ITestServiceClient client;
+        TestService.ITestServiceClient client;
 
         [TestFixtureSetUp]
         public void Init()
@@ -58,7 +58,7 @@
             GrpcEnvironment.Initialize();
 
             server = new Server();
-            server.AddServiceDefinition(TestServiceGrpc.BindService(new TestServiceImpl()));
+            server.AddServiceDefinition(TestService.BindService(new TestServiceImpl()));
             int port = server.AddListeningPort(host, Server.PickUnusedPort, TestCredentials.CreateTestServerCredentials());
             server.Start();
 
@@ -66,7 +66,7 @@
                 .AddString(ChannelArgs.SslTargetNameOverrideKey, TestCredentials.DefaultHostOverride).Build();
 
             channel = new Channel(host + ":" + port, TestCredentials.CreateTestClientCredentials(true), channelArgs);
-            client = TestServiceGrpc.NewStub(channel);
+            client = TestService.NewStub(channel);
         }
 
         [TestFixtureTearDown]
diff --git a/src/csharp/Grpc.IntegrationTesting/InteropServer.cs b/src/csharp/Grpc.IntegrationTesting/InteropServer.cs
index ca54aed..87c3cbe 100644
--- a/src/csharp/Grpc.IntegrationTesting/InteropServer.cs
+++ b/src/csharp/Grpc.IntegrationTesting/InteropServer.cs
@@ -91,7 +91,7 @@
             GrpcEnvironment.Initialize();
 
             var server = new Server();
-            server.AddServiceDefinition(TestServiceGrpc.BindService(new TestServiceImpl()));
+            server.AddServiceDefinition(TestService.BindService(new TestServiceImpl()));
 
             string host = "0.0.0.0";
             int port = options.port.Value;
diff --git a/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
new file mode 100644
index 0000000..f232bdc
--- /dev/null
+++ b/src/csharp/Grpc.IntegrationTesting/TestGrpc.cs
@@ -0,0 +1,159 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: test.proto
+#region Designer generated code
+
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+using Grpc.Core;
+
+namespace grpc.testing {
+  public static class TestService
+  {
+    static readonly string __ServiceName = "grpc.testing.TestService";
+
+    static readonly Marshaller<Empty> __Marshaller_Empty = Marshallers.Create((arg) => arg.ToByteArray(), Empty.ParseFrom);
+    static readonly Marshaller<SimpleRequest> __Marshaller_SimpleRequest = Marshallers.Create((arg) => arg.ToByteArray(), SimpleRequest.ParseFrom);
+    static readonly Marshaller<SimpleResponse> __Marshaller_SimpleResponse = Marshallers.Create((arg) => arg.ToByteArray(), SimpleResponse.ParseFrom);
+    static readonly Marshaller<StreamingOutputCallRequest> __Marshaller_StreamingOutputCallRequest = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallRequest.ParseFrom);
+    static readonly Marshaller<StreamingOutputCallResponse> __Marshaller_StreamingOutputCallResponse = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallResponse.ParseFrom);
+    static readonly Marshaller<StreamingInputCallRequest> __Marshaller_StreamingInputCallRequest = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallRequest.ParseFrom);
+    static readonly Marshaller<StreamingInputCallResponse> __Marshaller_StreamingInputCallResponse = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallResponse.ParseFrom);
+
+    static readonly Method<Empty, Empty> __Method_EmptyCall = new Method<Empty, Empty>(
+        MethodType.Unary,
+        "EmptyCall",
+        __Marshaller_Empty,
+        __Marshaller_Empty);
+
+    static readonly Method<SimpleRequest, SimpleResponse> __Method_UnaryCall = new Method<SimpleRequest, SimpleResponse>(
+        MethodType.Unary,
+        "UnaryCall",
+        __Marshaller_SimpleRequest,
+        __Marshaller_SimpleResponse);
+
+    static readonly Method<StreamingOutputCallRequest, StreamingOutputCallResponse> __Method_StreamingOutputCall = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>(
+        MethodType.ServerStreaming,
+        "StreamingOutputCall",
+        __Marshaller_StreamingOutputCallRequest,
+        __Marshaller_StreamingOutputCallResponse);
+
+    static readonly Method<StreamingInputCallRequest, StreamingInputCallResponse> __Method_StreamingInputCall = new Method<StreamingInputCallRequest, StreamingInputCallResponse>(
+        MethodType.ClientStreaming,
+        "StreamingInputCall",
+        __Marshaller_StreamingInputCallRequest,
+        __Marshaller_StreamingInputCallResponse);
+
+    static readonly Method<StreamingOutputCallRequest, StreamingOutputCallResponse> __Method_FullDuplexCall = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>(
+        MethodType.DuplexStreaming,
+        "FullDuplexCall",
+        __Marshaller_StreamingOutputCallRequest,
+        __Marshaller_StreamingOutputCallResponse);
+
+    static readonly Method<StreamingOutputCallRequest, StreamingOutputCallResponse> __Method_HalfDuplexCall = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>(
+        MethodType.DuplexStreaming,
+        "HalfDuplexCall",
+        __Marshaller_StreamingOutputCallRequest,
+        __Marshaller_StreamingOutputCallResponse);
+
+    // client-side stub interface
+    public interface ITestServiceClient
+    {
+      Empty EmptyCall(Empty request, CancellationToken token = default(CancellationToken));
+      Task<Empty> EmptyCallAsync(Empty request, CancellationToken token = default(CancellationToken));
+      SimpleResponse UnaryCall(SimpleRequest request, CancellationToken token = default(CancellationToken));
+      Task<SimpleResponse> UnaryCallAsync(SimpleRequest request, CancellationToken token = default(CancellationToken));
+      AsyncServerStreamingCall<StreamingOutputCallResponse> StreamingOutputCall(StreamingOutputCallRequest request, CancellationToken token = default(CancellationToken));
+      AsyncClientStreamingCall<StreamingInputCallRequest, StreamingInputCallResponse> StreamingInputCall(CancellationToken token = default(CancellationToken));
+      AsyncDuplexStreamingCall<StreamingOutputCallRequest, StreamingOutputCallResponse> FullDuplexCall(CancellationToken token = default(CancellationToken));
+      AsyncDuplexStreamingCall<StreamingOutputCallRequest, StreamingOutputCallResponse> HalfDuplexCall(CancellationToken token = default(CancellationToken));
+    }
+
+    // server-side interface
+    public interface ITestService
+    {
+      Task<Empty> EmptyCall(ServerCallContext context, Empty request);
+      Task<SimpleResponse> UnaryCall(ServerCallContext context, SimpleRequest request);
+      Task StreamingOutputCall(ServerCallContext context, StreamingOutputCallRequest request, IServerStreamWriter<StreamingOutputCallResponse> responseStream);
+      Task<StreamingInputCallResponse> StreamingInputCall(ServerCallContext context, IAsyncStreamReader<StreamingInputCallRequest> requestStream);
+      Task FullDuplexCall(ServerCallContext context, IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream);
+      Task HalfDuplexCall(ServerCallContext context, IAsyncStreamReader<StreamingOutputCallRequest> requestStream, IServerStreamWriter<StreamingOutputCallResponse> responseStream);
+    }
+
+    // client stub
+    public class TestServiceClient : AbstractStub<TestServiceClient, StubConfiguration>, ITestServiceClient
+    {
+      public TestServiceClient(Channel channel) : this(channel, StubConfiguration.Default)
+      {
+      }
+      public TestServiceClient(Channel channel, StubConfiguration config) : base(channel, config)
+      {
+      }
+      public Empty EmptyCall(Empty request, CancellationToken token = default(CancellationToken))
+      {
+        var call = CreateCall(__ServiceName, __Method_EmptyCall);
+        return Calls.BlockingUnaryCall(call, request, token);
+      }
+      public Task<Empty> EmptyCallAsync(Empty request, CancellationToken token = default(CancellationToken))
+      {
+        var call = CreateCall(__ServiceName, __Method_EmptyCall);
+        return Calls.AsyncUnaryCall(call, request, token);
+      }
+      public SimpleResponse UnaryCall(SimpleRequest request, CancellationToken token = default(CancellationToken))
+      {
+        var call = CreateCall(__ServiceName, __Method_UnaryCall);
+        return Calls.BlockingUnaryCall(call, request, token);
+      }
+      public Task<SimpleResponse> UnaryCallAsync(SimpleRequest request, CancellationToken token = default(CancellationToken))
+      {
+        var call = CreateCall(__ServiceName, __Method_UnaryCall);
+        return Calls.AsyncUnaryCall(call, request, token);
+      }
+      public AsyncServerStreamingCall<StreamingOutputCallResponse> StreamingOutputCall(StreamingOutputCallRequest request, CancellationToken token = default(CancellationToken))
+      {
+        var call = CreateCall(__ServiceName, __Method_StreamingOutputCall);
+        return Calls.AsyncServerStreamingCall(call, request, token);
+      }
+      public AsyncClientStreamingCall<StreamingInputCallRequest, StreamingInputCallResponse> StreamingInputCall(CancellationToken token = default(CancellationToken))
+      {
+        var call = CreateCall(__ServiceName, __Method_StreamingInputCall);
+        return Calls.AsyncClientStreamingCall(call, token);
+      }
+      public AsyncDuplexStreamingCall<StreamingOutputCallRequest, StreamingOutputCallResponse> FullDuplexCall(CancellationToken token = default(CancellationToken))
+      {
+        var call = CreateCall(__ServiceName, __Method_FullDuplexCall);
+        return Calls.AsyncDuplexStreamingCall(call, token);
+      }
+      public AsyncDuplexStreamingCall<StreamingOutputCallRequest, StreamingOutputCallResponse> HalfDuplexCall(CancellationToken token = default(CancellationToken))
+      {
+        var call = CreateCall(__ServiceName, __Method_HalfDuplexCall);
+        return Calls.AsyncDuplexStreamingCall(call, token);
+      }
+    }
+
+    // creates service definition that can be registered with a server
+    public static ServerServiceDefinition BindService(ITestService serviceImpl)
+    {
+      return ServerServiceDefinition.CreateBuilder(__ServiceName)
+          .AddMethod(__Method_EmptyCall, serviceImpl.EmptyCall)
+          .AddMethod(__Method_UnaryCall, serviceImpl.UnaryCall)
+          .AddMethod(__Method_StreamingOutputCall, serviceImpl.StreamingOutputCall)
+          .AddMethod(__Method_StreamingInputCall, serviceImpl.StreamingInputCall)
+          .AddMethod(__Method_FullDuplexCall, serviceImpl.FullDuplexCall)
+          .AddMethod(__Method_HalfDuplexCall, serviceImpl.HalfDuplexCall).Build();
+    }
+
+    // creates a new client stub
+    public static ITestServiceClient NewStub(Channel channel)
+    {
+      return new TestServiceClient(channel);
+    }
+
+    // creates a new client stub
+    public static ITestServiceClient NewStub(Channel channel, StubConfiguration config)
+    {
+      return new TestServiceClient(channel, config);
+    }
+  }
+}
+#endregion
\ No newline at end of file
diff --git a/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs b/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs
index 40f32b5..d6ba61ef 100644
--- a/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs
+++ b/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs
@@ -44,7 +44,7 @@
     /// <summary>
     /// Implementation of TestService server
     /// </summary>
-    public class TestServiceImpl : TestServiceGrpc.ITestService
+    public class TestServiceImpl : TestService.ITestService
     {
         public Task<Empty> EmptyCall(ServerCallContext context, Empty request)
         {