diff options
Diffstat (limited to 'src/csharp/Grpc.IntegrationTesting')
10 files changed, 208 insertions, 121 deletions
diff --git a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj index 8f7a17efcb..c3e5f03074 100644 --- a/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj +++ b/src/csharp/Grpc.IntegrationTesting/Grpc.IntegrationTesting.csproj @@ -39,6 +39,9 @@ <Reference Include="Google.ProtocolBuffers"> <HintPath>..\packages\Google.ProtocolBuffers.2.4.1.521\lib\net40\Google.ProtocolBuffers.dll</HintPath> </Reference> + <Reference Include="System.Collections.Immutable"> + <HintPath>..\packages\System.Collections.Immutable.1.1.34-rc\lib\portable-net45+win8+wp8+wpa81\System.Collections.Immutable.dll</HintPath> + </Reference> </ItemGroup> <ItemGroup> <Compile Include="Properties\AssemblyInfo.cs" /> @@ -49,6 +52,7 @@ <Compile Include="TestServiceImpl.cs" /> <Compile Include="InteropServer.cs" /> <Compile Include="InteropClient.cs" /> + <Compile Include="TestCredentials.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <ItemGroup> @@ -75,8 +79,5 @@ <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> </None> </ItemGroup> - <ItemGroup> - <Folder Include="proto\" /> - <Folder Include="data\" /> - </ItemGroup> -</Project> + <ItemGroup /> +</Project>
\ No newline at end of file diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs index 30301f165b..6b92d3c660 100644 --- a/src/csharp/Grpc.IntegrationTesting/InteropClient.cs +++ b/src/csharp/Grpc.IntegrationTesting/InteropClient.cs @@ -38,10 +38,10 @@ using System.IO; using System.Text.RegularExpressions; using System.Threading.Tasks; using Google.ProtocolBuffers; +using grpc.testing; using Grpc.Core; using Grpc.Core.Utils; using NUnit.Framework; -using grpc.testing; namespace Grpc.IntegrationTesting { @@ -50,8 +50,8 @@ namespace Grpc.IntegrationTesting private class ClientOptions { public bool help; - public string serverHost= "127.0.0.1"; - public string serverHostOverride = "foo.test.google.fr"; + public string serverHost = "127.0.0.1"; + public string serverHostOverride = TestCredentials.DefaultHostOverride; public int? serverPort; public string testCase = "large_unary"; public bool useTls; @@ -103,22 +103,13 @@ namespace Grpc.IntegrationTesting Credentials credentials = null; if (options.useTls) { - string caPath = "data/ca.pem"; // Default testing CA - if (!options.useTestCa) - { - caPath = Environment.GetEnvironmentVariable("SSL_CERT_FILE"); - if (string.IsNullOrEmpty(caPath)) - { - throw new ArgumentException("CA path environment variable is not set."); - } - } - credentials = new SslCredentials(File.ReadAllText(caPath)); + credentials = TestCredentials.CreateTestClientCredentials(options.useTestCa); } ChannelArgs channelArgs = null; if (!string.IsNullOrEmpty(options.serverHostOverride)) { - channelArgs = ChannelArgs.NewBuilder() + channelArgs = ChannelArgs.CreateBuilder() .AddString(ChannelArgs.SslTargetNameOverrideKey, options.serverHostOverride).Build(); } @@ -189,7 +180,7 @@ namespace Grpc.IntegrationTesting { Console.WriteLine("running client_streaming"); - var bodySizes = new List<int>{27182, 8, 1828, 45904}; + var bodySizes = new List<int> { 27182, 8, 1828, 45904 }; var context = client.StreamingInputCall(); foreach (var size in bodySizes) @@ -208,7 +199,7 @@ namespace Grpc.IntegrationTesting { Console.WriteLine("running server_streaming"); - var bodySizes = new List<int>{31415, 9, 2653, 58979}; + var bodySizes = new List<int> { 31415, 9, 2653, 58979 }; var request = StreamingOutputCallRequest.CreateBuilder() .SetResponseType(PayloadType.COMPRESSABLE) @@ -265,7 +256,6 @@ namespace Grpc.IntegrationTesting Assert.AreEqual(PayloadType.COMPRESSABLE, response.Payload.Type); Assert.AreEqual(2653, response.Payload.Body.Length); - inputs.OnNext(StreamingOutputCallRequest.CreateBuilder() .SetResponseType(PayloadType.COMPRESSABLE) .AddResponseParameters(ResponseParameters.CreateBuilder().SetSize(58979)) @@ -301,17 +291,18 @@ namespace Grpc.IntegrationTesting public static void RunBenchmarkEmptyUnary(TestServiceGrpc.ITestServiceClient client) { BenchmarkUtil.RunBenchmark(10000, 10000, - () => { client.EmptyCall(Empty.DefaultInstance);}); + () => { client.EmptyCall(Empty.DefaultInstance); }); } - private static Payload CreateZerosPayload(int size) { + private static Payload CreateZerosPayload(int size) + { return Payload.CreateBuilder().SetBody(ByteString.CopyFrom(new byte[size])).Build(); } private static ClientOptions ParseArguments(string[] args) { var options = new ClientOptions(); - foreach(string arg in args) + foreach (string arg in args) { ParseArgument(arg, options); if (options.help) diff --git a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs index 4bb0b9ee51..1e76d3df21 100644 --- a/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs +++ b/src/csharp/Grpc.IntegrationTesting/InteropClientServerTest.cs @@ -35,10 +35,10 @@ using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using grpc.testing; using Grpc.Core; using Grpc.Core.Utils; using NUnit.Framework; -using grpc.testing; namespace Grpc.IntegrationTesting { @@ -59,9 +59,13 @@ namespace Grpc.IntegrationTesting server = new Server(); server.AddServiceDefinition(TestServiceGrpc.BindService(new TestServiceImpl())); - int port = server.AddPort(host + ":0"); + int port = server.AddListeningPort(host + ":0", TestCredentials.CreateTestServerCredentials()); server.Start(); - channel = new Channel(host + ":" + port); + + var channelArgs = ChannelArgs.CreateBuilder() + .AddString(ChannelArgs.SslTargetNameOverrideKey, TestCredentials.DefaultHostOverride).Build(); + + channel = new Channel(host + ":" + port, TestCredentials.CreateTestClientCredentials(true), channelArgs); client = TestServiceGrpc.NewStub(channel); } @@ -113,7 +117,5 @@ namespace Grpc.IntegrationTesting // TODO: add cancel_after_begin // TODO: add cancel_after_first_response - } } - diff --git a/src/csharp/Grpc.IntegrationTesting/InteropServer.cs b/src/csharp/Grpc.IntegrationTesting/InteropServer.cs index a25d3b3530..ad5200774f 100644 --- a/src/csharp/Grpc.IntegrationTesting/InteropServer.cs +++ b/src/csharp/Grpc.IntegrationTesting/InteropServer.cs @@ -34,13 +34,14 @@ using System; using System.Collections.Generic; using System.Diagnostics; +using System.IO; using System.Text.RegularExpressions; using System.Threading.Tasks; using Google.ProtocolBuffers; +using grpc.testing; using Grpc.Core; using Grpc.Core.Utils; using NUnit.Framework; -using grpc.testing; namespace Grpc.IntegrationTesting { @@ -49,7 +50,7 @@ namespace Grpc.IntegrationTesting private class ServerOptions { public bool help; - public int? port; + public int? port = 8070; public bool useTls; } @@ -93,7 +94,14 @@ namespace Grpc.IntegrationTesting server.AddServiceDefinition(TestServiceGrpc.BindService(new TestServiceImpl())); string addr = "0.0.0.0:" + options.port; - server.AddPort(addr); + if (options.useTls) + { + server.AddListeningPort(addr, TestCredentials.CreateTestServerCredentials()); + } + else + { + server.AddListeningPort(addr); + } Console.WriteLine("Running server on " + addr); server.Start(); @@ -105,7 +113,7 @@ namespace Grpc.IntegrationTesting private static ServerOptions ParseArguments(string[] args) { var options = new ServerOptions(); - foreach(string arg in args) + foreach (string arg in args) { ParseArgument(arg, options); if (options.help) diff --git a/src/csharp/Grpc.IntegrationTesting/Properties/AssemblyInfo.cs b/src/csharp/Grpc.IntegrationTesting/Properties/AssemblyInfo.cs index f633c19132..f09a448e9e 100644 --- a/src/csharp/Grpc.IntegrationTesting/Properties/AssemblyInfo.cs +++ b/src/csharp/Grpc.IntegrationTesting/Properties/AssemblyInfo.cs @@ -1,8 +1,6 @@ using System.Reflection; using System.Runtime.CompilerServices; -// Information about this assembly is defined by the following attributes. -// Change them to the values specific to your project. [assembly: AssemblyTitle("Grpc.IntegrationTesting")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] @@ -11,12 +9,4 @@ using System.Runtime.CompilerServices; [assembly: AssemblyCopyright("Google Inc. All rights reserved.")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] -// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". -// The form "{Major}.{Minor}.*" will automatically update the build and revision, -// and "{Major}.{Minor}.{Build}.*" will update just the revision. [assembly: AssemblyVersion("0.1.*")] -// The following attributes are used to specify the signing key for the assembly, -// if desired. See the Mono documentation for more information about signing. -//[assembly: AssemblyDelaySign(false)] -//[assembly: AssemblyKeyFile("")] - diff --git a/src/csharp/Grpc.IntegrationTesting/Settings.StyleCop b/src/csharp/Grpc.IntegrationTesting/Settings.StyleCop new file mode 100644 index 0000000000..fb99cd4af1 --- /dev/null +++ b/src/csharp/Grpc.IntegrationTesting/Settings.StyleCop @@ -0,0 +1,11 @@ +<StyleCopSettings Version="105"> + <SourceFileList> + <SourceFile>Messages.cs</SourceFile> + <SourceFile>Empty.cs</SourceFile> + <Settings> + <GlobalSettings> + <BooleanProperty Name="RulesEnabledByDefault">False</BooleanProperty> + </GlobalSettings> + </Settings> + </SourceFileList> +</StyleCopSettings>
\ No newline at end of file diff --git a/src/csharp/Grpc.IntegrationTesting/TestCredentials.cs b/src/csharp/Grpc.IntegrationTesting/TestCredentials.cs new file mode 100644 index 0000000000..401c50b1ae --- /dev/null +++ b/src/csharp/Grpc.IntegrationTesting/TestCredentials.cs @@ -0,0 +1,84 @@ +#region Copyright notice and license + +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#endregion + +using System; +using System.Collections.Generic; +using System.Collections.Immutable; +using System.Diagnostics; +using System.IO; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using Google.ProtocolBuffers; +using grpc.testing; +using Grpc.Core; +using Grpc.Core.Utils; +using NUnit.Framework; + +namespace Grpc.IntegrationTesting +{ + /// <summary> + /// SSL Credentials for testing. + /// </summary> + public static class TestCredentials + { + public const string DefaultHostOverride = "foo.test.google.fr"; + + public const string ClientCertAuthorityPath = "data/ca.pem"; + public const string ClientCertAuthorityEnvName = "SSL_CERT_FILE"; + + public const string ServerCertChainPath = "data/server1.pem"; + public const string ServerPrivateKeyPath = "data/server1.key"; + + public static SslCredentials CreateTestClientCredentials(bool useTestCa) + { + string caPath = ClientCertAuthorityPath; + if (!useTestCa) + { + caPath = Environment.GetEnvironmentVariable(ClientCertAuthorityEnvName); + if (string.IsNullOrEmpty(caPath)) + { + throw new ArgumentException("CA path environment variable is not set."); + } + } + return new SslCredentials(File.ReadAllText(caPath)); + } + + public static SslServerCredentials CreateTestServerCredentials() + { + var keyCertPair = new KeyCertificatePair( + File.ReadAllText(ServerCertChainPath), + File.ReadAllText(ServerPrivateKeyPath)); + return new SslServerCredentials(ImmutableList.Create(keyCertPair)); + } + } +} diff --git a/src/csharp/Grpc.IntegrationTesting/TestServiceGrpc.cs b/src/csharp/Grpc.IntegrationTesting/TestServiceGrpc.cs index b71704bcc7..f63e0361a4 100644 --- a/src/csharp/Grpc.IntegrationTesting/TestServiceGrpc.cs +++ b/src/csharp/Grpc.IntegrationTesting/TestServiceGrpc.cs @@ -44,50 +44,51 @@ namespace grpc.testing /// </summary> public class TestServiceGrpc { - readonly static Marshaller<Empty> emptyMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), Empty.ParseFrom); - readonly static Marshaller<SimpleRequest> simpleRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), SimpleRequest.ParseFrom); - readonly static Marshaller<SimpleResponse> simpleResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), SimpleResponse.ParseFrom); - readonly static Marshaller<StreamingOutputCallRequest> streamingOutputCallRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallRequest.ParseFrom); - readonly static Marshaller<StreamingOutputCallResponse> streamingOutputCallResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallResponse.ParseFrom); - readonly static Marshaller<StreamingInputCallRequest> streamingInputCallRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallRequest.ParseFrom); - readonly static Marshaller<StreamingInputCallResponse> streamingInputCallResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallResponse.ParseFrom); - - readonly static Method<Empty, Empty> emptyCallMethod = new Method<Empty, Empty>( + static readonly string ServiceName = "/grpc.testing.TestService"; + + static readonly Marshaller<Empty> EmptyMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), Empty.ParseFrom); + static readonly Marshaller<SimpleRequest> SimpleRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), SimpleRequest.ParseFrom); + static readonly Marshaller<SimpleResponse> SimpleResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), SimpleResponse.ParseFrom); + static readonly Marshaller<StreamingOutputCallRequest> StreamingOutputCallRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallRequest.ParseFrom); + static readonly Marshaller<StreamingOutputCallResponse> StreamingOutputCallResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingOutputCallResponse.ParseFrom); + static readonly Marshaller<StreamingInputCallRequest> StreamingInputCallRequestMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallRequest.ParseFrom); + static readonly Marshaller<StreamingInputCallResponse> StreamingInputCallResponseMarshaller = Marshallers.Create((arg) => arg.ToByteArray(), StreamingInputCallResponse.ParseFrom); + + static readonly Method<Empty, Empty> EmptyCallMethod = new Method<Empty, Empty>( MethodType.Unary, - "/grpc.testing.TestService/EmptyCall", - emptyMarshaller, - emptyMarshaller - ); - readonly static Method<SimpleRequest, SimpleResponse> unaryCallMethod = new Method<SimpleRequest, SimpleResponse>( + "EmptyCall", + EmptyMarshaller, + EmptyMarshaller); + + static readonly Method<SimpleRequest, SimpleResponse> UnaryCallMethod = new Method<SimpleRequest, SimpleResponse>( MethodType.Unary, - "/grpc.testing.TestService/UnaryCall", - simpleRequestMarshaller, - simpleResponseMarshaller - ); - readonly static Method<StreamingOutputCallRequest, StreamingOutputCallResponse> streamingOutputCallMethod = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>( + "UnaryCall", + SimpleRequestMarshaller, + SimpleResponseMarshaller); + + static readonly Method<StreamingOutputCallRequest, StreamingOutputCallResponse> StreamingOutputCallMethod = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>( MethodType.ServerStreaming, - "/grpc.testing.TestService/StreamingOutputCall", - streamingOutputCallRequestMarshaller, - streamingOutputCallResponseMarshaller - ); - readonly static Method<StreamingInputCallRequest, StreamingInputCallResponse> streamingInputCallMethod = new Method<StreamingInputCallRequest, StreamingInputCallResponse>( + "StreamingOutputCall", + StreamingOutputCallRequestMarshaller, + StreamingOutputCallResponseMarshaller); + + static readonly Method<StreamingInputCallRequest, StreamingInputCallResponse> StreamingInputCallMethod = new Method<StreamingInputCallRequest, StreamingInputCallResponse>( MethodType.ClientStreaming, - "/grpc.testing.TestService/StreamingInputCall", - streamingInputCallRequestMarshaller, - streamingInputCallResponseMarshaller - ); - readonly static Method<StreamingOutputCallRequest, StreamingOutputCallResponse> fullDuplexCallMethod = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>( + "StreamingInputCall", + StreamingInputCallRequestMarshaller, + StreamingInputCallResponseMarshaller); + + static readonly Method<StreamingOutputCallRequest, StreamingOutputCallResponse> FullDuplexCallMethod = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>( MethodType.DuplexStreaming, - "/grpc.testing.TestService/FullDuplexCall", - streamingOutputCallRequestMarshaller, - streamingOutputCallResponseMarshaller - ); - readonly static Method<StreamingOutputCallRequest, StreamingOutputCallResponse> halfDuplexCallMethod = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>( + "FullDuplexCall", + StreamingOutputCallRequestMarshaller, + StreamingOutputCallResponseMarshaller); + + static readonly Method<StreamingOutputCallRequest, StreamingOutputCallResponse> HalfDuplexCallMethod = new Method<StreamingOutputCallRequest, StreamingOutputCallResponse>( MethodType.DuplexStreaming, - "/grpc.testing.TestService/HalfDuplexCall", - streamingOutputCallRequestMarshaller, - streamingOutputCallResponseMarshaller - ); + "HalfDuplexCall", + StreamingOutputCallRequestMarshaller, + StreamingOutputCallResponseMarshaller); public interface ITestServiceClient { @@ -108,60 +109,61 @@ namespace grpc.testing IObserver<StreamingOutputCallRequest> HalfDuplexCall(IObserver<StreamingOutputCallResponse> responseObserver, CancellationToken token = default(CancellationToken)); } - public class TestServiceClientStub : ITestServiceClient + public class TestServiceClientStub : AbstractStub<TestServiceClientStub, StubConfiguration>, ITestServiceClient { - readonly Channel channel; + public TestServiceClientStub(Channel channel) : base(channel, StubConfiguration.Default) + { + } - public TestServiceClientStub(Channel channel) + public TestServiceClientStub(Channel channel, StubConfiguration config) : base(channel, config) { - this.channel = channel; } public Empty EmptyCall(Empty request, CancellationToken token = default(CancellationToken)) { - var call = new Grpc.Core.Call<Empty, Empty>(emptyCallMethod, channel); + var call = CreateCall(ServiceName, EmptyCallMethod); return Calls.BlockingUnaryCall(call, request, token); } public Task<Empty> EmptyCallAsync(Empty request, CancellationToken token = default(CancellationToken)) { - var call = new Grpc.Core.Call<Empty, Empty>(emptyCallMethod, channel); + var call = CreateCall(ServiceName, EmptyCallMethod); return Calls.AsyncUnaryCall(call, request, token); } public SimpleResponse UnaryCall(SimpleRequest request, CancellationToken token = default(CancellationToken)) { - var call = new Grpc.Core.Call<SimpleRequest, SimpleResponse>(unaryCallMethod, channel); + var call = CreateCall(ServiceName, UnaryCallMethod); return Calls.BlockingUnaryCall(call, request, token); } public Task<SimpleResponse> UnaryCallAsync(SimpleRequest request, CancellationToken token = default(CancellationToken)) { - var call = new Grpc.Core.Call<SimpleRequest, SimpleResponse>(unaryCallMethod, channel); + var call = CreateCall(ServiceName, UnaryCallMethod); return Calls.AsyncUnaryCall(call, request, token); } - public void StreamingOutputCall(StreamingOutputCallRequest request, IObserver<StreamingOutputCallResponse> responseObserver, CancellationToken token = default(CancellationToken)) { - var call = new Grpc.Core.Call<StreamingOutputCallRequest, StreamingOutputCallResponse>(streamingOutputCallMethod, channel); + public void StreamingOutputCall(StreamingOutputCallRequest request, IObserver<StreamingOutputCallResponse> responseObserver, CancellationToken token = default(CancellationToken)) + { + var call = CreateCall(ServiceName, StreamingOutputCallMethod); Calls.AsyncServerStreamingCall(call, request, responseObserver, token); } public ClientStreamingAsyncResult<StreamingInputCallRequest, StreamingInputCallResponse> StreamingInputCall(CancellationToken token = default(CancellationToken)) { - var call = new Grpc.Core.Call<StreamingInputCallRequest, StreamingInputCallResponse>(streamingInputCallMethod, channel); + var call = CreateCall(ServiceName, StreamingInputCallMethod); return Calls.AsyncClientStreamingCall(call, token); } public IObserver<StreamingOutputCallRequest> FullDuplexCall(IObserver<StreamingOutputCallResponse> responseObserver, CancellationToken token = default(CancellationToken)) { - var call = new Grpc.Core.Call<StreamingOutputCallRequest, StreamingOutputCallResponse>(fullDuplexCallMethod, channel); + var call = CreateCall(ServiceName, FullDuplexCallMethod); return Calls.DuplexStreamingCall(call, responseObserver, token); } - public IObserver<StreamingOutputCallRequest> HalfDuplexCall(IObserver<StreamingOutputCallResponse> responseObserver, CancellationToken token = default(CancellationToken)) { - var call = new Grpc.Core.Call<StreamingOutputCallRequest, StreamingOutputCallResponse>(halfDuplexCallMethod, channel); + var call = CreateCall(ServiceName, HalfDuplexCallMethod); return Calls.DuplexStreamingCall(call, responseObserver, token); } } @@ -184,13 +186,13 @@ namespace grpc.testing public static ServerServiceDefinition BindService(ITestService serviceImpl) { - return ServerServiceDefinition.CreateBuilder("/grpc.testing.TestService/") - .AddMethod(emptyCallMethod, serviceImpl.EmptyCall) - .AddMethod(unaryCallMethod, serviceImpl.UnaryCall) - .AddMethod(streamingOutputCallMethod, serviceImpl.StreamingOutputCall) - .AddMethod(streamingInputCallMethod, serviceImpl.StreamingInputCall) - .AddMethod(fullDuplexCallMethod, serviceImpl.FullDuplexCall) - .AddMethod(halfDuplexCallMethod, serviceImpl.HalfDuplexCall) + return ServerServiceDefinition.CreateBuilder(ServiceName) + .AddMethod(EmptyCallMethod, serviceImpl.EmptyCall) + .AddMethod(UnaryCallMethod, serviceImpl.UnaryCall) + .AddMethod(StreamingOutputCallMethod, serviceImpl.StreamingOutputCall) + .AddMethod(StreamingInputCallMethod, serviceImpl.StreamingInputCall) + .AddMethod(FullDuplexCallMethod, serviceImpl.FullDuplexCall) + .AddMethod(HalfDuplexCallMethod, serviceImpl.HalfDuplexCall) .Build(); } diff --git a/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs b/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs index 176843b130..661b31b0ee 100644 --- a/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs +++ b/src/csharp/Grpc.IntegrationTesting/TestServiceImpl.cs @@ -55,14 +55,14 @@ namespace grpc.testing { var response = SimpleResponse.CreateBuilder() .SetPayload(CreateZerosPayload(request.ResponseSize)).Build(); - //TODO: check we support ReponseType + // TODO: check we support ReponseType responseObserver.OnNext(response); responseObserver.OnCompleted(); } public void StreamingOutputCall(StreamingOutputCallRequest request, IObserver<StreamingOutputCallResponse> responseObserver) { - foreach(var responseParam in request.ResponseParametersList) + foreach (var responseParam in request.ResponseParametersList) { var response = StreamingOutputCallResponse.CreateBuilder() .SetPayload(CreateZerosPayload(responseParam.Size)).Build(); @@ -74,9 +74,10 @@ namespace grpc.testing public IObserver<StreamingInputCallRequest> StreamingInputCall(IObserver<StreamingInputCallResponse> responseObserver) { var recorder = new RecordingObserver<StreamingInputCallRequest>(); - Task.Run(() => { + Task.Run(() => + { int sum = 0; - foreach(var req in recorder.ToList().Result) + foreach (var req in recorder.ToList().Result) { sum += req.Payload.Body.Length; } @@ -98,8 +99,8 @@ namespace grpc.testing throw new NotImplementedException(); } - private class FullDuplexObserver : IObserver<StreamingOutputCallRequest> { - + private class FullDuplexObserver : IObserver<StreamingOutputCallRequest> + { readonly IObserver<StreamingOutputCallResponse> responseObserver; public FullDuplexObserver(IObserver<StreamingOutputCallResponse> responseObserver) @@ -119,22 +120,18 @@ namespace grpc.testing public void OnNext(StreamingOutputCallRequest value) { - // TODO: this is not in order!!! - //Task.Factory.StartNew(() => { - - foreach(var responseParam in value.ResponseParametersList) - { - var response = StreamingOutputCallResponse.CreateBuilder() - .SetPayload(CreateZerosPayload(responseParam.Size)).Build(); - responseObserver.OnNext(response); - } - //}); + foreach (var responseParam in value.ResponseParametersList) + { + var response = StreamingOutputCallResponse.CreateBuilder() + .SetPayload(CreateZerosPayload(responseParam.Size)).Build(); + responseObserver.OnNext(response); + } } } - private static Payload CreateZerosPayload(int size) { + private static Payload CreateZerosPayload(int size) + { return Payload.CreateBuilder().SetBody(ByteString.CopyFrom(new byte[size])).Build(); } } } - diff --git a/src/csharp/Grpc.IntegrationTesting/packages.config b/src/csharp/Grpc.IntegrationTesting/packages.config index 51c17bcd5e..157c264eac 100644 --- a/src/csharp/Grpc.IntegrationTesting/packages.config +++ b/src/csharp/Grpc.IntegrationTesting/packages.config @@ -2,4 +2,5 @@ <packages> <package id="Google.ProtocolBuffers" version="2.4.1.521" targetFramework="net45" /> <package id="NUnit" version="2.6.4" targetFramework="net45" /> + <package id="System.Collections.Immutable" version="1.1.34-rc" targetFramework="net45" /> </packages>
\ No newline at end of file |