diff --git a/src/DtronixMessageQueue.Tests.Performance/DtronixMessageQueue.Tests.Performance.csproj b/src/DtronixMessageQueue.Tests.Performance/DtronixMessageQueue.Tests.Performance.csproj index 492a916..b113552 100644 --- a/src/DtronixMessageQueue.Tests.Performance/DtronixMessageQueue.Tests.Performance.csproj +++ b/src/DtronixMessageQueue.Tests.Performance/DtronixMessageQueue.Tests.Performance.csproj @@ -57,11 +57,13 @@ + + diff --git a/src/DtronixMessageQueue.Tests.Performance/MqPerformanceTest.cs b/src/DtronixMessageQueue.Tests.Performance/MqPerformanceTest.cs index 3f8e3b1..4eb454a 100644 --- a/src/DtronixMessageQueue.Tests.Performance/MqPerformanceTest.cs +++ b/src/DtronixMessageQueue.Tests.Performance/MqPerformanceTest.cs @@ -286,7 +286,7 @@ private static void MqInProcessPerformanceTests(int runs, int loops, MqMessage m var mode = "Release"; #if DEBUG - mode = "Debug"; + mode = "Debug"; #endif var messagesPerSecond = (int) ((double) runs / sw.ElapsedMilliseconds * 1000); diff --git a/src/DtronixMessageQueue.Tests.Performance/ServerMqPerformanceTests.cs b/src/DtronixMessageQueue.Tests.Performance/ServerMqPerformanceTests.cs new file mode 100644 index 0000000..7ba40dd --- /dev/null +++ b/src/DtronixMessageQueue.Tests.Performance/ServerMqPerformanceTests.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DtronixMessageQueue.Tests.Performance +{ + public class ServerMqPerformanceTests + { + private MqServer _server; + + public ServerMqPerformanceTests(string[] args) + { + _server = new MqServer(new MqConfig + { + Ip = "127.0.0.1", + Port = 2828 + }); + + _server.SessionSetup += (sender, eventArgs) => + { + eventArgs.Session.IsServer = true; + }; + + + } + + public void Start() + { + _server.Start(); + } + } +} diff --git a/src/DtronixMessageQueue.Tests.Performance/SimpleMqSession.cs b/src/DtronixMessageQueue.Tests.Performance/SimpleMqSession.cs index 46e4994..d9bf5a8 100644 --- a/src/DtronixMessageQueue.Tests.Performance/SimpleMqSession.cs +++ b/src/DtronixMessageQueue.Tests.Performance/SimpleMqSession.cs @@ -1,6 +1,131 @@ -namespace DtronixMessageQueue.Tests.Performance +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +using DtronixMessageQueue.Socket; + +namespace DtronixMessageQueue.Tests.Performance { public class SimpleMqSession : MqSession { + private MqMessageReader reader; + private MqMessageWriter writer; + + public bool IsServer { get; set; } + + public TestMode Mode { get; set; } + + private Stopwatch stopwatch = new Stopwatch(); + + private Timer _responseTimer; + private int _totalThroughBytes; + private int _totalThroughFrames; + private int _totalThroughMessages; + + protected override void OnSetup() + { + base.OnSetup(); + + reader = new MqMessageReader(); + writer = new MqMessageWriter(Config); + } + + protected override void OnIncomingMessage(object sender, IncomingMessageEventArgs e) + { + if (IsServer) + { + ServerMessage(e.Messages); + } + else + { + ClientMessage(e.Messages); + } + } + + private void ClientMessage(Queue message_queue) + { + + } + + public override void Close(SocketCloseReason reason) + { + if (_responseTimer != null) + { + _responseTimer.Change(-1, -1); + _responseTimer.Dispose(); + } + base.Close(reason); + + } + + private void ServerMessage(Queue message_queue) + { + + if (Mode == TestMode.Unset) + { + reader.Message = message_queue.Dequeue(); + + Mode = (TestMode)reader.ReadByte(); // Mode + + if (Mode == TestMode.Throughput) + { + _responseTimer = new Timer(ThroughputResponse); + writer.Write((byte)ServerMessageType.Ready); + Send(writer.ToMessage(true)); + + _responseTimer.Change(1000, 1000); + } + + } + + while (message_queue.Count > 0) + { + var message = message_queue.Dequeue(); + if (Mode == TestMode.Throughput) + { + Interlocked.Add(ref _totalThroughBytes, message.Size); + _totalThroughMessages++; + Interlocked.Add(ref _totalThroughFrames, message.Count); + } + + } + + } + + private void ThroughputResponse(object state) + { + using (var writer = new MqMessageWriter(Config)) + { + var throughBytes = _totalThroughBytes; + var throughMessages = _totalThroughMessages; + var throughFrames = _totalThroughFrames; + + _totalThroughBytes = 0; + _totalThroughMessages = 0; + _totalThroughFrames = 0; + + writer.Write((byte)ServerMessageType.ThroughputTransfer); + writer.Write(throughBytes); + writer.Write(throughMessages); + writer.Write(throughFrames); + writer.Write(stopwatch.ElapsedMilliseconds); + } + } + + + } + + public enum TestMode + { + Unset = 0, + Throughput = 1, + Repeat = 2 + } + + public enum ServerMessageType : byte + { + Unset = 0, + Ready = 1, + Complete = 2, + ThroughputTransfer = 3 } } \ No newline at end of file diff --git a/src/DtronixMessageQueue.Tests.Performance/TestStartArgs.cs b/src/DtronixMessageQueue.Tests.Performance/TestStartArgs.cs new file mode 100644 index 0000000..0a63536 --- /dev/null +++ b/src/DtronixMessageQueue.Tests.Performance/TestStartArgs.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DtronixMessageQueue.Tests.Performance +{ + public class TestStartArgs + { + public StartMode Mode { get; set; } + + + + public enum StartMode + { + ServerRepeat, + ServerRespond, + Client + } + } +}