aboutsummaryrefslogtreecommitdiff
path: root/csharp
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2008-08-14 20:35:31 +0100
committerJon Skeet <skeet@pobox.com>2008-08-14 20:35:31 +0100
commit5923b37223a013139ff0b01558eb37a206c33fd1 (patch)
tree269580794cf184433702e5835bb2610204f46377 /csharp
parent3ae573c17475021046f3d3b2b5f01de91c80aa1d (diff)
downloadprotobuf-5923b37223a013139ff0b01558eb37a206c33fd1.tar.gz
protobuf-5923b37223a013139ff0b01558eb37a206c33fd1.tar.bz2
protobuf-5923b37223a013139ff0b01558eb37a206c33fd1.zip
Finished service test with a mock.
Diffstat (limited to 'csharp')
-rw-r--r--csharp/ProtocolBuffers.Test/ServiceTest.cs137
-rw-r--r--csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dllbin293888 -> 287744 bytes
-rw-r--r--csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.xml215
-rw-r--r--csharp/ProtocolBuffers.Test/lib/nunit-license.txt15
-rw-r--r--csharp/ProtocolBuffers.Test/lib/rhino-license.txt25
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
index 16ff5e82..5ebbe568 100644
--- a/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll
+++ b/csharp/ProtocolBuffers.Test/lib/Rhino.Mocks.dll
Binary files differ
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 =&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.
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