Browse Source

Finished service test with a mock.

Jon Skeet 17 years ago
parent
commit
5923b37223

+ 128 - 9
csharp/ProtocolBuffers.Test/ServiceTest.cs

@@ -2,6 +2,8 @@
 using Google.ProtocolBuffers.Descriptors;
 using Google.ProtocolBuffers.TestProtos;
 using NUnit.Framework;
+using Rhino.Mocks;
+using Rhino.Mocks.Constraints;
 
 namespace Google.ProtocolBuffers {
 
@@ -12,33 +14,150 @@ namespace Google.ProtocolBuffers {
   [TestFixture]
   public class ServiceTest {
 
+    delegate void Action<T1, T2>(T1 t1, T2 t2);
+
     private static readonly MethodDescriptor FooDescriptor = TestService.Descriptor.Methods[0];
     private static readonly MethodDescriptor BarDescriptor = TestService.Descriptor.Methods[1];
 
     [Test]
     public void GetRequestPrototype() {
-      TestService mockService = new TestServiceImpl();
+      TestService service = new TestServiceImpl();
 
-      Assert.AreSame(mockService.GetRequestPrototype(FooDescriptor), FooRequest.DefaultInstance);
-      Assert.AreSame(mockService.GetRequestPrototype(BarDescriptor), BarRequest.DefaultInstance);
+      Assert.AreSame(service.GetRequestPrototype(FooDescriptor), FooRequest.DefaultInstance);
+      Assert.AreSame(service.GetRequestPrototype(BarDescriptor), BarRequest.DefaultInstance);
     }
 
     [Test]
     public void GetResponsePrototype() {
-      TestService mockService = new TestServiceImpl();
+      TestService service = new TestServiceImpl();
+
+      Assert.AreSame(service.GetResponsePrototype(FooDescriptor), FooResponse.DefaultInstance);
+      Assert.AreSame(service.GetResponsePrototype(BarDescriptor), BarResponse.DefaultInstance);
+    }
+
+    [Test]
+    public void CallMethodFoo() {
+      MockRepository mocks = new MockRepository();
+      FooRequest fooRequest = FooRequest.CreateBuilder().Build();
+      FooResponse fooResponse = FooResponse.CreateBuilder().Build();
+      IRpcController controller = mocks.StrictMock<IRpcController>();
+
+      bool fooCalled = false;
+
+      TestService 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;          
+      });
+
+      using (mocks.Record()) {
+        // No mock interactions to record
+      }
+
+      service.CallMethod(FooDescriptor, controller, fooRequest, doneHandler);
+
+      Assert.IsTrue(doneHandlerCalled);
+      Assert.IsTrue(fooCalled);
+      mocks.VerifyAll();
+    }
+
+    delegate void CallFooDelegate(MethodDescriptor descriptor, IRpcController controller,
+        IMessage request, IMessage response, Action<IMessage> doneHandler);
+
+    /// <summary>
+    /// Tests the generated stub handling of Foo. By this stage we're reasonably confident
+    /// that the choice between Foo and Bar is arbitrary, hence the lack of a corresponding Bar
+    /// test.
+    /// </summary>
+    [Test]
+    public void GeneratedStubFooCall() {
+      FooRequest fooRequest = FooRequest.CreateBuilder().Build();      
+      MockRepository mocks = new MockRepository();
+      IRpcChannel mockChannel = mocks.StrictMock<IRpcChannel>();
+      IRpcController mockController = mocks.StrictMock<IRpcController>();
+      TestService service = TestService.CreateStub(mockChannel);
+      Action<FooResponse> doneHandler = mocks.StrictMock<Action<FooResponse>>();
+
+      using (mocks.Record()) {
+        
+        // Nasty way of mocking out "the channel calls the done handler".
+        Expect.Call(() => mockChannel.CallMethod(null, null, null, null, null))
+            .IgnoreArguments()
+            .Constraints(Is.Same(FooDescriptor), Is.Same(mockController), Is.Same(fooRequest), 
+                         Is.Same(FooResponse.DefaultInstance), Is.Anything())
+            .Do((CallFooDelegate) ((p1, p2, p3, response, done) => done(response)));
+        doneHandler.Invoke(FooResponse.DefaultInstance);
+      }
 
-      Assert.AreSame(mockService.GetResponsePrototype(FooDescriptor), FooResponse.DefaultInstance);
-      Assert.AreSame(mockService.GetResponsePrototype(BarDescriptor), BarResponse.DefaultInstance);
+      service.Foo(mockController, fooRequest, doneHandler);
+
+      mocks.VerifyAll();
+    }
+
+    [Test]
+    public void CallMethodBar() {
+      MockRepository mocks = new MockRepository();
+      BarRequest barRequest = BarRequest.CreateBuilder().Build();
+      BarResponse barResponse = BarResponse.CreateBuilder().Build();
+      IRpcController controller = mocks.StrictMock<IRpcController>();
+
+      bool barCalled = false;
+
+      TestService 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;
+      });
+
+      using (mocks.Record()) {
+        // No mock interactions to record
+      }
+
+      service.CallMethod(BarDescriptor, controller, barRequest, doneHandler);
+
+      Assert.IsTrue(doneHandlerCalled);
+      Assert.IsTrue(barCalled);
+      mocks.VerifyAll();
     }
     
