UnitTests.cs 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. /*
  2. * Copyright (c) 2019 Chris Burns <[email protected]>
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a copy
  5. * of this software and associated documentation files (the "Software"), to deal
  6. * in the Software without restriction, including without limitation the rights
  7. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  8. * copies of the Software, and to permit persons to whom the Software is
  9. * furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice shall be included in all
  12. * copies or substantial portions of the Software.
  13. *
  14. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  19. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  20. * SOFTWARE.
  21. */
  22. using NUnit.Framework;
  23. using System;
  24. using System.Net;
  25. using System.Diagnostics;
  26. using ENet;
  27. public class UnitTests
  28. {
  29. enum ClientState
  30. {
  31. None,
  32. Connecting,
  33. Connected,
  34. SendData,
  35. RecvData,
  36. Disconnecting,
  37. Disconnected,
  38. }
  39. [OneTimeSetUp]
  40. public void FixtureSetup()
  41. {
  42. }
  43. [OneTimeTearDown]
  44. public void FixtureCleanup()
  45. {
  46. }
  47. [SetUp]
  48. public void TestSetup()
  49. {
  50. }
  51. [TearDown]
  52. public void TestCleanup()
  53. {
  54. }
  55. [Test]
  56. public void InitAndUninit()
  57. {
  58. using (Host host = new Host())
  59. {
  60. }
  61. }
  62. [Test]
  63. public void SendAndRecv()
  64. {
  65. const ushort port = 7777;
  66. const int maxClients = 1;
  67. const byte dataVal = 42;
  68. int clientEvents = 0;
  69. int clientConnected = 0;
  70. int clientDisconnected = 0;
  71. int clientTimeout = 0;
  72. int clientNone = 0;
  73. int clientRecvData = 0;
  74. int serverEvents = 0;
  75. int serverConnected = 0;
  76. int serverDisconnected = 0;
  77. int serverRecvData = 0;
  78. int serverTimeout = 0;
  79. int serverNone = 0;
  80. ClientState clientState = ClientState.None;
  81. using (Host client = new Host())
  82. using (Host server = new Host())
  83. {
  84. Address address = new Address();
  85. address.Port = port;
  86. server.Create(address, maxClients);
  87. address.SetIP("127.0.0.1");
  88. client.Create();
  89. Peer clientPeer = default;
  90. Stopwatch sw = Stopwatch.StartNew();
  91. while (clientState != ClientState.Disconnected && sw.ElapsedMilliseconds < 10000)
  92. {
  93. while (server.Service(15, out Event netEvent) > 0)
  94. {
  95. serverEvents++;
  96. switch (netEvent.Type)
  97. {
  98. case EventType.None:
  99. serverNone++;
  100. break;
  101. case EventType.Connect:
  102. serverConnected++;
  103. break;
  104. case EventType.Disconnect:
  105. serverDisconnected++;
  106. clientState = ClientState.Disconnected;
  107. break;
  108. case EventType.Timeout:
  109. serverTimeout++;
  110. break;
  111. case EventType.Receive:
  112. serverRecvData++;
  113. Packet packet = default(Packet);
  114. byte[] data = new byte[64];
  115. netEvent.Packet.CopyTo(data);
  116. for (int i = 0; i < data.Length; i++) Assert.True(data[i] == dataVal);
  117. packet.Create(data);
  118. netEvent.Peer.Send(0, ref packet);
  119. netEvent.Packet.Dispose();
  120. break;
  121. }
  122. }
  123. server.Flush();
  124. while (client.Service(15, out Event netEvent) > 0)
  125. {
  126. clientEvents++;
  127. switch (netEvent.Type)
  128. {
  129. case EventType.None:
  130. clientNone++;
  131. break;
  132. case EventType.Connect:
  133. clientConnected++;
  134. clientState = ClientState.Connected;
  135. break;
  136. case EventType.Disconnect:
  137. clientDisconnected++;
  138. clientState = ClientState.Disconnected;
  139. break;
  140. case EventType.Timeout:
  141. clientTimeout++;
  142. break;
  143. case EventType.Receive:
  144. clientRecvData++;
  145. byte[] data = new byte[64];
  146. Packet packet = netEvent.Packet;
  147. packet.CopyTo(data);
  148. for (int i = 0; i < data.Length; i++) Assert.True(data[i] == dataVal);
  149. netEvent.Packet.Dispose();
  150. clientState = ClientState.RecvData;
  151. break;
  152. }
  153. }
  154. client.Flush();
  155. if (clientState == ClientState.None)
  156. {
  157. clientState = ClientState.Connecting;
  158. clientPeer = client.Connect(address);
  159. }
  160. else if (clientState == ClientState.Connected)
  161. {
  162. Packet packet = default(Packet);
  163. byte[] data = new byte[64];
  164. for (int i = 0; i < data.Length; i++) data[i] = dataVal;
  165. packet.Create(data);
  166. clientPeer.Send(0, ref packet);
  167. clientState = ClientState.SendData;
  168. }
  169. else if (clientState == ClientState.RecvData)
  170. {
  171. clientPeer.DisconnectNow(0);
  172. clientState = ClientState.Disconnecting;
  173. }
  174. }
  175. }
  176. Assert.True(clientEvents != 0, "client host never generated an event");
  177. Assert.True(serverEvents != 0, "server host never generated an event");
  178. Assert.True(clientState == ClientState.Disconnected, "client didn't fully disconnect");
  179. Assert.AreEqual(1, clientConnected, "client should have connected once");
  180. Assert.AreEqual(1, serverConnected, "server should have had one inbound connect");
  181. Assert.AreEqual(1, clientRecvData, "client should have recvd once");
  182. Assert.AreEqual(1, serverRecvData, "server should have recvd once");
  183. Assert.AreEqual(0, clientTimeout, "client had timeout events");
  184. Assert.AreEqual(0, serverTimeout, "server had timeout events");
  185. Assert.AreEqual(0, clientNone, "client had none events");
  186. Assert.AreEqual(0, serverNone, "server had none events");
  187. Assert.AreEqual(1, serverDisconnected, "server should have had one client disconnect");
  188. }
  189. }