/DotNet/Source/ProtoBufRemote.Test/RpcServerTest.cs

https://code.google.com/p/protobuf-remote/ · C# · 382 lines · 315 code · 65 blank · 2 comment · 74 complexity · 27036e5531717834ca9af5cc2edb5b96 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Text;
  6. using Moq;
  7. using NUnit.Framework;
  8. namespace ProtoBufRemote.Test
  9. {
  10. [TestFixture]
  11. public class RpcServerTest
  12. {
  13. private RpcServer server;
  14. private Mock<RpcController> controller;
  15. private RpcMessage squareCallMessage;
  16. private RpcMessage doStuffCallMessage;
  17. private RpcMessage testParamCallMessage;
  18. private SampleService sampleService;
  19. [SetUp]
  20. public void Init()
  21. {
  22. controller = new Mock<RpcController>();
  23. squareCallMessage = new RpcMessage();
  24. squareCallMessage.Id = 42;
  25. squareCallMessage.CallMessage = new RpcMessage.Call();
  26. squareCallMessage.CallMessage.Service = "ISampleService";
  27. squareCallMessage.CallMessage.Method = "GetSquare";
  28. squareCallMessage.CallMessage.ExpectsResult = true;
  29. squareCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { IntParam = 5 });
  30. doStuffCallMessage = new RpcMessage();
  31. doStuffCallMessage.Id = 43;
  32. doStuffCallMessage.CallMessage = new RpcMessage.Call();
  33. doStuffCallMessage.CallMessage.Service = "ISampleService";
  34. doStuffCallMessage.CallMessage.Method = "DoStuff";
  35. doStuffCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { StringParam = "Hello" });
  36. testParamCallMessage = new RpcMessage();
  37. testParamCallMessage.Id = 44;
  38. testParamCallMessage.CallMessage = new RpcMessage.Call();
  39. testParamCallMessage.CallMessage.Service = "ISampleService";
  40. testParamCallMessage.CallMessage.ExpectsResult = true;
  41. server = new RpcServer(controller.Object);
  42. sampleService = new SampleService();
  43. server.RegisterService(sampleService);
  44. }
  45. [Test]
  46. public void ControllerSetTest()
  47. {
  48. controller.VerifySet(c => c.Server = server);
  49. }
  50. interface IServiceTestInterface
  51. {
  52. int DoStuff();
  53. }
  54. class ServiceTestImpl : IServiceTestInterface
  55. {
  56. public int DoStuff() { return 42; }
  57. }
  58. [Test]
  59. public void RegisterServiceTest()
  60. {
  61. //this should pass, we explicitly specify the interface as the service type
  62. server.RegisterService<IServiceTestInterface>(new ServiceTestImpl());
  63. }
  64. [Test, ExpectedException(typeof(ArgumentException))]
  65. public void RegisterServiceFailureTest()
  66. {
  67. //this should fail, a class type cannot be used as a service unless it is attributed
  68. server.RegisterService(new ServiceTestImpl());
  69. }
  70. [Test, ExpectedException(typeof(ArgumentException))]
  71. public void RegisterDuplicatedServiceFailureTest()
  72. {
  73. server.RegisterService<IServiceTestInterface>(new ServiceTestImpl());
  74. server.RegisterService<IServiceTestInterface>(new ServiceTestImpl());
  75. }
  76. [Test]
  77. public void CallTest()
  78. {
  79. server.ReceiveCall(squareCallMessage);
  80. controller.Verify(c => c.Send(It.Is<RpcMessage>(m => IsSquareResultMessageCorrect(m))));
  81. }
  82. [Test]
  83. public void CallWithoutResultTest()
  84. {
  85. squareCallMessage.CallMessage.ExpectsResult = false;
  86. server.ReceiveCall(squareCallMessage);
  87. controller.Verify(c => c.Send(It.IsAny<RpcMessage>()), Times.Never());
  88. }
  89. [Test]
  90. public void CallUnknownServiceTest()
  91. {
  92. squareCallMessage.CallMessage.Service = "NotAnActualService";
  93. server.ReceiveCall(squareCallMessage);
  94. controller.Verify(c => c.Send(It.Is<RpcMessage>(m => IsFailureResultMessage(m))));
  95. }
  96. [Test]
  97. public void CallUnknownMethodTest()
  98. {
  99. squareCallMessage.CallMessage.Method = "NotAnActualMethod";
  100. server.ReceiveCall(squareCallMessage);
  101. controller.Verify(c => c.Send(It.Is<RpcMessage>(m => IsFailureResultMessage(m))));
  102. }
  103. [Test]
  104. public void CallVoidReturnMethodTest()
  105. {
  106. doStuffCallMessage.CallMessage.ExpectsResult = true;
  107. server.ReceiveCall(doStuffCallMessage);
  108. controller.Verify(c => c.Send(It.Is<RpcMessage>(m => IsDoStuffResultMessageCorrect(m))));
  109. Assert.That(sampleService.NumTimesStuffDone, Is.EqualTo(1));
  110. }
  111. [Test]
  112. public void CallVoidReturnMethodWithoutResultTest()
  113. {
  114. doStuffCallMessage.CallMessage.ExpectsResult = false;
  115. server.ReceiveCall(doStuffCallMessage);
  116. controller.Verify(c => c.Send(It.IsAny<RpcMessage>()), Times.Never());
  117. Assert.That(sampleService.NumTimesStuffDone, Is.EqualTo(1));
  118. }
  119. [Test]
  120. public void WrongParameterCountTest()
  121. {
  122. var extraParam = new RpcMessage.Parameter();
  123. extraParam.IntParam = 10;
  124. squareCallMessage.CallMessage.Parameters.Add(extraParam);
  125. server.ReceiveCall(squareCallMessage);
  126. controller.Verify(c => c.Send(It.Is<RpcMessage>(m => IsFailureResultMessage(m))));
  127. }
  128. [Test]
  129. public void WrongParameterTypeTest()
  130. {
  131. squareCallMessage.CallMessage.Parameters[0].IntParamSpecified = false;
  132. squareCallMessage.CallMessage.Parameters[0].UintParam = 20;
  133. server.ReceiveCall(squareCallMessage);
  134. controller.Verify(c => c.Send(It.Is<RpcMessage>(m => IsFailureResultMessage(m))));
  135. }
  136. [Test]
  137. public void ParameterByteTest()
  138. {
  139. testParamCallMessage.CallMessage.Method = "TestByteParam";
  140. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { UintParam = 42 });
  141. server.ReceiveCall(testParamCallMessage);
  142. controller.Verify(c =>c.Send(It.Is<RpcMessage>(
  143. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.UintParam == 43)));
  144. }
  145. [Test]
  146. public void ParameterSbyteTest()
  147. {
  148. testParamCallMessage.CallMessage.Method = "TestSbyteParam";
  149. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { IntParam = 42 });
  150. server.ReceiveCall(testParamCallMessage);
  151. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  152. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.IntParam == 43)));
  153. }
  154. [Test]
  155. public void ParameterCharTest()
  156. {
  157. testParamCallMessage.CallMessage.Method = "TestCharParam";
  158. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { UintParam = 42 });
  159. server.ReceiveCall(testParamCallMessage);
  160. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  161. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.UintParam == 43)));
  162. }
  163. [Test]
  164. public void ParameterShortTest()
  165. {
  166. testParamCallMessage.CallMessage.Method = "TestShortParam";
  167. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { IntParam = 42 });
  168. server.ReceiveCall(testParamCallMessage);
  169. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  170. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.IntParam == 43)));
  171. }
  172. [Test]
  173. public void ParameterUshortTest()
  174. {
  175. testParamCallMessage.CallMessage.Method = "TestUshortParam";
  176. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { UintParam = 42 });
  177. server.ReceiveCall(testParamCallMessage);
  178. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  179. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.UintParam == 43)));
  180. }
  181. [Test]
  182. public void ParameterIntTest()
  183. {
  184. testParamCallMessage.CallMessage.Method = "TestIntParam";
  185. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { IntParam = 42 });
  186. server.ReceiveCall(testParamCallMessage);
  187. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  188. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.IntParam == 43)));
  189. }
  190. [Test]
  191. public void ParameterUintTest()
  192. {
  193. testParamCallMessage.CallMessage.Method = "TestUintParam";
  194. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { UintParam = 42 });
  195. server.ReceiveCall(testParamCallMessage);
  196. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  197. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.UintParam == 43)));
  198. }
  199. [Test]
  200. public void ParameterInt64Test()
  201. {
  202. testParamCallMessage.CallMessage.Method = "TestInt64Param";
  203. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { Int64Param = 42 });
  204. server.ReceiveCall(testParamCallMessage);
  205. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  206. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.Int64Param == 43)));
  207. }
  208. [Test]
  209. public void ParameterUint64Test()
  210. {
  211. testParamCallMessage.CallMessage.Method = "TestUint64Param";
  212. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { Uint64Param = 42 });
  213. server.ReceiveCall(testParamCallMessage);
  214. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  215. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.Uint64Param == 43)));
  216. }
  217. [Test]
  218. public void ParameterBoolTest()
  219. {
  220. testParamCallMessage.CallMessage.Method = "TestBoolParam";
  221. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { BoolParam = true });
  222. server.ReceiveCall(testParamCallMessage);
  223. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  224. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.BoolParam)));
  225. }
  226. [Test]
  227. public void ParameterFloatTest()
  228. {
  229. testParamCallMessage.CallMessage.Method = "TestFloatParam";
  230. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { FloatParam = 42.0f });
  231. server.ReceiveCall(testParamCallMessage);
  232. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  233. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.FloatParam == 43.0f)));
  234. }
  235. [Test]
  236. public void ParameterDoubleTest()
  237. {
  238. testParamCallMessage.CallMessage.Method = "TestDoubleParam";
  239. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { DoubleParam = 42.0 });
  240. server.ReceiveCall(testParamCallMessage);
  241. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  242. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.DoubleParam == 43.0)));
  243. }
  244. [Test]
  245. public void ParameterStringTest()
  246. {
  247. testParamCallMessage.CallMessage.Method = "TestStringParam";
  248. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter { StringParam = "Hello" });
  249. server.ReceiveCall(testParamCallMessage);
  250. controller.Verify(c => c.Send(It.Is<RpcMessage>(
  251. m => IsTestParamResultMessageCorrect(m) && m.ResultMessage.CallResult.StringParam == "Hello world")));
  252. }
  253. [Test]
  254. public void ParameterProtoTest()
  255. {
  256. var input = new MultiplyInput();
  257. input.FirstNumber = 6;
  258. input.SecondNumber = 7;
  259. input.Prefix = "Answer is ";
  260. var memStream = new MemoryStream();
  261. ProtoBuf.Serializer.Serialize(memStream, input);
  262. testParamCallMessage.CallMessage.Method = "Multiply";
  263. testParamCallMessage.CallMessage.Parameters.Add(new RpcMessage.Parameter
  264. { ProtoParam = memStream.ToArray() });
  265. server.ReceiveCall(testParamCallMessage);
  266. controller.Verify(c => c.Send(It.Is<RpcMessage>(m => IsTestProtoParamResultMessageCorrect(m))));
  267. }
  268. private bool IsSquareResultMessageCorrect(RpcMessage message)
  269. {
  270. if (message == null || message.Id != squareCallMessage.Id || message.ResultMessage == null)
  271. return false;
  272. if (message.ResultMessage.IsFailed || message.ResultMessage.CallResult == null)
  273. return false;
  274. if (message.ResultMessage.CallResult.IntParam != 25)
  275. return false;
  276. return true;
  277. }
  278. private bool IsFailureResultMessage(RpcMessage message)
  279. {
  280. if (message == null || message.Id != squareCallMessage.Id || message.ResultMessage == null)
  281. return false;
  282. if (!message.ResultMessage.IsFailed)
  283. return false;
  284. return true;
  285. }
  286. private bool IsDoStuffResultMessageCorrect(RpcMessage message)
  287. {
  288. if (message == null || message.Id != doStuffCallMessage.Id || message.ResultMessage == null)
  289. return false;
  290. if (message.ResultMessage.IsFailed)
  291. return false;
  292. if (message.ResultMessage.CallResult != null)
  293. return false;
  294. return true;
  295. }
  296. private bool IsTestParamResultMessageCorrect(RpcMessage message)
  297. {
  298. if (message == null || message.Id != testParamCallMessage.Id || message.ResultMessage == null)
  299. return false;
  300. if (message.ResultMessage.IsFailed || message.ResultMessage.CallResult == null)
  301. return false;
  302. return true;
  303. }
  304. private bool IsTestProtoParamResultMessageCorrect(RpcMessage message)
  305. {
  306. if (message == null || message.Id != testParamCallMessage.Id || message.ResultMessage == null)
  307. return false;
  308. if (message.ResultMessage.IsFailed || message.ResultMessage.CallResult == null)
  309. return false;
  310. var memStream = new MemoryStream(message.ResultMessage.CallResult.ProtoParam);
  311. MultiplyOutput output = ProtoBuf.Serializer.Deserialize<MultiplyOutput>(memStream);
  312. if (output.ResultNumber != 42 || output.ResultString != "Answer is 42")
  313. return false;
  314. return true;
  315. }
  316. }
  317. }