+    
     class TestServiceImpl : TestService {
+      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) {
-        throw new System.NotImplementedException();
+        Assert.AreSame(expectedController, controller);
+        fooHandler(request, done);
       }
 
       public override void Bar(IRpcController controller, BarRequest request, Action<BarResponse> done) {
-        throw new System.NotImplementedException();
+        Assert.AreSame(expectedController, controller);
+        barHandler(request, done);
       }
-    }
+    }    
   }
 }

BIN
csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll


+ 1 - 214
csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.xml

@@ -290,31 +290,6 @@
             </summary>
             <value></value>
         </member>
-        <member name="T:Rhino.Mocks.Constraints.LambdaConstraint">
-            <summary>
-            A constraint based on lambda expression, we are using Expression{T} 
-            because we want to be able to get good error reporting on that.
-            </summary>
-        </member>
-        <member name="M:Rhino.Mocks.Constraints.LambdaConstraint.#ctor(System.Linq.Expressions.Expression)">
-            <summary>
-            Initializes a new instance of the <see cref="T:Rhino.Mocks.Constraints.LambdaConstraint"/> class.
-            </summary>
-            <param name="expr">The expr.</param>
-        </member>
-        <member name="M:Rhino.Mocks.Constraints.LambdaConstraint.Eval(System.Object)">
-            <summary>
-            determains if the object pass the constraints
-            </summary>
-            <param name="obj"></param>
-            <returns></returns>
-        </member>
-        <member name="P:Rhino.Mocks.Constraints.LambdaConstraint.Message">
-            <summary>
-            Gets the message for this constraint
-            </summary>
-            <value></value>
-        </member>
         <member name="T:Rhino.Mocks.Constraints.CollectionEqual">
             <summary>
             Constrain that the list contains the same items as the parameter list
@@ -3819,7 +3794,7 @@
             </summary>
             <typeparam name="T"></typeparam>
         </member>
-        <member name="M:Rhino.Mocks.Arg`1.Matches(System.Linq.Expressions.Expression{System.Predicate{`0}})">
+        <member name="M:Rhino.Mocks.Arg`1.Matches``1(System.Predicate{``0})">
             <summary>
             Register the predicate as a constraint for the current call.
             </summary>
@@ -4781,194 +4756,6 @@
             Logs all method calls for methods
             </summary>
         </member>
