aboutsummaryrefslogtreecommitdiff
path: root/Tools/Hazel-Networking/Hazel.UnitTests/TestHelper.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/Hazel-Networking/Hazel.UnitTests/TestHelper.cs')
-rw-r--r--Tools/Hazel-Networking/Hazel.UnitTests/TestHelper.cs337
1 files changed, 337 insertions, 0 deletions
diff --git a/Tools/Hazel-Networking/Hazel.UnitTests/TestHelper.cs b/Tools/Hazel-Networking/Hazel.UnitTests/TestHelper.cs
new file mode 100644
index 0000000..f3e9dfb
--- /dev/null
+++ b/Tools/Hazel-Networking/Hazel.UnitTests/TestHelper.cs
@@ -0,0 +1,337 @@
+using System;
+using Microsoft.VisualStudio.TestTools.UnitTesting;
+
+using Hazel;
+using System.Net;
+using System.Threading;
+using System.Diagnostics;
+using Hazel.Udp.FewerThreads;
+
+namespace Hazel.UnitTests
+{
+ [TestClass]
+ public static class TestHelper
+ {
+ /// <summary>
+ /// Runs a general test on the given listener and connection.
+ /// </summary>
+ /// <param name="listener">The listener to test.</param>
+ /// <param name="connection">The connection to test.</param>
+ internal static void RunServerToClientTest(ThreadLimitedUdpConnectionListener listener, Connection connection, int dataSize, SendOption sendOption)
+ {
+ //Setup meta stuff
+ MessageWriter data = BuildData(sendOption, dataSize);
+ ManualResetEvent mutex = new ManualResetEvent(false);
+
+ //Setup listener
+ listener.NewConnection += delegate (NewConnectionEventArgs ncArgs)
+ {
+ ncArgs.Connection.Send(data);
+ };
+
+ listener.Start();
+
+ DataReceivedEventArgs? result = null;
+ //Setup conneciton
+ connection.DataReceived += delegate (DataReceivedEventArgs a)
+ {
+ Trace.WriteLine("Data was received correctly.");
+
+ try
+ {
+ result = a;
+ }
+ finally
+ {
+ mutex.Set();
+ }
+ };
+
+ connection.Connect();
+
+ //Wait until data is received
+ mutex.WaitOne();
+
+ var dataReader = ConvertToMessageReader(data);
+ Assert.AreEqual(dataReader.Length, result.Value.Message.Length);
+ for (int i = 0; i < dataReader.Length; i++)
+ {
+ Assert.AreEqual(dataReader.ReadByte(), result.Value.Message.ReadByte());
+ }
+
+ Assert.AreEqual(sendOption, result.Value.SendOption);
+ }
+
+ /// <summary>
+ /// Runs a general test on the given listener and connection.
+ /// </summary>
+ /// <param name="listener">The listener to test.</param>
+ /// <param name="connection">The connection to test.</param>
+ internal static void RunServerToClientTest(NetworkConnectionListener listener, Connection connection, int dataSize, SendOption sendOption)
+ {
+ //Setup meta stuff
+ MessageWriter data = BuildData(sendOption, dataSize);
+ ManualResetEvent mutex = new ManualResetEvent(false);
+
+ //Setup listener
+ listener.NewConnection += delegate (NewConnectionEventArgs ncArgs)
+ {
+ ncArgs.Connection.Send(data);
+ };
+
+ listener.Start();
+
+ DataReceivedEventArgs? result = null;
+ //Setup conneciton
+ connection.DataReceived += delegate (DataReceivedEventArgs a)
+ {
+ Trace.WriteLine("Data was received correctly.");
+
+ try
+ {
+ result = a;
+ }
+ finally
+ {
+ mutex.Set();
+ }
+ };
+
+ connection.Connect();
+
+ //Wait until data is received
+ mutex.WaitOne();
+
+ var dataReader = ConvertToMessageReader(data);
+ Assert.AreEqual(dataReader.Length, result.Value.Message.Length);
+ for (int i = 0; i < dataReader.Length; i++)
+ {
+ Assert.AreEqual(dataReader.ReadByte(), result.Value.Message.ReadByte());
+ }
+
+ Assert.AreEqual(sendOption, result.Value.SendOption);
+ }
+
+ /// <summary>
+ /// Runs a general test on the given listener and connection.
+ /// </summary>
+ /// <param name="listener">The listener to test.</param>
+ /// <param name="connection">The connection to test.</param>
+ internal static void RunClientToServerTest(NetworkConnectionListener listener, Connection connection, int dataSize, SendOption sendOption)
+ {
+ //Setup meta stuff
+ MessageWriter data = BuildData(sendOption, dataSize);
+ ManualResetEvent mutex = new ManualResetEvent(false);
+ ManualResetEvent mutex2 = new ManualResetEvent(false);
+
+ //Setup listener
+ DataReceivedEventArgs? result = null;
+ listener.NewConnection += delegate (NewConnectionEventArgs args)
+ {
+ args.Connection.DataReceived += delegate (DataReceivedEventArgs innerArgs)
+ {
+ Trace.WriteLine("Data was received correctly.");
+
+ result = innerArgs;
+
+ mutex2.Set();
+ };
+
+ mutex.Set();
+ };
+
+ listener.Start();
+
+ //Connect
+ connection.Connect();
+
+ mutex.WaitOne();
+
+ connection.Send(data);
+
+ //Wait until data is received
+ mutex2.WaitOne();
+
+ var dataReader = ConvertToMessageReader(data);
+ Assert.AreEqual(dataReader.Length, result.Value.Message.Length);
+ for (int i = 0; i < data.Length; i++)
+ {
+ Assert.AreEqual(dataReader.ReadByte(), result.Value.Message.ReadByte());
+ }
+
+ Assert.AreEqual(sendOption, result.Value.SendOption);
+ }
+
+
+ /// <summary>
+ /// Runs a general test on the given listener and connection.
+ /// </summary>
+ /// <param name="listener">The listener to test.</param>
+ /// <param name="connection">The connection to test.</param>
+ internal static void RunClientToServerTest(ThreadLimitedUdpConnectionListener listener, Connection connection, int dataSize, SendOption sendOption)
+ {
+ //Setup meta stuff
+ MessageWriter data = BuildData(sendOption, dataSize);
+ ManualResetEvent mutex = new ManualResetEvent(false);
+ ManualResetEvent mutex2 = new ManualResetEvent(false);
+
+ //Setup listener
+ DataReceivedEventArgs? result = null;
+ listener.NewConnection += delegate (NewConnectionEventArgs args)
+ {
+ args.Connection.DataReceived += delegate (DataReceivedEventArgs innerArgs)
+ {
+ Trace.WriteLine("Data was received correctly.");
+
+ result = innerArgs;
+
+ mutex2.Set();
+ };
+
+ mutex.Set();
+ };
+
+ listener.Start();
+
+ //Connect
+ connection.Connect();
+
+ Assert.IsTrue(mutex.WaitOne(100), "Timeout while connecting");
+
+ connection.Send(data);
+
+ //Wait until data is received
+ Assert.IsTrue(mutex2.WaitOne(100), "Timeout while sending data");
+
+ var dataReader = ConvertToMessageReader(data);
+ Assert.AreEqual(dataReader.Length, result.Value.Message.Length);
+ for (int i = 0; i < dataReader.Length; i++)
+ {
+ Assert.AreEqual(dataReader.ReadByte(), result.Value.Message.ReadByte());
+ }
+
+ Assert.AreEqual(sendOption, result.Value.SendOption);
+ }
+
+ /// <summary>
+ /// Runs a server disconnect test on the given listener and connection.
+ /// </summary>
+ /// <param name="listener">The listener to test.</param>
+ /// <param name="connection">The connection to test.</param>
+ internal static void RunServerDisconnectTest(NetworkConnectionListener listener, Connection connection)
+ {
+ ManualResetEvent mutex = new ManualResetEvent(false);
+
+ connection.Disconnected += delegate (object sender, DisconnectedEventArgs args)
+ {
+ mutex.Set();
+ };
+
+ listener.NewConnection += delegate (NewConnectionEventArgs args)
+ {
+ args.Connection.Disconnect("Testing");
+ };
+
+ listener.Start();
+
+ connection.Connect();
+
+ mutex.WaitOne();
+ }
+
+ /// <summary>
+ /// Runs a client disconnect test on the given listener and connection.
+ /// </summary>
+ /// <param name="listener">The listener to test.</param>
+ /// <param name="connection">The connection to test.</param>
+ internal static void RunClientDisconnectTest(NetworkConnectionListener listener, Connection connection)
+ {
+ ManualResetEvent mutex = new ManualResetEvent(false);
+ ManualResetEvent mutex2 = new ManualResetEvent(false);
+
+ listener.NewConnection += delegate (NewConnectionEventArgs args)
+ {
+ args.Connection.Disconnected += delegate (object sender2, DisconnectedEventArgs args2)
+ {
+ mutex2.Set();
+ };
+
+ mutex.Set();
+ };
+
+ listener.Start();
+
+ connection.Connect();
+
+ mutex.WaitOne();
+
+ connection.Disconnect("Testing");
+
+ mutex2.WaitOne();
+ }
+
+ /// <summary>
+ /// Ensures a client sends a disconnect packet to the server on Dispose.
+ /// </summary>
+ /// <param name="listener">The listener to test.</param>
+ /// <param name="connection">The connection to test.</param>
+ internal static void RunClientDisconnectOnDisposeTest(NetworkConnectionListener listener, Connection connection)
+ {
+ ManualResetEvent mutex = new ManualResetEvent(false);
+ ManualResetEvent mutex2 = new ManualResetEvent(false);
+
+ listener.NewConnection += delegate (NewConnectionEventArgs args)
+ {
+ args.Connection.Disconnected += delegate (object sender2, DisconnectedEventArgs args2)
+ {
+ mutex2.Set();
+ };
+
+ mutex.Set();
+ };
+
+ listener.Start();
+
+ connection.Connect();
+
+ if (!mutex.WaitOne(TimeSpan.FromSeconds(1)))
+ {
+ Assert.Fail("Timeout waiting for client connection");
+ }
+
+ connection.Dispose();
+
+ if (!mutex2.WaitOne(TimeSpan.FromSeconds(1)))
+ {
+ Assert.Fail("Timeout waiting for client disconnect packet");
+ }
+ }
+
+ private static MessageReader ConvertToMessageReader(MessageWriter writer)
+ {
+ var output = new MessageReader();
+ output.Buffer = writer.Buffer;
+ output.Offset = writer.SendOption == SendOption.None ? 1 : 3;
+ output.Length = writer.Length - output.Offset;
+ output.Position = 0;
+
+ return output;
+ }
+
+ /// <summary>
+ /// Builds new data of increaseing value bytes.
+ /// </summary>
+ /// <param name="dataSize">The number of bytes to generate.</param>
+ /// <returns>The data.</returns>
+ static MessageWriter BuildData(SendOption sendOption, int dataSize)
+ {
+ var output = MessageWriter.Get(sendOption);
+ for (int i = 0; i < dataSize; i++)
+ {
+ output.Write((byte)i);
+ }
+
+ return output;
+ }
+ }
+}