diff options
author | Jon Skeet <skeet@pobox.com> | 2008-08-14 20:35:31 +0100 |
---|---|---|
committer | Jon Skeet <skeet@pobox.com> | 2008-08-14 20:35:31 +0100 |
commit | 5923b37223a013139ff0b01558eb37a206c33fd1 (patch) | |
tree | 269580794cf184433702e5835bb2610204f46377 | |
parent | 3ae573c17475021046f3d3b2b5f01de91c80aa1d (diff) | |
download | protobuf-5923b37223a013139ff0b01558eb37a206c33fd1.tar.gz protobuf-5923b37223a013139ff0b01558eb37a206c33fd1.tar.bz2 protobuf-5923b37223a013139ff0b01558eb37a206c33fd1.zip |
Finished service test with a mock.
-rw-r--r-- | csharp/ProtocolBuffers.Test/ServiceTest.cs | 137 | ||||
-rw-r--r-- | csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll | bin | 293888 -> 287744 bytes | |||
-rw-r--r-- | csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.xml | 215 | ||||
-rw-r--r-- | csharp/ProtocolBuffers.Test/lib/nunit-license.txt | 15 | ||||
-rw-r--r-- | csharp/ProtocolBuffers.Test/lib/rhino-license.txt | 25 |
5 files changed, 169 insertions, 223 deletions
diff --git a/csharp/ProtocolBuffers.Test/ServiceTest.cs b/csharp/ProtocolBuffers.Test/ServiceTest.cs index 82da04ba..d4864e2b 100644 --- a/csharp/ProtocolBuffers.Test/ServiceTest.cs +++ b/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); } - } + } } } diff --git a/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll b/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll Binary files differindex 16ff5e82..5ebbe568 100644 --- a/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll +++ b/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll diff --git a/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.xml b/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.xml index caace138..f36b92f1 100644 --- a/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.xml +++ b/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 => 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 => 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. diff --git a/csharp/ProtocolBuffers.Test/lib/nunit-license.txt b/csharp/ProtocolBuffers.Test/lib/nunit-license.txt new file mode 100644 index 00000000..4beb762c --- /dev/null +++ b/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. diff --git a/csharp/ProtocolBuffers.Test/lib/rhino-license.txt b/csharp/ProtocolBuffers.Test/lib/rhino-license.txt new file mode 100644 index 00000000..1c8a46e4 --- /dev/null +++ b/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.
\ No newline at end of file |