-        <member name="T:Rhino.Mocks.RhinoMocksExtensions">
-            <summary>
-            A set of extension methods that adds Arrange Act Assert mode to Rhino Mocks
-            </summary>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Expect``1(``0,System.Action{``0})">
-            <summary>
-            Create an expectation on this mock for this action to occur
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-            <returns></returns>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.BackToRecord``1(``0)">
-            <summary>
-            Reset all expectations on this mock object
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.BackToRecord``1(``0,Rhino.Mocks.BackToRecordOptions)">
-            <summary>
-            Reset the selected expectation on this mock object
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="options">The options to reset the expectations on this mock.</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Replay``1(``0)">
-            <summary>
-            Cause the mock state to change to replay, any further call is compared to the 
-            ones that were called in the record state.
-            </summary>
-            <param name="mock">the mocked object to move to replay state</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.GetMockRepository``1(``0)">
-            <summary>
-            Gets the mock repository for this specificied mock object
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <returns></returns>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Expect``2(``0,System.Func{``0,``1})">
-            <summary>
-            Create an expectation on this mock for this action to occur
-            </summary>
-            <typeparam name="T"></typeparam>
-            <typeparam name="R"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-            <returns></returns>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Stub``1(``0,System.Action{``0})">
-            <summary>
-            Tell the mock object to perform a certain action when a matching 
-            method is called.
-            Does not create an expectation for this method.
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-            <returns></returns>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Stub``2(``0,System.Func{``0,``1})">
-            <summary>
-            Tell the mock object to perform a certain action when a matching
-            method is called.
-            Does not create an expectation for this method.
-            </summary>
-            <typeparam name="T"></typeparam>
-            <typeparam name="R"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-            <returns></returns>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.GetArgumentsForCallsMadeOn``1(``0,System.Action{``0})">
-            <summary>
-            Gets the arguments for calls made on this mock object and the method that was called
-            in the action.
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-            <returns></returns>
-            <example>
-            Here we will get all the arguments for all the calls made to DoSomething(int)
-            <code>
-            var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x =&gt; x.DoSomething(0))
-            </code>
-            </example>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.GetArgumentsForCallsMadeOn``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
-            <summary>
-            Gets the arguments for calls made on this mock object and the method that was called
-            in the action and matches the given constraints
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-            <param name="setupConstraints">The setup constraints.</param>
-            <returns></returns>
-            <example>
-            Here we will get all the arguments for all the calls made to DoSomething(int)
-            <code>
-            var argsForCalls = foo54.GetArgumentsForCallsMadeOn(x =&gt; x.DoSomething(0))
-            </code>
-            </example>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasCalled``1(``0,System.Action{``0})">
-            <summary>
-            Asserts that a particular method was called on this mock object
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasCalled``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
-            <summary>
-            Asserts that a particular method was called on this mock object that match
-            a particular constraint set.
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-            <param name="setupConstraints">The setup constraints.</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasNotCalled``1(``0,System.Action{``0})">
-            <summary>
-            Asserts that a particular method was NOT called on this mock object
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.AssertWasNotCalled``1(``0,System.Action{``0},System.Action{Rhino.Mocks.Interfaces.IMethodOptions{System.Object}})">
-            <summary>
-            Asserts that a particular method was NOT called on this mock object that match
-            a particular constraint set.
-            </summary>
-            <typeparam name="T"></typeparam>
-            <param name="mock">The mock.</param>
-            <param name="action">The action.</param>
-            <param name="setupConstraints">The setup constraints.</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.VerifyAllExpectations(System.Object)">
-            <summary>
-            Verifies all expectations on this mock object
-            </summary>
-            <param name="mockObject">The mock object.</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.GetEventRaiser``1(``0,System.Action{``0})">
-            <summary>
-            Gets the event raiser for the event that was called in the action passed
-            </summary>
-            <typeparam name="TEventSource">The type of the event source.</typeparam>
-            <param name="mockObject">The mock object.</param>
-            <param name="eventSubscription">The event subscription.</param>
-            <returns></returns>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Raise``1(``0,System.Action{``0},System.Object,System.EventArgs)">
-            <summary>
-            Raise the specified event using the passed arguments.
-            The even is extracted from the passed labmda
-            </summary>
-            <typeparam name="TEventSource">The type of the event source.</typeparam>
-            <param name="mockObject">The mock object.</param>
-            <param name="eventSubscription">The event subscription.</param>
-            <param name="sender">The sender.</param>
-            <param name="args">The <see cref="T:System.EventArgs"/> instance containing the event data.</param>
-        </member>
-        <member name="M:Rhino.Mocks.RhinoMocksExtensions.Raise``1(``0,System.Action{``0},System.Object[])">
-            <summary>
-            Raise the specified event using the passed arguments.
-            The even is extracted from the passed labmda
-            </summary>
-            <typeparam name="TEventSource">The type of the event source.</typeparam>
-            <param name="mockObject">The mock object.</param>
-            <param name="eventSubscription">The event subscription.</param>
-            <param name="args">The args.</param>
-        </member>
-        <member name="T:Rhino.Mocks.RhinoMocksExtensions.VoidType">
-            <summary>
-            Fake type that disallow creating it.
-            Should have been System.Type, but we can't use it.
-            </summary>
-        </member>
         <member name="T:Rhino.Mocks.SetupResult">
             <summary>
             Setup method calls to repeat any number of times.

+ 15 - 0
csharp/ProtocolBuffers.Test/lib/nunit-license.txt

@@ -0,0 +1,15 @@
+Copyright © 2002-2007 Charlie Poole
+Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov
+Copyright © 2000-2002 Philip A. Craig
+
+This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.
+
+Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:
+
+1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment (see the following) in the product documentation is required.
+
+Portions Copyright © 2002-2007 Charlie Poole or Copyright © 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov or Copyright © 2000-2002 Philip A. Craig
+
+2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
+
+3. This notice may not be removed or altered from any source distribution.

+ 25 - 0
csharp/ProtocolBuffers.Test/lib/rhino-license.txt

@@ -0,0 +1,25 @@
+Copyright (c) 2005 - 2008 Ayende Rahien (ayende@ayende.com)
+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 Ayende Rahien 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.