aboutsummaryrefslogtreecommitdiffhomepage
path: root/csharp/src/ProtocolBuffers.Test/ServiceTest.cs
diff options
context:
space:
mode:
Diffstat (limited to 'csharp/src/ProtocolBuffers.Test/ServiceTest.cs')
-rw-r--r--csharp/src/ProtocolBuffers.Test/ServiceTest.cs262
1 files changed, 262 insertions, 0 deletions
diff --git a/csharp/src/ProtocolBuffers.Test/ServiceTest.cs b/csharp/src/ProtocolBuffers.Test/ServiceTest.cs
new file mode 100644
index 00000000..ee28ca1c
--- /dev/null
+++ b/csharp/src/ProtocolBuffers.Test/ServiceTest.cs
@@ -0,0 +1,262 @@
+#region Copyright notice and license
+
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc. All rights reserved.
+// http://github.com/jskeet/dotnet-protobufs/
+// Original C++/Java/Python code:
+// http://code.google.com/p/protobuf/
+//
+// 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 Google.ProtocolBuffers.Descriptors;
+using Google.ProtocolBuffers.TestProtos;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+namespace Google.ProtocolBuffers
+{
+ /// <summary>
+ /// Tests for generated service classes.
+ /// TODO(jonskeet): Convert the mocking tests using Rhino.Mocks.
+ /// </summary>
+ [TestClass]
+ public class ServiceTest
+ {
+ private delegate void Action<T1, T2>(T1 t1, T2 t2);
+
+ private static readonly MethodDescriptor FooDescriptor = TestGenericService.Descriptor.Methods[0];
+ private static readonly MethodDescriptor BarDescriptor = TestGenericService.Descriptor.Methods[1];
+
+ [TestMethod]
+ public void GetRequestPrototype()
+ {
+ TestGenericService service = new TestServiceImpl();
+
+ Assert.AreSame(service.GetRequestPrototype(FooDescriptor), FooRequest.DefaultInstance);
+ Assert.AreSame(service.GetRequestPrototype(BarDescriptor), BarRequest.DefaultInstance);
+ }
+
+ [TestMethod]
+ public void GetResponsePrototype()
+ {
+ TestGenericService service = new TestServiceImpl();
+
+ Assert.AreSame(service.GetResponsePrototype(FooDescriptor), FooResponse.DefaultInstance);
+ Assert.AreSame(service.GetResponsePrototype(BarDescriptor), BarResponse.DefaultInstance);
+ }
+
+ [TestMethod]
+ public void CallMethodFoo()
+ {
+ FooRequest fooRequest = FooRequest.CreateBuilder().Build();
+ FooResponse fooResponse = FooResponse.CreateBuilder().Build();
+ IRpcController controller = new RpcTestController();
+
+ bool fooCalled = false;
+
+ TestGenericService service = new TestServiceImpl((request, responseAction) =>
+ {
+ Assert.AreSame(fooRequest, request);
+ fooCalled = true;
+ responseAction(fooResponse);
+ }, null, controller);
+
+ bool doneHandlerCalled = false;
+ Action<IMessage> doneHandler = (response =>
+ {
+ Assert.AreSame(fooResponse, response);
+ doneHandlerCalled = true;
+ });
+
+ service.CallMethod(FooDescriptor, controller, fooRequest, doneHandler);
+
+ Assert.IsTrue(doneHandlerCalled);
+ Assert.IsTrue(fooCalled);
+ }
+
+ [TestMethod]
+ public void CallMethodBar()
+ {
+ BarRequest barRequest = BarRequest.CreateBuilder().Build();
+ BarResponse barResponse = BarResponse.CreateBuilder().Build();
+ IRpcController controller = new RpcTestController();
+
+ bool barCalled = false;
+
+ TestGenericService service = new TestServiceImpl(null, (request, responseAction) =>
+ {
+ Assert.AreSame(barRequest, request);
+ barCalled = true;
+ responseAction(barResponse);
+ }, controller);
+
+ bool doneHandlerCalled = false;
+ Action<IMessage> doneHandler = (response =>
+ {
+ Assert.AreSame(barResponse, response);
+ doneHandlerCalled = true;
+ });
+
+ service.CallMethod(BarDescriptor, controller, barRequest, doneHandler);
+
+ Assert.IsTrue(doneHandlerCalled);
+ Assert.IsTrue(barCalled);
+ }
+
+ [TestMethod]
+ public void GeneratedStubFooCall()
+ {
+ IRpcChannel channel = new RpcTestChannel();
+ IRpcController controller = new RpcTestController();
+ TestGenericService service = TestGenericService.CreateStub(channel);
+ FooResponse fooResponse = null;
+ Action<FooResponse> doneHandler = r => fooResponse = r;
+
+ service.Foo(controller, FooRequest.DefaultInstance, doneHandler);
+
+ Assert.IsNotNull(fooResponse);
+ Assert.IsFalse(controller.Failed);
+ }
+
+ [TestMethod]
+ public void GeneratedStubBarCallFails()
+ {
+ IRpcChannel channel = new RpcTestChannel();
+ IRpcController controller = new RpcTestController();
+ TestGenericService service = TestGenericService.CreateStub(channel);
+ BarResponse barResponse = null;
+ Action<BarResponse> doneHandler = r => barResponse = r;
+
+ service.Bar(controller, BarRequest.DefaultInstance, doneHandler);
+
+ Assert.IsNull(barResponse);
+ Assert.IsTrue(controller.Failed);
+ }
+
+ #region RpcTestController
+ private class RpcTestController : IRpcController
+ {
+ public string TestFailedReason { get; set; }
+ public bool TestCancelled { get; set; }
+ public Action<object> TestCancelledCallback { get; set; }
+
+ void IRpcController.Reset()
+ {
+ TestFailedReason = null;
+ TestCancelled = false;
+ TestCancelledCallback = null;
+ }
+
+ bool IRpcController.Failed
+ {
+ get { return TestFailedReason != null; }
+ }
+
+ string IRpcController.ErrorText
+ {
+ get { return TestFailedReason; }
+ }
+
+ void IRpcController.StartCancel()
+ {
+ TestCancelled = true;
+ if (TestCancelledCallback != null)
+ TestCancelledCallback(this);
+ }
+
+ void IRpcController.SetFailed(string reason)
+ {
+ TestFailedReason = reason;
+ }
+
+ bool IRpcController.IsCanceled()
+ {
+ return TestCancelled;
+ }
+
+ void IRpcController.NotifyOnCancel(Action<object> callback)
+ {
+ TestCancelledCallback = callback;
+ }
+ }
+ #endregion
+ #region RpcTestChannel
+ private class RpcTestChannel : IRpcChannel
+ {
+ public MethodDescriptor TestMethodCalled { get; set; }
+
+ void IRpcChannel.CallMethod(MethodDescriptor method, IRpcController controller, IMessage request, IMessage responsePrototype, Action<IMessage> done)
+ {
+ TestMethodCalled = method;
+ try
+ {
+ done(FooResponse.DefaultInstance);
+ }
+ catch (Exception e)
+ {
+ controller.SetFailed(e.Message);
+ }
+ }
+ }
+ #endregion
+ #region TestServiceImpl
+ private class TestServiceImpl : TestGenericService
+ {
+ private readonly Action<FooRequest, Action<FooResponse>> fooHandler;
+ private readonly Action<BarRequest, Action<BarResponse>> barHandler;
+ private readonly IRpcController expectedController;
+
+ internal TestServiceImpl()
+ {
+ }
+
+ internal TestServiceImpl(Action<FooRequest, Action<FooResponse>> fooHandler,
+ Action<BarRequest, Action<BarResponse>> barHandler,
+ IRpcController expectedController)
+ {
+ this.fooHandler = fooHandler;
+ this.barHandler = barHandler;
+ this.expectedController = expectedController;
+ }
+
+ public override void Foo(IRpcController controller, FooRequest request, Action<FooResponse> done)
+ {
+ Assert.AreSame(expectedController, controller);
+ fooHandler(request, done);
+ }
+
+ public override void Bar(IRpcController controller, BarRequest request, Action<BarResponse> done)
+ {
+ Assert.AreSame(expectedController, controller);
+ barHandler(request, done);
+ }
+ }
+ #endregion
+ }
+} \ No newline at end of file