Renamed Socket classes to TcpSocket since that is all it is designed to handle at this point.

Migrated advancements from transport-protocol branch to master.
Added MemoryQueueBufferStream to buffer the stream data without moving it to another buffer.
Added new tools.
Added testing of via travis.
Translated all tests to nunit from xunit.
Removed Closing and Connecting from valid states as it was complicating the process.
Updated protobuf-net to 2.3.2.
Removed Port configuration
Renamed Ip configuration to Address.  Port is integrated into the Address. "IP:PORT".
This commit is contained in:
DJGosnell 2017-10-27 18:04:00 -04:00
Родитель 77aee3211b
Коммит cbdbac5439
60 изменённых файлов: 1164 добавлений и 1189 удалений

Просмотреть файл

@ -1,8 +1,7 @@
language: csharp
install:
- nuget install xunit.runners -Version 1.9.2 -OutputDirectory testrunner
before_script:
- nuget restore ./src/DtronixMessageQueue.sln
script:
- xbuild /p:Configuration=Release ./src/DtronixMessageQueue/DtronixMessageQueue.csproj
- xbuild /p:Configuration=Release ./src/DtronixMessageQueue.Tests/DtronixMessageQueue.Tests.csproj
- mono ./src/packages/NUnit.ConsoleRunner.3.7.0/tools/nunit3-console.exe ./src/DtronixMessageQueue.Tests/bin/Release/DtronixMessageQueue.Tests.dll

Просмотреть файл

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DtronixMessageQueue.Rpc;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
using DtronixMessageQueue.Tests.Gui.Tests;
using DtronixMessageQueue.Tests.Gui.Tests.Connection;
using DtronixMessageQueue.Tests.Gui.Tests.Echo;
@ -32,9 +32,9 @@ namespace DtronixMessageQueue.Tests.Gui.Services
public void ClientReady()
{
if (Session.BaseSocket.Mode == SocketMode.Server && _server == null)
if (Session.SocketHandler.Mode == TcpSocketMode.Server && _server == null)
{
_server = (RpcServer<ControllerSession, RpcConfig>) this.Session.BaseSocket;
_server = (RpcServer<ControllerSession, RpcConfig>) this.Session.SocketHandler;
}
}

Просмотреть файл

@ -2,7 +2,6 @@
using System.Threading.Tasks;
using System.Windows.Controls;
using DtronixMessageQueue.Rpc;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.Tests.Gui.Services;
namespace DtronixMessageQueue.Tests.Gui.Tests.Connection
@ -33,8 +32,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.Connection
{
_testServer = new MqServer<ConnectionPerformanceTestSession, MqConfig>(new MqConfig
{
Ip = "0.0.0.0",
Port = 2121,
Address = "0.0.0.0:2121",
PingTimeout = 1000,
MaxConnections = 2000
@ -66,8 +64,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.Connection
{
var client = new MqClient<ConnectionPerformanceTestSession, MqConfig>(new MqConfig
{
Ip = TestController.ControllClient.Config.Ip,
Port = 2121,
Address = TestController.ControllClient.Config.Address + ":2121",
PingFrequency = 500
});

Просмотреть файл

@ -1,6 +1,6 @@
using System;
using System.Threading;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Tests.Gui.Tests.Connection
{
@ -42,7 +42,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.Connection
}
public override void Close(SocketCloseReason reason)
public override void Close(CloseReason reason)
{
if (ResponseTimer != null)
{

Просмотреть файл

@ -2,7 +2,6 @@
using System.Threading;
using System.Windows.Controls;
using DtronixMessageQueue.Rpc;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.Tests.Gui.Services;
namespace DtronixMessageQueue.Tests.Gui.Tests.Echo
@ -33,8 +32,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.Echo
{
_testServer = new MqServer<EchoPerformanceTestSession, MqConfig>(new MqConfig
{
Ip = "0.0.0.0",
Port = 2121,
Address = "0.0.0.0:2121",
PingTimeout = 8000,
MaxConnections = 1000
@ -63,8 +61,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.Echo
{
var client = new MqClient<EchoPerformanceTestSession, MqConfig>(new MqConfig
{
Ip = TestController.ControllClient.Config.Ip,
Port = 2121,
Address = TestController.ControllClient.Config.Address + ":2121",
PingFrequency = 500
});

Просмотреть файл

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Tests.Gui.Tests.Echo
{
@ -58,7 +58,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.Echo
}
public override void Close(SocketCloseReason reason)
public override void Close(CloseReason reason)
{
if (ResponseTimer != null)
{

Просмотреть файл

@ -2,7 +2,6 @@
using System.Threading;
using System.Windows.Controls;
using DtronixMessageQueue.Rpc;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.Tests.Gui.Services;
namespace DtronixMessageQueue.Tests.Gui.Tests.MaxThroughput
@ -34,8 +33,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.MaxThroughput
{
_testServer = new MqServer<MaxThroughputPerformanceTestSession, MqConfig>(new MqConfig
{
Ip = "0.0.0.0",
Port = 2121,
Address = "0.0.0.0:2121",
PingTimeout = 8000,
MaxConnections = 1000
@ -65,8 +63,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.MaxThroughput
{
var client = new MqClient<MaxThroughputPerformanceTestSession, MqConfig>(new MqConfig
{
Ip = TestController.ControllClient.Config.Ip,
Port = 2121,
Address = TestController.ControllClient.Config.Address + ":2121",
PingFrequency = 500
});

Просмотреть файл

@ -1,6 +1,6 @@
using System;
using System.Threading.Tasks;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Tests.Gui.Tests.MaxThroughput
{
@ -39,7 +39,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests.MaxThroughput
}
public override void Close(SocketCloseReason reason)
public override void Close(CloseReason reason)
{
if (ResponseTimer != null)
{

Просмотреть файл

@ -2,7 +2,7 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Tests.Gui.Tests
{
@ -45,7 +45,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests
Reader = new MqMessageReader();
Writer = new MqMessageWriter(Config);
IsServer = BaseSocket.Mode == SocketMode.Server;
IsServer = SocketHandler.Mode == TcpSocketMode.Server;
}

Просмотреть файл

@ -2,7 +2,7 @@
using System.Threading;
using System.Windows.Controls;
using DtronixMessageQueue.Rpc;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
using DtronixMessageQueue.Tests.Gui.Services;
namespace DtronixMessageQueue.Tests.Gui.Tests
@ -33,10 +33,10 @@ namespace DtronixMessageQueue.Tests.Gui.Tests
Interlocked.Increment(ref TotalConnections);
}
protected void ConnectionRemoved(SocketCloseReason reason)
protected void ConnectionRemoved(CloseReason reason)
{
TestController.Log($"Test client connection closed. Reason: {reason}");
if (reason != SocketCloseReason.ConnectionRefused)
if (reason != CloseReason.ConnectionRefused)
Interlocked.Decrement(ref TotalConnections);
}

Просмотреть файл

@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using DtronixMessageQueue.Rpc;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
using DtronixMessageQueue.Tests.Gui.Services;
namespace DtronixMessageQueue.Tests.Gui.Tests
@ -43,8 +43,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests
Log("Starting Test Control Client");
ControllClient = new RpcClient<ControllerSession, RpcConfig>(new RpcConfig
{
Ip = ip,
Port = 2120,
Address = ip + ":2120",
RequireAuthentication = false,
PingFrequency = 800
});
@ -68,8 +67,7 @@ namespace DtronixMessageQueue.Tests.Gui.Tests
Log("Starting Controlling Control Server");
ControlServer = new RpcServer<ControllerSession, RpcConfig>(new RpcConfig
{
Ip = "0.0.0.0",
Port = 2120,
Address = "0.0.0.0:2120",
RequireAuthentication = false,
PingTimeout = 1000
});

Просмотреть файл

@ -35,8 +35,8 @@
<OutputPath>bin\Nuget\</OutputPath>
</PropertyGroup>
<ItemGroup>
<Reference Include="protobuf-net, Version=2.3.0.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
<HintPath>..\packages\protobuf-net.2.3.0\lib\net40\protobuf-net.dll</HintPath>
<Reference Include="protobuf-net, Version=2.3.2.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
<HintPath>..\packages\protobuf-net.2.3.2\lib\net40\protobuf-net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />

Просмотреть файл

@ -32,8 +32,7 @@ namespace DtronixMessageQueue.Tests.Performance
_config = new MqConfig
{
Ip = "127.0.0.1",
Port = 2828
Address = "127.0.0.1:2828",
};
_smallMessage = new MqMessage
@ -126,16 +125,17 @@ namespace DtronixMessageQueue.Tests.Performance
_server.Stop();
_client.Close();
_testCompleteSemaphore.Release();
};
_client.Connect();
_server.Stopped += (sender, args) => _testCompleteSemaphore.Release();
_testCompleteSemaphore.WaitOne(30000);
}
public void SendMessages(SimpleMqSession client, MqMessage message, int totalMessages, int timeout)

Просмотреть файл

@ -16,8 +16,7 @@ namespace DtronixMessageQueue.Tests.Performance
{
var config = new RpcConfig
{
Ip = "127.0.0.1",
Port = 2828
Address = "127.0.0.1:2828",
};
//RpcSingleProcessTest(20, 4, config, RpcTestType.LngBlock);

Просмотреть файл

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="protobuf-net" version="2.3.0" targetFramework="net45" />
<package id="protobuf-net" version="2.3.2" targetFramework="net45" />
</packages>

Просмотреть файл

@ -4,20 +4,15 @@ using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
using Xunit.Abstractions;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests
{
public class ActionProcessorTests
{
private readonly ITestOutputHelper _output;
private ManualResetEventSlim completeEvent = new ManualResetEventSlim(false);
private ManualResetEventSlim completeEvent;
public ActionProcessorTests(ITestOutputHelper output)
{
_output = output;
}
private ActionProcessor<Guid> CreateProcessor(int threads, bool start, Action<ActionProcessor<Guid>> complete = null, int rebalanceTime = 10000)
{
@ -34,29 +29,35 @@ namespace DtronixMessageQueue.Tests
return processor;
}
[Fact]
[SetUp]
public void Init()
{
completeEvent = new ManualResetEventSlim(false);
}
[Test]
public void Processor_adds_threads()
{
var processor = CreateProcessor(1, false);
Assert.Equal(processor.ThreadCount, 1);
Assert.AreEqual(processor.ThreadCount, 1);
processor.AddThread(2);
Assert.Equal(processor.ThreadCount, 3);
Assert.AreEqual(processor.ThreadCount, 3);
}
[Fact]
[Test]
public void Processor_removes_thread()
{
var processor = CreateProcessor(2, true);
Assert.Equal(processor.ThreadCount, 2);
Assert.AreEqual(processor.ThreadCount, 2);
processor.RemoveThread(1);
Assert.Equal(processor.ThreadCount, 1);
Assert.AreEqual(processor.ThreadCount, 1);
}
[Fact]
[Test]
public void Processor_throws_on_non_started_processor()
{
var processor = CreateProcessor(1, false);
@ -67,7 +68,7 @@ namespace DtronixMessageQueue.Tests
}
[Fact]
[Test]
public void Processor_throws_on_too_few_threads()
{
var processor = CreateProcessor(1, true);
@ -92,7 +93,7 @@ namespace DtronixMessageQueue.Tests
return processor.GetActionById(id);
}
[Fact]
[Test]
public void Processor_balances_on_registration()
{
var processor = CreateProcessor(3, true);
@ -102,15 +103,15 @@ namespace DtronixMessageQueue.Tests
var thirdRegisteredAction = RegisterQueueGet(processor, () => Thread.Sleep(50));
Assert.NotEqual(firstRegisteredAction.ProcessorThread, secondRegisteredAction.ProcessorThread);
Assert.NotEqual(firstRegisteredAction.ProcessorThread, secondRegisteredAction.ProcessorThread);
Assert.NotEqual(secondRegisteredAction.ProcessorThread, thirdRegisteredAction.ProcessorThread);
Assert.NotEqual(firstRegisteredAction.ProcessorThread, thirdRegisteredAction.ProcessorThread);
Assert.AreNotEqual(firstRegisteredAction.ProcessorThread, secondRegisteredAction.ProcessorThread);
Assert.AreNotEqual(firstRegisteredAction.ProcessorThread, secondRegisteredAction.ProcessorThread);
Assert.AreNotEqual(secondRegisteredAction.ProcessorThread, thirdRegisteredAction.ProcessorThread);
Assert.AreNotEqual(firstRegisteredAction.ProcessorThread, thirdRegisteredAction.ProcessorThread);
}
[Fact]
[Test]
public void Processor_adds_to_least_used_thread()
{
var processor = CreateProcessor(2, true);
@ -120,13 +121,13 @@ namespace DtronixMessageQueue.Tests
var thirdRegisteredAction = RegisterGet(processor, () => Thread.Sleep(50));
Assert.NotEqual(firstRegisteredAction.ProcessorThread, secondRegisteredAction.ProcessorThread);
Assert.NotEqual(firstRegisteredAction.ProcessorThread, secondRegisteredAction.ProcessorThread);
Assert.AreNotEqual(firstRegisteredAction.ProcessorThread, secondRegisteredAction.ProcessorThread);
Assert.AreNotEqual(firstRegisteredAction.ProcessorThread, secondRegisteredAction.ProcessorThread);
Assert.Equal(firstRegisteredAction.ProcessorThread, thirdRegisteredAction.ProcessorThread);
Assert.AreEqual(firstRegisteredAction.ProcessorThread, thirdRegisteredAction.ProcessorThread);
}
[Fact]
[Test]
public void Processor_queues_once()
{
var processor = CreateProcessor(1, true);
@ -136,10 +137,10 @@ namespace DtronixMessageQueue.Tests
processor.QueueOnce(firstRegisteredAction.Id);
processor.QueueOnce(firstRegisteredAction.Id);
Assert.Equal(1, firstRegisteredAction.ProcessorThread.Queued);
Assert.AreEqual(1, firstRegisteredAction.ProcessorThread.Queued);
}
[Fact]
[Test]
public void Processor_queues_multiple()
{
var processor = CreateProcessor(1, true);
@ -153,10 +154,10 @@ namespace DtronixMessageQueue.Tests
// Wait a period of time for the processor to pickup the call.
Thread.Sleep(50);
Assert.Equal(2, firstRegisteredAction.ProcessorThread.Queued);
Assert.AreEqual(2, firstRegisteredAction.ProcessorThread.Queued);
}
[Fact]
[Test]
public void Processor_balances_on_removed_thread()
{
Action<ActionProcessor<Guid>> complete = ap => completeEvent.Set();
@ -188,12 +189,12 @@ namespace DtronixMessageQueue.Tests
Assert.True(completeEvent.Wait(2000));
Assert.Equal(totalLoops * 2, interlockedInt);
Assert.AreEqual(totalLoops * 2, interlockedInt);
Assert.Equal(3, thirdRegisteredAction.ProcessorThread.RegisteredActionsCount);
Assert.AreEqual(3, thirdRegisteredAction.ProcessorThread.RegisteredActionsCount);
}
[Fact]
[Test]
public void Processor_balances_on_added_thread()
{
Action<ActionProcessor<Guid>> complete = ap => completeEvent.Set();
@ -225,11 +226,13 @@ namespace DtronixMessageQueue.Tests
Assert.True(completeEvent.Wait(2000));
Assert.Equal(totalLoops * 2, interlockedInt);
Assert.AreEqual(totalLoops * 2, interlockedInt);
Assert.Equal(1, firstRegisteredAction.ProcessorThread.RegisteredActionsCount);
Assert.Equal(1, secondRegisteredAction.ProcessorThread.RegisteredActionsCount);
Assert.Equal(1, thirdRegisteredAction.ProcessorThread.RegisteredActionsCount);
Assert.AreEqual(1, firstRegisteredAction.ProcessorThread.RegisteredActionsCount);
Assert.AreEqual(1, secondRegisteredAction.ProcessorThread.RegisteredActionsCount);
Assert.AreEqual(1, thirdRegisteredAction.ProcessorThread.RegisteredActionsCount);
}
}
}

Просмотреть файл

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="..\packages\xunit.runner.visualstudio.2.2.0-beta2-build1149\build\net20\xunit.runner.visualstudio.props" Condition="Exists('..\packages\xunit.runner.visualstudio.2.2.0-beta2-build1149\build\net20\xunit.runner.visualstudio.props')" />
<Import Project="..\packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props" Condition="Exists('..\packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
@ -41,24 +41,11 @@
<OutputPath>bin\Nuget\</OutputPath>
</PropertyGroup>
<ItemGroup>
<Reference Include="nunit.framework, Version=3.8.1.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
<HintPath>..\packages\NUnit.3.8.1\lib\net45\nunit.framework.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
<Reference Include="xunit.abstractions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.abstractions.2.0.1\lib\net35\xunit.abstractions.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="xunit.assert, Version=2.2.0.3300, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.assert.2.2.0-beta2-build3300\lib\netstandard1.0\xunit.assert.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="xunit.core, Version=2.2.0.3300, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.extensibility.core.2.2.0-beta2-build3300\lib\net45\xunit.core.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="xunit.execution.desktop, Version=2.2.0.3300, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
<HintPath>..\packages\xunit.extensibility.execution.2.2.0-beta2-build3300\lib\net45\xunit.execution.desktop.dll</HintPath>
<Private>True</Private>
</Reference>
</ItemGroup>
<Choose>
<When Condition="('$(VisualStudioVersion)' == '10.0' or '$(VisualStudioVersion)' == '') and '$(TargetFrameworkVersion)' == 'v3.5'">
@ -75,15 +62,14 @@
<Compile Include="Mq\MqServerTests.cs" />
<Compile Include="Mq\MqMessageWriterReaderTests.cs" />
<Compile Include="Mq\MqTestsBase.cs" />
<Compile Include="PerformanceTests.cs" />
<Compile Include="Mq\MqClientTests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RepeatAttribute.cs" />
<Compile Include="Rpc\RpcClientTests.cs" />
<Compile Include="Rpc\RpcTestsBase.cs" />
<Compile Include="Rpc\Services\Server\CalculatorService.cs" />
<Compile Include="Mq\SimpleMqSession.cs" />
<Compile Include="Rpc\SimpleRpcSession.cs" />
<Compile Include="TestBase.cs" />
<Compile Include="Utilities.cs" />
</ItemGroup>
<ItemGroup>
@ -120,7 +106,7 @@
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\xunit.runner.visualstudio.2.2.0-beta2-build1149\build\net20\xunit.runner.visualstudio.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\xunit.runner.visualstudio.2.2.0-beta2-build1149\build\net20\xunit.runner.visualstudio.props'))" />
<Error Condition="!Exists('..\packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\NUnit3TestAdapter.3.8.0\build\net35\NUnit3TestAdapter.props'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.

Просмотреть файл

@ -1,22 +1,17 @@
using System;
using System.Threading;
using DtronixMessageQueue.Socket;
using Xunit;
using Xunit.Abstractions;
using DtronixMessageQueue.TcpSocket;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests.Mq
{
public class MqClientTests : MqTestsBase
{
public MqClientTests(ITestOutputHelper output) : base(output)
{
}
[Theory]
[InlineData(1, false)]
[InlineData(1, true)]
[InlineData(100, true)]
[InlineData(1000, true)]
[TestCase(1, false)]
[TestCase(1, true)]
[TestCase(100, true)]
[TestCase(1000, true)]
public void Client_should_send_data_to_server(int number, bool validate)
{
var messageSource = GenerateRandomMessage(4, 50);
@ -46,7 +41,7 @@ namespace DtronixMessageQueue.Tests.Mq
if (receivedMessages == number)
{
TestStatus.Set();
TestComplete.Set();
}
};
@ -54,7 +49,7 @@ namespace DtronixMessageQueue.Tests.Mq
}
[Fact]
[Test]
public void Client_does_not_send_empty_message()
{
var messageSource = GenerateRandomMessage(2, 50);
@ -76,141 +71,128 @@ namespace DtronixMessageQueue.Tests.Mq
{
LastException = new Exception("Server received an empty message.");
}
TestStatus.Set();
TestComplete.Set();
}
};
StartAndWait();
}
[Fact]
[Test]
public void Client_does_not_notify_on_command_frame()
{
var commandFrame = new MqFrame(new byte[21], MqFrameType.Command, Config);
var commandFrame = new MqFrame(new byte[21], MqFrameType.Command, ClientConfig);
Client.Connected += (sender, args) => { Client.Send(commandFrame); };
Server.IncomingMessage += (sender, args) => { TestStatus.Set(); };
Server.IncomingMessage += (sender, args) => { TestComplete.Set(); };
StartAndWait(false, 500);
if (TestStatus.IsSet)
if (TestComplete.IsSet)
{
throw new Exception("Server read command frame.");
}
}
[Fact]
[Test]
public void Client_does_not_notify_on_ping_frame()
{
var commandFrame = new MqFrame(null, MqFrameType.Ping, Config);
var commandFrame = new MqFrame(null, MqFrameType.Ping, ClientConfig);
Client.Connected += (sender, args) => { Client.Send(commandFrame); };
Server.IncomingMessage += (sender, args) => { TestStatus.Set(); };
Server.IncomingMessage += (sender, args) => { TestComplete.Set(); };
StartAndWait(false, 500);
if (TestStatus.IsSet)
if (TestComplete.IsSet)
{
throw new Exception("Server read command frame.");
}
}
[Fact]
[Test]
public void Client_connects_to_server()
{
Client.Connected += (sender, args) => TestStatus.Set();
Client.Connected += (sender, args) => TestComplete.Set();
StartAndWait();
}
[Fact]
[Test]
public void Client_disconects_from_server()
{
Client.Connected += (sender, args) => { Client.Close(); };
Client.Closed += (sender, args) => TestStatus.Set();
Client.Closed += (sender, args) => TestComplete.Set();
StartAndWait(true, 500000);
}
[Fact]
[Test]
public void Client_notified_server_stopping()
{
Server.Connected += (sender, session) => Server.Stop();
Client.Closed += (sender, args) => TestStatus.Set();
Client.Closed += (sender, args) => TestComplete.Set();
StartAndWait();
}
[Fact]
[Test]
public void Client_closes_self()
{
Client.Connected += (sender, args) => Client.Close();
Client.Closed += (sender, args) => TestStatus.Set();
Client.Closed += (sender, args) => TestComplete.Set();
StartAndWait();
}
[Fact]
[Test]
public void Client_notified_server_session_closed()
{
Server.Connected += (sender, session) =>
{
//Thread.Sleep(1000);
//session.Session.Send(new MqMessage(new MqFrame(new byte[24], MqFrameType.Last)));
session.Session.Close(SocketCloseReason.ApplicationError);
session.Session.Close(CloseReason.ApplicationError);
};
Client.Closed += (sender, args) =>
{
if (args.CloseReason != SocketCloseReason.ApplicationError)
if (args.CloseReason != CloseReason.ApplicationError && !IsMono)
{
LastException = new InvalidOperationException("Server did not return proper close reason.");
}
TestStatus.Set();
TestComplete.Set();
};
StartAndWait();
}
[Fact]
[Test]
public void Client_notifies_server_closing_session()
{
Client.Connected += (sender, args) => Client.Close();
Server.Closed += (sender, args) => TestStatus.Set();
Server.Closed += (sender, args) => TestComplete.Set();
StartAndWait();
}
[Fact]
[Test]
public void Client_times_out()
{
var clientConfig = new MqConfig
{
Ip = Config.Ip,
Port = Config.Port,
PingFrequency = 60000
};
Client = new MqClient<SimpleMqSession, MqConfig>(clientConfig);
Config.PingTimeout = 500;
Server = new MqServer<SimpleMqSession, MqConfig>(Config);
ClientConfig.PingFrequency = 60000;
ServerConfig.PingTimeout = 500;
Client.Closed += (sender, args) =>
{
if (args.CloseReason == SocketCloseReason.TimeOut)
if (args.CloseReason == CloseReason.TimeOut || IsMono)
{
TestStatus.Set();
TestComplete.Set();
}
else
{
@ -220,34 +202,24 @@ namespace DtronixMessageQueue.Tests.Mq
StartAndWait(false, 2000);
if (TestStatus.IsSet == false)
if (TestComplete.IsSet == false)
{
throw new Exception("Socket did not timeout.");
}
}
[Fact]
[Test]
public void Client_prevents_times_out()
{
var clientConfig = new MqConfig
{
Ip = Config.Ip,
Port = Config.Port,
PingFrequency = 100
};
Client = new MqClient<SimpleMqSession, MqConfig>(clientConfig);
Config.PingTimeout = 200;
Server = new MqServer<SimpleMqSession, MqConfig>(Config);
ClientConfig.PingFrequency = 50;
ServerConfig.PingTimeout = 100;
Client.Closed += (sender, args) =>
{
if (args.CloseReason == SocketCloseReason.TimeOut)
if (args.CloseReason == CloseReason.TimeOut)
{
TestStatus.Set();
LastException = new Exception("Client timed out.");
}
else
{
@ -255,31 +227,21 @@ namespace DtronixMessageQueue.Tests.Mq
}
};
StartAndWait(false, 1500);
if (TestStatus.IsSet)
{
throw new Exception("Client timed out.");
}
StartAndWait(false, 500);
}
[Fact]
[Test]
public void Client_times_out_after_server_dropped_session()
{
Config.PingTimeout = 500;
Client = new MqClient<SimpleMqSession, MqConfig>(Config);
Server = new MqServer<SimpleMqSession, MqConfig>(Config);
ClientConfig.PingTimeout = 500;
Server.Connected += (sender, args) => { args.Session.Socket.Close(); };
Client.Closed += (sender, args) =>
{
if (args.CloseReason == SocketCloseReason.TimeOut)
if (args.CloseReason == CloseReason.Closing)
{
TestStatus.Set();
TestComplete.Set();
}
else
{
@ -289,26 +251,22 @@ namespace DtronixMessageQueue.Tests.Mq
StartAndWait(false, 1000);
if (TestStatus.IsSet == false)
if (TestComplete.IsSet == false)
{
throw new Exception("Socket did not timeout.");
}
}
[Fact]
[Test]
public void Client_times_out_while_connecting_for_too_long()
{
Config.ConnectionTimeout = 100;
Client = new MqClient<SimpleMqSession, MqConfig>(Config);
Server.Connected += (sender, args) => { args.Session.Socket.Close(); };
ClientConfig.ConnectionTimeout = 200;
Client.Closed += (sender, args) =>
{
if (args.CloseReason == SocketCloseReason.TimeOut)
if (args.CloseReason == CloseReason.TimeOut)
{
TestStatus.Set();
TestComplete.Set();
}
else
{
@ -318,13 +276,13 @@ namespace DtronixMessageQueue.Tests.Mq
StartAndWait(false, 10000, false);
if (TestStatus.IsSet == false)
if (TestComplete.IsSet == false)
{
throw new Exception("Socket did not timeout.");
}
}
[Fact]
[Test]
public void Client_reconnects_after_close()
{
int connected_times = 0;
@ -334,7 +292,7 @@ namespace DtronixMessageQueue.Tests.Mq
{
if (++connected_times == 2)
{
TestStatus.Set();
TestComplete.Set();
}
Client.Close();
@ -351,9 +309,9 @@ namespace DtronixMessageQueue.Tests.Mq
TestStatus.Wait(new TimeSpan(0, 0, 0, 0, 2000));
TestComplete.Wait(new TimeSpan(0, 0, 0, 0, 2000));
if (TestStatus.IsSet == false)
if (TestComplete.IsSet == false)
{
throw new TimeoutException("Test timed out.");
}

Просмотреть файл

@ -1,10 +1,11 @@
using System;
using System.IO;
using System.Linq;
using Xunit;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests.Mq
{
[TestFixture]
public class MqFrameBuilderTests
{
private MqFrame _emptyLastFrame;
@ -17,75 +18,81 @@ namespace DtronixMessageQueue.Tests.Mq
private MqFrame _pingFrame;
public MqFrameBuilderTests()
{
}
[SetUp]
public void Init()
{
_frameBuilder = new MqFrameBuilder(_config);
_emptyLastFrame = new MqFrame(null, MqFrameType.EmptyLast, _config);
_emptyFrame = new MqFrame(null, MqFrameType.Empty, _config);
_lastFrame = new MqFrame(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, MqFrameType.Last, _config);
_moreFrame = new MqFrame(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, MqFrameType.More, _config);
_commandFrame = new MqFrame(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, MqFrameType.Command, _config);
_lastFrame = new MqFrame(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, MqFrameType.Last, _config);
_moreFrame = new MqFrame(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, MqFrameType.More, _config);
_commandFrame = new MqFrame(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, MqFrameType.Command, _config);
_pingFrame = new MqFrame(null, MqFrameType.Ping, _config);
}
[Fact]
[Test]
public void FrameBuilder_parses_empty_frame()
{
_frameBuilder.Write(_emptyFrame.RawFrame(), 0, _emptyFrame.FrameSize);
_frameBuilder.Write(_emptyFrame.RawFrame());
var parsedFrame = _frameBuilder.Frames.Dequeue();
Utilities.CompareFrame(_emptyFrame, parsedFrame);
}
[Fact]
[Test]
public void FrameBuilder_parses_empty_last_frame()
{
_frameBuilder.Write(_emptyLastFrame.RawFrame(), 0, _emptyFrame.FrameSize);
_frameBuilder.Write(_emptyLastFrame.RawFrame());
var parsedFrame = _frameBuilder.Frames.Dequeue();
Utilities.CompareFrame(_emptyLastFrame, parsedFrame);
}
[Fact]
[Test]
public void FrameBuilder_parses_last_frame()
{
_frameBuilder.Write(_lastFrame.RawFrame(), 0, _lastFrame.FrameSize);
_frameBuilder.Write(_lastFrame.RawFrame());
var parsedFrame = _frameBuilder.Frames.Dequeue();
Utilities.CompareFrame(_lastFrame, parsedFrame);
}
[Fact]
[Test]
public void FrameBuilder_parses_more_frame()
{
_frameBuilder.Write(_moreFrame.RawFrame(), 0, _moreFrame.FrameSize);
_frameBuilder.Write(_moreFrame.RawFrame());
var parsedFrame = _frameBuilder.Frames.Dequeue();
Utilities.CompareFrame(_moreFrame, parsedFrame);
}
[Fact]
[Test]
public void FrameBuilder_parses_command_frame()
{
_frameBuilder.Write(_commandFrame.RawFrame(), 0, _commandFrame.FrameSize);
_frameBuilder.Write(_commandFrame.RawFrame());
var parsedFrame = _frameBuilder.Frames.Dequeue();
Utilities.CompareFrame(_commandFrame, parsedFrame);
}
[Fact]
[Test]
public void FrameBuilder_parses_ping_frame()
{
_frameBuilder.Write(_pingFrame.RawFrame(), 0, _pingFrame.FrameSize);
_frameBuilder.Write(_pingFrame.RawFrame());
var parsedFrame = _frameBuilder.Frames.Dequeue();
Utilities.CompareFrame(_pingFrame, parsedFrame);
}
[Fact]
[Test]
public void FrameBuilder_parses_multiple_frames()
{
_frameBuilder.Write(_moreFrame.RawFrame(), 0, _moreFrame.FrameSize);
_frameBuilder.Write(_moreFrame.RawFrame(), 0, _moreFrame.FrameSize);
_frameBuilder.Write(_moreFrame.RawFrame());
_frameBuilder.Write(_moreFrame.RawFrame());
while (_frameBuilder.Frames.Count > 0)
{
@ -94,54 +101,54 @@ namespace DtronixMessageQueue.Tests.Mq
}
}
[Fact]
[Test]
public void FrameBuilder_parses_frames_in_parts()
{
var frameBytes = _lastFrame.RawFrame();
for (int i = 0; i < frameBytes.Length; i++)
{
_frameBuilder.Write(new[] {frameBytes[i]}, 0, 1);
_frameBuilder.Write(new[] {frameBytes[i]});
}
var parsedFrame = _frameBuilder.Frames.Dequeue();
Utilities.CompareFrame(_lastFrame, parsedFrame);
}
[Fact]
[Test]
public void FrameBuilder_throws_passed_buffer_too_large()
{
Assert.Throws<InvalidDataException>(
() => { _frameBuilder.Write(new byte[_config.FrameBufferSize + 1], 0, _config.FrameBufferSize + 1); });
() => { _frameBuilder.Write(new byte[_config.FrameBufferSize + 1]); });
}
[Fact]
[Test]
public void FrameBuilder_throws_frame_zero_length()
{
Assert.Throws<InvalidDataException>(() => { _frameBuilder.Write(new byte[] {2, 0, 0, 1}, 0, 4); });
Assert.Throws<InvalidDataException>(() => { _frameBuilder.Write(new byte[] {2, 0, 0, 1}); });
}
[Fact]
[Test]
public void FrameBuilder_throws_frame_specified_length_too_large()
{
Assert.Throws<InvalidDataException>(() => { _frameBuilder.Write(new byte[] {2, 255, 255, 1}, 0, 4); });
Assert.Throws<InvalidDataException>(() => { _frameBuilder.Write(new byte[] {2, 255, 255, 1}); });
}
[Fact]
[Test]
public void FrameBuilder_throws_frame_type_out_of_range()
{
var maxTypeEnum = Enum.GetValues(typeof(MqFrameType)).Cast<byte>().Max() + 1;
Assert.Throws<InvalidDataException>(() => { _frameBuilder.Write(new byte[] {(byte) maxTypeEnum}, 0, 1); });
Assert.Throws<InvalidDataException>(() => { _frameBuilder.Write(new byte[] {(byte) maxTypeEnum}); });
}
[Fact]
[Test]
public void FrameBuilder_parsed_frame_data()
{
_frameBuilder.Write(new byte[] {2, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, 0, 13);
_frameBuilder.Write(new byte[] {2, 10, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0});
var parsedFrame = _frameBuilder.Frames.Dequeue();
Assert.Equal(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, parsedFrame.Buffer);
Assert.AreEqual(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}, parsedFrame.Buffer);
}
}

Просмотреть файл

@ -1,8 +1,9 @@
using System;
using Xunit;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests.Mq
{
[TestFixture]
public class MqFrameTests
{
private MqFrame _actualFrame;
@ -14,89 +15,95 @@ namespace DtronixMessageQueue.Tests.Mq
{
}
[Fact]
[SetUp]
public void Init()
{
}
[Test]
public void Frame_creates_empty_frame()
{
_expectedBytes = new byte[] {1};
_actualFrame = new MqFrame(null, MqFrameType.Empty, _config);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_empty_frame_throws_on_bytes()
{
Assert.Throws<ArgumentException>(() => new MqFrame(new byte[] {1}, MqFrameType.Empty, _config));
}
[Fact]
[Test]
public void Frame_empty_frame_accepts_empty_array()
{
_expectedBytes = new byte[] {1};
_actualFrame = new MqFrame(new byte[] {}, MqFrameType.Empty, _config);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_creates_empty_last_frame()
{
_expectedBytes = new byte[] {4};
_actualFrame = new MqFrame(null, MqFrameType.EmptyLast, _config);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_creates_command_frame()
{
_expectedBytes = new byte[] {5, 1, 0, 1};
_actualFrame = new MqFrame(new byte[] {1}, MqFrameType.Command, _config);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_creates_ping_frame()
{
_expectedBytes = new byte[] {6};
_actualFrame = new MqFrame(null, MqFrameType.Ping, _config);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_empty_last_frame_throws_on_bytes()
{
Assert.Throws<ArgumentException>(() => new MqFrame(new byte[] {1}, MqFrameType.EmptyLast, _config));
}
[Fact]
[Test]
public void Frame_creates_more_frame_bytes()
{
_expectedBytes = new byte[] {2, 5, 0, 1, 2, 3, 4, 5};
_actualFrame = new MqFrame(new byte[] {1, 2, 3, 4, 5}, MqFrameType.More, _config);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_creates_last_frame_bytes()
{
_expectedBytes = new byte[] {3, 5, 0, 1, 2, 3, 4, 5};
_actualFrame = new MqFrame(new byte[] {1, 2, 3, 4, 5}, MqFrameType.Last, _config);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_byte_array_full()
{
_expectedBytes = new byte[] {3, 5, 0, 1, 2, 3, 4, 241};
@ -104,10 +111,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, new byte[] {1, 2, 3, 4, 241}, 0, 5);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_byte_array_offset()
{
_expectedBytes = new byte[] {3, 3, 0, 3, 4, 241};
@ -115,10 +122,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, new byte[] {1, 2, 3, 4, 241}, 2, 3);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_byte_array_offset_length()
{
_expectedBytes = new byte[] {3, 2, 0, 3, 4};
@ -126,10 +133,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, new byte[] {1, 2, 3, 4, 241}, 2, 2);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_byte_array_offset_length_position()
{
_expectedBytes = new byte[] {3, 3, 0, 0, 3, 4};
@ -137,10 +144,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(1, new byte[] {1, 2, 3, 4, 241}, 2, 2);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_byte_array()
{
_expectedBytes = new byte[] {1, 2, 3, 4, 5};
@ -148,10 +155,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = new byte[5];
_actualFrame.Read(0, _actualBytes, 0, 5);
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_bool_true()
{
_expectedBytes = new byte[] {3, 1, 0, 1};
@ -159,10 +166,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, true);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_bool_false()
{
_expectedBytes = new byte[] {3, 2, 0, 0, 0};
@ -170,10 +177,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, false);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_bool_position()
{
_expectedBytes = new byte[] {3, 2, 0, 0, 1};
@ -181,19 +188,19 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(1, true);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_bool()
{
_actualFrame = new MqFrame(new byte[1], MqFrameType.Last, _config);
_actualFrame.Write(0, true);
Assert.Equal(true, _actualFrame.ReadBoolean(0));
Assert.AreEqual(true, _actualFrame.ReadBoolean(0));
}
[Fact]
[Test]
public void Frame_writes_byte()
{
_expectedBytes = new byte[] {3, 1, 0, 231};
@ -201,10 +208,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (byte) 231);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_byte_position()
{
_expectedBytes = new byte[] {3, 2, 0, 0, 231};
@ -212,10 +219,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(1, (byte) 231);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_sbyte_negative()
{
_expectedBytes = new byte[] {3, 1, 0, 155};
@ -224,10 +231,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_sbyte_position()
{
_expectedBytes = new byte[] {3, 2, 0, 0, 101};
@ -236,31 +243,31 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_sbyte()
{
var value = (sbyte) 101;
_actualFrame = new MqFrame(new byte[1], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadSByte(0));
Assert.AreEqual(value, _actualFrame.ReadSByte(0));
}
[Fact]
[Test]
public void Frame_reads_sbyte_position()
{
var value = (sbyte) 101;
_actualFrame = new MqFrame(new byte[2], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadSByte(1));
Assert.AreEqual(value, _actualFrame.ReadSByte(1));
}
[Fact]
[Test]
public void Frame_writes_char()
{
_expectedBytes = new byte[] {3, 1, 0, 68};
@ -269,10 +276,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_char_position()
{
_expectedBytes = new byte[] {3, 2, 0, 0, 68};
@ -281,30 +288,30 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_char()
{
var value = (char) 'D';
_actualFrame = new MqFrame(new byte[1], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadChar(0));
Assert.AreEqual(value, _actualFrame.ReadChar(0));
}
[Fact]
[Test]
public void Frame_reads_char_position()
{
var value = (char) 'D';
_actualFrame = new MqFrame(new byte[2], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadChar(1));
Assert.AreEqual(value, _actualFrame.ReadChar(1));
}
[Fact]
[Test]
public void Frame_writes_short_positive()
{
_expectedBytes = new byte[] {3, 2, 0, 93, 94};
@ -312,10 +319,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (short) 24157);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_short_negative()
{
_expectedBytes = new byte[] {3, 2, 0, 163, 161};
@ -323,10 +330,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (short) -24157);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_short_position()
{
_expectedBytes = new byte[] {3, 3, 0, 0, 93, 94};
@ -334,31 +341,31 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(1, (short) 24157);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_short()
{
var value = (short) 24157;
_actualFrame = new MqFrame(new byte[2], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadInt16(0));
Assert.AreEqual(value, _actualFrame.ReadInt16(0));
}
[Fact]
[Test]
public void Frame_reads_short_position()
{
var value = (short) 24157;
_actualFrame = new MqFrame(new byte[3], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadInt16(1));
Assert.AreEqual(value, _actualFrame.ReadInt16(1));
}
[Fact]
[Test]
public void Frame_writes_ushort()
{
_expectedBytes = new byte[] {3, 2, 0, 191, 215};
@ -366,10 +373,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (ushort) 55231);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_ushort_position()
{
_expectedBytes = new byte[] {3, 3, 0, 0, 191, 215};
@ -377,31 +384,31 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(1, (ushort) 55231);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_ushort()
{
var value = (ushort) 55231;
_actualFrame = new MqFrame(new byte[2], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadUInt16(0));
Assert.AreEqual(value, _actualFrame.ReadUInt16(0));
}
[Fact]
[Test]
public void Frame_reads_ushort_position()
{
var value = (ushort) 55231;
_actualFrame = new MqFrame(new byte[3], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadUInt16(1));
Assert.AreEqual(value, _actualFrame.ReadUInt16(1));
}
[Fact]
[Test]
public void Frame_writes_int_positive()
{
_expectedBytes = new byte[] {3, 4, 0, 210, 2, 150, 73};
@ -409,10 +416,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (int) 1234567890);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_int_negative()
{
_expectedBytes = new byte[] {3, 4, 0, 46, 253, 105, 182};
@ -420,10 +427,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (int) -1234567890);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_int_position()
{
_expectedBytes = new byte[] {3, 5, 0, 0, 210, 2, 150, 73};
@ -431,30 +438,30 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(1, (int) 1234567890);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_int()
{
var value = (int) 1234567890;
_actualFrame = new MqFrame(new byte[4], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadInt32(0));
Assert.AreEqual(value, _actualFrame.ReadInt32(0));
}
[Fact]
[Test]
public void Frame_reads_int_position()
{
var value = (int) 1234567890;
_actualFrame = new MqFrame(new byte[5], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadInt32(1));
Assert.AreEqual(value, _actualFrame.ReadInt32(1));
}
[Fact]
[Test]
public void Frame_writes_uint()
{
_expectedBytes = new byte[] {3, 4, 0, 167, 251, 4, 253};
@ -462,11 +469,11 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (uint) 4244962215);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_uint_position()
{
_expectedBytes = new byte[] {3, 4, 0, 167, 251, 4, 253};
@ -474,31 +481,31 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (uint) 4244962215);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_uint()
{
var value = (uint) 4244962215;
_actualFrame = new MqFrame(new byte[4], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadUInt32(0));
Assert.AreEqual(value, _actualFrame.ReadUInt32(0));
}
[Fact]
[Test]
public void Frame_reads_uint_position()
{
var value = (uint) 4244962215;
_actualFrame = new MqFrame(new byte[5], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadUInt32(1));
Assert.AreEqual(value, _actualFrame.ReadUInt32(1));
}
[Fact]
[Test]
public void Frame_writes_long_positive()
{
_expectedBytes = new byte[] {3, 8, 0, 178, 125, 244, 181, 59, 233, 33, 17};
@ -506,10 +513,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (long) 1234524215541267890);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_long_negative()
{
_expectedBytes = new byte[] {3, 8, 0, 78, 130, 11, 74, 196, 22, 222, 238};
@ -517,10 +524,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(0, (long) -1234524215541267890);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_long_position()
{
_expectedBytes = new byte[] {3, 9, 0, 0, 178, 125, 244, 181, 59, 233, 33, 17};
@ -528,30 +535,30 @@ namespace DtronixMessageQueue.Tests.Mq
_actualFrame.Write(1, (long) 1234524215541267890);
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_long()
{
var value = (long) 4244962215;
_actualFrame = new MqFrame(new byte[8], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadInt64(0));
Assert.AreEqual(value, _actualFrame.ReadInt64(0));
}
[Fact]
[Test]
public void Frame_reads_long_position()
{
var value = (long) 4244962215;
_actualFrame = new MqFrame(new byte[9], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadInt64(1));
Assert.AreEqual(value, _actualFrame.ReadInt64(1));
}
[Fact]
[Test]
public void Frame_writes_ulong()
{
_expectedBytes = new byte[] {3, 8, 0, 63, 244, 163, 154, 134, 47, 214, 251};
@ -560,10 +567,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_ulong_position()
{
_expectedBytes = new byte[] {3, 9, 0, 0, 63, 244, 163, 154, 134, 47, 214, 251};
@ -572,31 +579,31 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_ulong()
{
var value = (ulong) 18146744003702551615;
_actualFrame = new MqFrame(new byte[8], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadUInt64(0));
Assert.AreEqual(value, _actualFrame.ReadUInt64(0));
}
[Fact]
[Test]
public void Frame_reads_ulong_position()
{
var value = (ulong) 18146744003702551615;
_actualFrame = new MqFrame(new byte[9], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadUInt64(1));
Assert.AreEqual(value, _actualFrame.ReadUInt64(1));
}
[Fact]
[Test]
public void Frame_writes_float()
{
_expectedBytes = new byte[] {3, 4, 0, 121, 233, 246, 66};
@ -605,10 +612,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_float_position()
{
_expectedBytes = new byte[] {3, 5, 0, 0, 121, 233, 246, 66};
@ -617,30 +624,30 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_float()
{
var value = (float) 123.456;
_actualFrame = new MqFrame(new byte[4], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadSingle(0));
Assert.AreEqual(value, _actualFrame.ReadSingle(0));
}
[Fact]
[Test]
public void Frame_reads_float_position()
{
var value = (float) 123.456;
_actualFrame = new MqFrame(new byte[5], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadSingle(1));
Assert.AreEqual(value, _actualFrame.ReadSingle(1));
}
[Fact]
[Test]
public void Frame_writes_double()
{
_expectedBytes = new byte[] {3, 8, 0, 119, 219, 133, 230, 214, 28, 200, 64};
@ -649,10 +656,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_double_position()
{
_expectedBytes = new byte[] {3, 9, 0, 0, 119, 219, 133, 230, 214, 28, 200, 64};
@ -661,31 +668,31 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_double()
{
var value = (double) 12345.67891;
_actualFrame = new MqFrame(new byte[8], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadDouble(0));
Assert.AreEqual(value, _actualFrame.ReadDouble(0));
}
[Fact]
[Test]
public void Frame_reads_double_position()
{
var value = (double) 12345.67891;
_actualFrame = new MqFrame(new byte[9], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadDouble(1));
Assert.AreEqual(value, _actualFrame.ReadDouble(1));
}
[Fact]
[Test]
public void Frame_writes_decimal()
{
_expectedBytes = new byte[] {3, 16, 0, 160, 107, 84, 143, 156, 7, 157, 126, 0, 0, 0, 0, 0, 0, 0, 0};
@ -694,10 +701,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_decimal_position()
{
_expectedBytes = new byte[] {3, 17, 0, 0, 160, 107, 84, 143, 156, 7, 157, 126, 0, 0, 0, 0, 0, 0, 0, 0};
@ -706,30 +713,30 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_decimal()
{
var value = (decimal) 9123456789123456789.9123456789123456789;
_actualFrame = new MqFrame(new byte[16], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadDecimal(0));
Assert.AreEqual(value, _actualFrame.ReadDecimal(0));
}
[Fact]
[Test]
public void Frame_reads_decimal_position()
{
var value = (decimal) 9123456789123456789.9123456789123456789;
_actualFrame = new MqFrame(new byte[17], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadDecimal(1));
Assert.AreEqual(value, _actualFrame.ReadDecimal(1));
}
[Fact]
[Test]
public void Frame_writes_sbyte_positive()
{
_expectedBytes = new byte[] {3, 1, 0, 101};
@ -738,10 +745,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_ascii_text_prepended_with_size()
{
_expectedBytes = new byte[]
@ -756,10 +763,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_ascii_text_prepended_with_size_position()
{
_expectedBytes = new byte[]
@ -775,10 +782,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_ascii_text_not_prepended_with_size()
{
_expectedBytes = new byte[]
@ -792,10 +799,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_ascii_text_not_prepended_with_size_position()
{
_expectedBytes = new byte[]
@ -810,31 +817,31 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_ascii_text_prepended_with_size()
{
var value = "abcdefghijklmnopqrstuvwxyz";
_actualFrame = new MqFrame(new byte[28], MqFrameType.Last, _config);
_actualFrame.WriteAscii(0, value, true);
Assert.Equal(value, _actualFrame.ReadAscii(0));
Assert.AreEqual(value, _actualFrame.ReadAscii(0));
}
[Fact]
[Test]
public void Frame_reads_ascii_text_not_prepended_with_size()
{
var value = "abcdefghijklmnopqrstuvwxyz";
_actualFrame = new MqFrame(new byte[26], MqFrameType.Last, _config);
_actualFrame.WriteAscii(0, value, false);
Assert.Equal(value, _actualFrame.ReadAscii(0, _actualFrame.DataLength));
Assert.AreEqual(value, _actualFrame.ReadAscii(0, _actualFrame.DataLength));
}
[Fact]
[Test]
public void Frame_throws_on_ascii_text_write_when_larger_than_frame()
{
var value = "abcdefghijklmnopqrstuvwxyz";
@ -848,7 +855,7 @@ namespace DtronixMessageQueue.Tests.Mq
Assert.Throws<InvalidOperationException>(() => _actualFrame.WriteAscii(0, value, false));
}
[Fact]
[Test]
public void Frame_writes_guid()
{
var value = Guid.NewGuid();
@ -862,10 +869,10 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_writes_guid_position()
{
var value = Guid.NewGuid();
@ -879,27 +886,27 @@ namespace DtronixMessageQueue.Tests.Mq
_actualBytes = _actualFrame.RawFrame();
Assert.Equal(_expectedBytes, _actualBytes);
Assert.AreEqual(_expectedBytes, _actualBytes);
}
[Fact]
[Test]
public void Frame_reads_guid()
{
var value = Guid.NewGuid();
_actualFrame = new MqFrame(new byte[16], MqFrameType.Last, _config);
_actualFrame.Write(0, value);
Assert.Equal(value, _actualFrame.ReadGuid(0));
Assert.AreEqual(value, _actualFrame.ReadGuid(0));
}
[Fact]
[Test]
public void Frame_reads_guid_position()
{
var value = Guid.NewGuid();
_actualFrame = new MqFrame(new byte[17], MqFrameType.Last, _config);
_actualFrame.Write(1, value);
Assert.Equal(value, _actualFrame.ReadGuid(1));
Assert.AreEqual(value, _actualFrame.ReadGuid(1));
}
}
}

Просмотреть файл

@ -1,14 +1,13 @@
using System;
using System.Text;
using Xunit;
using Xunit.Abstractions;
using Assert = Xunit.Assert;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests.Mq
{
[TestFixture]
public class MqMessageWriterReaderTests
{
public ITestOutputHelper Output;
private MqMessageWriter _messageBuilder;
private MqMessageReader _messageReader;
private MqConfig _config = new MqConfig();
@ -16,14 +15,18 @@ namespace DtronixMessageQueue.Tests.Mq
private const string FillerText =
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";
public MqMessageWriterReaderTests(ITestOutputHelper output)
public MqMessageWriterReaderTests()
{
}
[SetUp]
public void Init()
{
Output = output;
_messageBuilder = new MqMessageWriter(_config);
_messageReader = new MqMessageReader();
}
[Fact]
[Test]
public void MessageWriter_writes_bool_true()
{
var expectedValue = (bool) true;
@ -31,11 +34,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadBoolean());
Assert.AreEqual(expectedValue, _messageReader.ReadBoolean());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_bool_false()
{
var expectedValue = (bool) false;
@ -43,11 +46,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadBoolean());
Assert.AreEqual(expectedValue, _messageReader.ReadBoolean());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_byte()
{
var expectedValue = (byte) 221;
@ -55,11 +58,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadByte());
Assert.AreEqual(expectedValue, _messageReader.ReadByte());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_sbyte_positive()
{
var expectedValue = (sbyte) 101;
@ -67,11 +70,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadSByte());
Assert.AreEqual(expectedValue, _messageReader.ReadSByte());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_sbyte_negative()
{
var expectedValue = (sbyte) -101;
@ -79,11 +82,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadSByte());
Assert.AreEqual(expectedValue, _messageReader.ReadSByte());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_short_positive()
{
var expectedValue = (short) 21457;
@ -91,11 +94,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadInt16());
Assert.AreEqual(expectedValue, _messageReader.ReadInt16());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_short_negative()
{
var expectedValue = (short) -21457;
@ -103,11 +106,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadInt16());
Assert.AreEqual(expectedValue, _messageReader.ReadInt16());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_ushort()
{
var expectedValue = (ushort) 51574;
@ -115,11 +118,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadUInt16());
Assert.AreEqual(expectedValue, _messageReader.ReadUInt16());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_int_positive()
{
var expectedValue = (int) 515725234;
@ -127,11 +130,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadInt32());
Assert.AreEqual(expectedValue, _messageReader.ReadInt32());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_int_negative()
{
var expectedValue = (int) -515725234;
@ -139,11 +142,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadInt32());
Assert.AreEqual(expectedValue, _messageReader.ReadInt32());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_uint()
{
var expectedValue = (uint) 1215725234;
@ -151,11 +154,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadUInt32());
Assert.AreEqual(expectedValue, _messageReader.ReadUInt32());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_long_positive()
{
var expectedValue = (long) 515352135236725234;
@ -163,11 +166,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadInt64());
Assert.AreEqual(expectedValue, _messageReader.ReadInt64());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_long_negative()
{
var expectedValue = (long) -515352135236725234;
@ -175,11 +178,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadInt64());
Assert.AreEqual(expectedValue, _messageReader.ReadInt64());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_ulong()
{
var expectedValue = (ulong) 12231512365365725234;
@ -187,11 +190,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadUInt64());
Assert.AreEqual(expectedValue, _messageReader.ReadUInt64());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_float()
{
var expectedValue = (float) 123.456;
@ -199,11 +202,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadSingle());
Assert.AreEqual(expectedValue, _messageReader.ReadSingle());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_double()
{
var expectedValue = (double) 12345.67891;
@ -211,11 +214,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadDouble());
Assert.AreEqual(expectedValue, _messageReader.ReadDouble());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_decimal()
{
var expectedValue = (decimal) 9123456789123456789.9123456789123456789;
@ -223,11 +226,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadDecimal());
Assert.AreEqual(expectedValue, _messageReader.ReadDecimal());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_multi_frame_byte_array()
{
var expectedValue = new byte[1024 * 32];
@ -255,7 +258,7 @@ namespace DtronixMessageQueue.Tests.Mq
byteArraySize += frame.DataLength;
}
Assert.Equal(expectedValue.Length, byteArraySize);
Assert.AreEqual(expectedValue.Length, byteArraySize);
var resultByteArray = new byte[byteArraySize];
var position = 0;
@ -265,10 +268,10 @@ namespace DtronixMessageQueue.Tests.Mq
position += frame.DataLength;
}
Assert.Equal(expectedValue, resultByteArray);
Assert.AreEqual(expectedValue, resultByteArray);
}
[Fact]
[Test]
public void MessageWriter_writes_multi_frame_string_bytes()
{
var sb = new StringBuilder();
@ -293,7 +296,7 @@ namespace DtronixMessageQueue.Tests.Mq
VerifyMessageBytes(expectedBytes, message);
}
[Fact]
[Test]
public void MessageReader_reads_multi_frame_byte_array()
{
var expectedValue = new byte[1024 * 32];
@ -314,13 +317,13 @@ namespace DtronixMessageQueue.Tests.Mq
var read = _messageReader.Read(actualValue, 0, actualValue.Length);
Assert.Equal(expectedValue.Length, read);
Assert.Equal(expectedValue, actualValue);
Assert.AreEqual(expectedValue.Length, read);
Assert.AreEqual(expectedValue, actualValue);
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_string()
{
var expectedValue = FillerText;
@ -328,12 +331,12 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadString());
Assert.AreEqual(expectedValue, _messageReader.ReadString());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_reads_multi_frame_string()
{
var sb = new StringBuilder();
@ -348,12 +351,12 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadString());
Assert.AreEqual(expectedValue, _messageReader.ReadString());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_multiple_reads_writes()
{
@ -395,46 +398,46 @@ namespace DtronixMessageQueue.Tests.Mq
_messageReader.Message = message;
Assert.Equal(true, _messageReader.ReadBoolean());
Assert.Equal(false, _messageReader.ReadBoolean());
Assert.AreEqual(true, _messageReader.ReadBoolean());
Assert.AreEqual(false, _messageReader.ReadBoolean());
Assert.Equal('D', _messageReader.ReadChar());
Assert.Equal(new char[] {'A', 'Y', 'X', '0', '9', '8'}, _messageReader.ReadChars(6));
Assert.AreEqual('D', _messageReader.ReadChar());
Assert.AreEqual(new char[] {'A', 'Y', 'X', '0', '9', '8'}, _messageReader.ReadChars(6));
Assert.Equal((byte) 214, _messageReader.ReadByte());
Assert.Equal((sbyte) 125, _messageReader.ReadSByte());
Assert.Equal((sbyte) -125, _messageReader.ReadSByte());
Assert.AreEqual((byte) 214, _messageReader.ReadByte());
Assert.AreEqual((sbyte) 125, _messageReader.ReadSByte());
Assert.AreEqual((sbyte) -125, _messageReader.ReadSByte());
Assert.Equal((short) 4513, _messageReader.ReadInt16());
Assert.Equal((short) -4513, _messageReader.ReadInt16());
Assert.Equal((ushort) 43513, _messageReader.ReadUInt16());
Assert.AreEqual((short) 4513, _messageReader.ReadInt16());
Assert.AreEqual((short) -4513, _messageReader.ReadInt16());
Assert.AreEqual((ushort) 43513, _messageReader.ReadUInt16());
Assert.Equal((int) 236236231, _messageReader.ReadInt32());
Assert.Equal((int) -236236231, _messageReader.ReadInt32());
Assert.Equal((uint) 2362326231, _messageReader.ReadUInt32());
Assert.AreEqual((int) 236236231, _messageReader.ReadInt32());
Assert.AreEqual((int) -236236231, _messageReader.ReadInt32());
Assert.AreEqual((uint) 2362326231, _messageReader.ReadUInt32());
Assert.Equal((long) 2362362312561531, _messageReader.ReadInt64());
Assert.Equal((long) -2362362312561531, _messageReader.ReadInt64());
Assert.Equal((ulong) 2362362312561531125, _messageReader.ReadUInt64());
Assert.AreEqual((long) 2362362312561531, _messageReader.ReadInt64());
Assert.AreEqual((long) -2362362312561531, _messageReader.ReadInt64());
Assert.AreEqual((ulong) 2362362312561531125, _messageReader.ReadUInt64());
Assert.Equal((float) 1234.56789, _messageReader.ReadSingle());
Assert.Equal((double) 123467.5678912, _messageReader.ReadDouble());
Assert.Equal((decimal) 123456789123456789.123456789123456789, _messageReader.ReadDecimal());
Assert.AreEqual((float) 1234.56789, _messageReader.ReadSingle());
Assert.AreEqual((double) 123467.5678912, _messageReader.ReadDouble());
Assert.AreEqual((decimal) 123456789123456789.123456789123456789, _messageReader.ReadDecimal());
var readByteArray = new byte[50];
_messageReader.Read(readByteArray, 0, readByteArray.Length);
Assert.Equal(expectedByteArray, readByteArray);
Assert.AreEqual(expectedByteArray, readByteArray);
Assert.Equal(FillerText, _messageReader.ReadString());
Assert.AreEqual(FillerText, _messageReader.ReadString());
Assert.Equal(expectedGuid, _messageReader.ReadGuid());
Assert.AreEqual(expectedGuid, _messageReader.ReadGuid());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_char()
{
var expectedValue = (char) 'D';
@ -442,11 +445,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadChar());
Assert.AreEqual(expectedValue, _messageReader.ReadChar());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_char_array()
{
var expectedValue = new char[] {'A', 'B', 'C', '1', '2', '3'};
@ -454,11 +457,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadChars(expectedValue.Length));
Assert.AreEqual(expectedValue, _messageReader.ReadChars(expectedValue.Length));
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageWriter_writes_char_array_slice()
{
var inputValue = new char[] {'A', 'B', 'C', '1', '2', '3'};
@ -467,11 +470,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadChars(expectedValue.Length));
Assert.AreEqual(expectedValue, _messageReader.ReadChars(expectedValue.Length));
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_peeks_char()
{
var expectedValue = new char[] {'D', 'Z'};
@ -479,12 +482,12 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue[0], _messageReader.PeekChar());
Assert.Equal(expectedValue, _messageReader.ReadChars(expectedValue.Length));
Assert.AreEqual(expectedValue[0], _messageReader.PeekChar());
Assert.AreEqual(expectedValue, _messageReader.ReadChars(expectedValue.Length));
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_reads_to_end()
{
var expectedValue = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
@ -492,11 +495,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadToEnd());
Assert.AreEqual(expectedValue, _messageReader.ReadToEnd());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_reads_to_end_multi_frame()
{
var expectedValue = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
@ -508,11 +511,11 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadToEnd());
Assert.AreEqual(expectedValue, _messageReader.ReadToEnd());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_reads_to_end_multi_frame_skipping_empty_frame()
{
var expectedValue = new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
@ -525,12 +528,12 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadToEnd());
Assert.AreEqual(expectedValue, _messageReader.ReadToEnd());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_reads_to_end_partial()
{
var expectedValue = new byte[] {4, 5, 6, 7, 8, 9, 10};
@ -539,12 +542,12 @@ namespace DtronixMessageQueue.Tests.Mq
_messageReader.Message = message;
_messageReader.ReadBytes(3);
Assert.Equal(expectedValue, _messageReader.ReadToEnd());
Assert.AreEqual(expectedValue, _messageReader.ReadToEnd());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_maintains_position()
{
var expectedValue = 5;
@ -553,11 +556,11 @@ namespace DtronixMessageQueue.Tests.Mq
_messageReader.Message = message;
_messageReader.ReadBytes(5);
Assert.Equal(expectedValue, _messageReader.Position);
Assert.AreEqual(expectedValue, _messageReader.Position);
Assert.False(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_maintains_position_across_frames()
{
var expectedValue = 7;
@ -569,12 +572,12 @@ namespace DtronixMessageQueue.Tests.Mq
_messageReader.Message = message;
Assert.Equal(new byte[] {1, 2, 3, 4, 5, 6, 7}, _messageReader.ReadBytes(7));
Assert.Equal(expectedValue, _messageReader.Position);
Assert.AreEqual(new byte[] {1, 2, 3, 4, 5, 6, 7}, _messageReader.ReadBytes(7));
Assert.AreEqual(expectedValue, _messageReader.Position);
Assert.False(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_throws_when_reading_simple_type_across_frames()
{
_messageBuilder.Write(new byte[] {1, 2});
@ -587,7 +590,7 @@ namespace DtronixMessageQueue.Tests.Mq
Assert.Throws<InvalidOperationException>(() => _messageReader.ReadInt32());
}
[Fact]
[Test]
public void MessageReader_skips_bytes()
{
_messageBuilder.Write(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
@ -596,11 +599,11 @@ namespace DtronixMessageQueue.Tests.Mq
_messageReader.Skip(4);
Assert.Equal(4, _messageReader.Position);
Assert.AreEqual(4, _messageReader.Position);
Assert.False(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_skips_empty_frames()
{
_messageBuilder.Write(new byte[] {1, 2});
@ -614,12 +617,12 @@ namespace DtronixMessageQueue.Tests.Mq
_messageReader.Skip(3);
Assert.Equal(3, _messageReader.Position);
Assert.Equal(4, _messageReader.ReadByte());
Assert.AreEqual(3, _messageReader.Position);
Assert.AreEqual(4, _messageReader.ReadByte());
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_sets_position()
{
_messageBuilder.Write(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9});
@ -627,16 +630,16 @@ namespace DtronixMessageQueue.Tests.Mq
_messageReader.Message = message;
_messageReader.Position = 2;
Assert.Equal(2, _messageReader.Position);
Assert.AreEqual(2, _messageReader.Position);
_messageReader.Position = 1;
Assert.Equal(1, _messageReader.Position);
Assert.AreEqual(1, _messageReader.Position);
_messageReader.Position = 3;
Assert.Equal(3, _messageReader.Position);
Assert.AreEqual(3, _messageReader.Position);
}
[Fact]
[Test]
public void MessageReader_sets_position_and_reads()
{
_messageBuilder.Write(new byte[] {1, 2, 3, 4, 5});
@ -644,19 +647,19 @@ namespace DtronixMessageQueue.Tests.Mq
_messageReader.Message = message;
Assert.Equal(new byte[] {1, 2, 3, 4, 5}, _messageReader.ReadBytes(5));
Assert.Equal(5, _messageReader.Position);
Assert.AreEqual(new byte[] {1, 2, 3, 4, 5}, _messageReader.ReadBytes(5));
Assert.AreEqual(5, _messageReader.Position);
_messageReader.Position = 2;
Assert.Equal(2, _messageReader.Position);
Assert.AreEqual(2, _messageReader.Position);
Assert.Equal(new byte[] {3, 4, 5}, _messageReader.ReadBytes(3));
Assert.Equal(5, _messageReader.Position);
Assert.AreEqual(new byte[] {3, 4, 5}, _messageReader.ReadBytes(3));
Assert.AreEqual(5, _messageReader.Position);
Assert.True(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_sets_position_and_updates_isatend()
{
_messageBuilder.Write(new byte[] {1, 2, 3, 4, 5, 6, 7, 8, 9});
@ -672,7 +675,7 @@ namespace DtronixMessageQueue.Tests.Mq
Assert.False(_messageReader.IsAtEnd);
}
[Fact]
[Test]
public void MessageReader_writes_guid()
{
var expectedValue = (Guid)Guid.NewGuid();
@ -680,7 +683,7 @@ namespace DtronixMessageQueue.Tests.Mq
var message = _messageBuilder.ToMessage();
_messageReader.Message = message;
Assert.Equal(expectedValue, _messageReader.ReadGuid());
Assert.AreEqual(expectedValue, _messageReader.ReadGuid());
Assert.True(_messageReader.IsAtEnd);
}
}

Просмотреть файл

@ -1,23 +1,17 @@
using System;
using System.Threading;
using DtronixMessageQueue.Socket;
using Xunit;
using Xunit.Abstractions;
using DtronixMessageQueue.TcpSocket;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests.Mq
{
public class MqServerTests : MqTestsBase
{
public MqServerTests(ITestOutputHelper output) : base(output)
{
}
[Theory]
[InlineData(1, false)]
[InlineData(1, true)]
[InlineData(100, true)]
[InlineData(1000, true)]
[TestCase(1, false)]
[TestCase(1, true)]
[TestCase(100, true)]
[TestCase(1000, true)]
public void Server_should_send_data_to_client(int number, bool validate)
{
var messageSource = GenerateRandomMessage(4, 50);
@ -49,100 +43,84 @@ namespace DtronixMessageQueue.Tests.Mq
if (clientMessageCount == number)
{
TestStatus.Set();
TestComplete.Set();
}
};
StartAndWait();
}
[Fact]
[Test]
public void Server_accepts_new_connection()
{
Server.Connected += (sender, session) => { TestStatus.Set(); };
Server.Connected += (sender, session) => { TestComplete.Set(); };
StartAndWait();
}
[Fact]
[Test]
public void Server_detects_client_disconnect()
{
Client.Connected += (sender, args) => { Client.Close(); };
Server.Closed += (session, value) => { TestStatus.Set(); };
Server.Closed += (session, value) => { TestComplete.Set(); };
StartAndWait();
}
[Fact]
[Test]
public void Server_stops()
{
Server.Start();
Assert.Equal(true, Server.IsRunning);
Assert.AreEqual(true, Server.IsRunning);
Server.Stop();
Assert.Equal(false, Server.IsRunning);
Assert.AreEqual(false, Server.IsRunning);
}
[Fact]
[Test]
public void Server_accepts_new_connection_after_max()
{
Server.Config.MaxConnections = 1;
var client = CreateClient(Config);
var client2 = CreateClient(Config);
var client = CreateClient(ClientConfig);
var client2 = CreateClient(ClientConfig);
Server.Start();
client.Connected += (sender, args) => client.Close();
client.Closed += (sender, args) => client2.Connect();
client2.Connected += (sender, args) => TestStatus.Set();
client2.Connected += (sender, args) => TestComplete.Set();
client.Connect();
TestStatus.Wait(new TimeSpan(0, 0, 0, 0, 1000));
TestComplete.Wait(new TimeSpan(0, 0, 0, 0, 1000));
if (TestStatus.IsSet == false)
if (TestComplete.IsSet == false)
{
throw new TimeoutException("Test timed out.");
}
}
[Fact]
[Test]
public void Server_refuses_new_connection_after_max()
{
Server.Config.MaxConnections = 1;
Exception invalidClosException = null;
var client = CreateClient(Config);
var client2 = CreateClient(Config);
var client2 = CreateClient(ClientConfig);
Server.Start();
client.Connected += (sender, args) => client2.Connect();
Client.Connected += (sender, args) => client2.Connect();
client2.Closed += (sender, args) =>
{
if (args.CloseReason != SocketCloseReason.ConnectionRefused)
if (args.CloseReason != CloseReason.ConnectionRefused)
{
invalidClosException = new Exception("Client socket did not close for the correct reason.");
LastException = new Exception("Client socket did not close for the correct reason.");
}
TestStatus.Set();
TestComplete.Set();
};
client.Connect();
TestStatus.Wait(new TimeSpan(0, 0, 0, 0, 1000));
if (TestStatus.IsSet == false)
{
throw new TimeoutException("Test timed out.");
StartAndWait();
}
if (invalidClosException != null)
{
throw invalidClosException;
}
}
[Fact]
[Test]
public void Server_restarts_after_stop()
{
int connected_times = 0;
@ -154,7 +132,7 @@ namespace DtronixMessageQueue.Tests.Mq
Client.Close();
if (++connected_times == 2)
{
TestStatus.Set();
TestComplete.Set();
}
else
{
@ -175,42 +153,42 @@ namespace DtronixMessageQueue.Tests.Mq
TestStatus.Wait(new TimeSpan(0, 0, 0, 0, 2000));
TestComplete.Wait(new TimeSpan(0, 0, 0, 0, 2000));
if (TestStatus.IsSet == false)
if (TestComplete.IsSet == false)
{
throw new TimeoutException("Test timed out.");
}
}
[Fact]
[Test]
public void Server_invokes_stopped_event()
{
Server.Started += (sender, args) => Server.Stop();
Server.Started += (sender, args) => TestStatus.Set();
Server.Started += (sender, args) => TestComplete.Set();
Server.Start();
TestStatus.Wait(new TimeSpan(0, 0, 0, 0, 2000));
TestComplete.Wait(new TimeSpan(0, 0, 0, 0, 2000));
if (TestStatus.IsSet == false)
if (TestComplete.IsSet == false)
{
throw new TimeoutException("Test timed out.");
}
}
[Fact]
[Test]
public void Server_invokes_started_event()
{
Server.Started += (sender, args) => TestStatus.Set();
Server.Started += (sender, args) => TestComplete.Set();
Server.Start();
TestStatus.Wait(new TimeSpan(0, 0, 0, 0, 2000));
TestComplete.Wait(new TimeSpan(0, 0, 0, 0, 2000));
if (TestStatus.IsSet == false)
if (TestComplete.IsSet == false)
{
throw new TimeoutException("Test timed out.");
}

Просмотреть файл

@ -2,86 +2,64 @@
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Xunit;
using Xunit.Abstractions;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests.Mq
{
public class MqTestsBase : IDisposable
public class MqTestsBase : TestBase
{
private Random _random = new Random();
public ITestOutputHelper Output;
public MqServer<SimpleMqSession, MqConfig> Server { get; protected set; }
public MqClient<SimpleMqSession, MqConfig> Client { get; protected set; }
public int Port { get; }
protected MqConfig Config;
protected MqConfig ClientConfig;
protected MqConfig ServerConfig;
public Exception LastException { get; set; }
public TimeSpan TestTimeout { get; set; } = new TimeSpan(0, 0, 0, 0, 2000);
public ManualResetEventSlim TestStatus { get; set; } = new ManualResetEventSlim(false);
public MqTestsBase(ITestOutputHelper output)
public override void Init()
{
Output = output;
Port = FreeTcpPort();
base.Init();
Config = new MqConfig
ClientConfig = new MqConfig
{
Ip = "127.0.0.1",
Port = Port
Address = $"127.0.0.1:{Port}",
};
Server = new MqServer<SimpleMqSession, MqConfig>(Config);
Client = CreateClient(Config);
}
public MqClient<SimpleMqSession, MqConfig> CreateClient(MqConfig config)
ServerConfig = new MqConfig
{
return new MqClient<SimpleMqSession, MqConfig>(config);
Address = $"127.0.0.1:{Port}"
};
Server = new MqServer<SimpleMqSession, MqConfig>(ServerConfig);
Client = CreateClient(ClientConfig);
}
public static int FreeTcpPort()
{
TcpListener l = new TcpListener(IPAddress.Loopback, 0);
l.Start();
int port = ((IPEndPoint) l.LocalEndpoint).Port;
l.Stop();
return port;
}
public void StartAndWait(bool timeoutError = true, int timeoutLength = -1, bool startServer = true, bool startClient = true)
{
if (startServer && Server.IsRunning == false)
{
if (startServer)
Server.Start();
}
if (startClient && Client.IsRunning == false)
{
if (startClient)
Client.Connect();
base.StartAndWait(timeoutError, timeoutLength);
}
timeoutLength = timeoutLength != -1 ? timeoutLength : (int) TestTimeout.TotalMilliseconds;
TestStatus.Wait(new TimeSpan(0, 0, 0, 0, timeoutLength));
if (timeoutError && TestStatus.IsSet == false)
protected override void StopClientServer()
{
throw new TimeoutException("Test timed out.");
}
if (LastException != null)
{
throw LastException;
}
try
{
Server.Stop();
}
catch
{
// ignored
}
try
{
Client.Close();
}
catch
@ -90,30 +68,15 @@ namespace DtronixMessageQueue.Tests.Mq
}
}
public void CompareMessages(MqMessage expected, MqMessage actual)
{
try
{
// Total frame count comparison.
Assert.Equal(expected.Count, actual.Count);
for (int i = 0; i < expected.Count; i++)
public MqClient<SimpleMqSession, MqConfig> CreateClient(MqConfig config)
{
// Frame length comparison.
Assert.Equal(expected[i].DataLength, actual[i].DataLength);
Assert.Equal(expected[i].Buffer, actual[i].Buffer);
}
}
catch (Exception e)
{
LastException = e;
}
return new MqClient<SimpleMqSession, MqConfig>(config);
}
public MqMessage GenerateRandomMessage(int frames = -1, int frameLength = -1)
{
var frameCount = frames == -1 ? _random.Next(8, 16) : frames;
var frameCount = frames == -1 ? Random.Next(8, 16) : frames;
var message = new MqMessage();
for (int i = 0; i < frameCount; i++)
{
@ -121,13 +84,13 @@ namespace DtronixMessageQueue.Tests.Mq
if (frameLength == -1)
{
frame = new MqFrame(Utilities.SequentialBytes(_random.Next(50, 1024 * 16 - 3)),
(i + 1 < frameCount) ? MqFrameType.More : MqFrameType.Last, Config);
frame = new MqFrame(Utilities.SequentialBytes(Random.Next(50, 1024 * 16 - 3)),
(i + 1 < frameCount) ? MqFrameType.More : MqFrameType.Last, ClientConfig);
}
else
{
frame = new MqFrame(Utilities.SequentialBytes(frameLength),
(i + 1 < frameCount) ? MqFrameType.More : MqFrameType.Last, Config);
(i + 1 < frameCount) ? MqFrameType.More : MqFrameType.Last, ClientConfig);
}
message.Add(frame);
}
@ -135,23 +98,5 @@ namespace DtronixMessageQueue.Tests.Mq
return message;
}
public void Dispose()
{
try
{
Server.Stop();
}
catch
{
}
try
{
Client.Close();
}
catch
{
}
}
}
}

Просмотреть файл

@ -1,14 +0,0 @@
using Xunit.Abstractions;
namespace DtronixMessageQueue.Tests
{
public class PerformanceTests
{
private ITestOutputHelper _output;
public PerformanceTests(ITestOutputHelper output)
{
_output = output;
}
}
}

Просмотреть файл

@ -1,28 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using Xunit.Sdk;
namespace DtronixMessageQueue.Tests
{
public class RepeatAttribute : DataAttribute
{
private readonly int _count;
public RepeatAttribute(int count)
{
if (count < 1)
{
throw new ArgumentOutOfRangeException(nameof(count),
"Repeat count must be greater than 0.");
}
_count = count;
}
public override IEnumerable<object[]> GetData(MethodInfo testMethod)
{
return Enumerable.Repeat(new object[0], _count);
}
}
}

Просмотреть файл

@ -1,18 +1,14 @@
using System;
using System.Diagnostics;
using System.Threading;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
using DtronixMessageQueue.Tests.Rpc.Services.Server;
using Xunit;
using Xunit.Abstractions;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests.Rpc
{
public class RpcClientTests : RpcTestsBase
{
public RpcClientTests(ITestOutputHelper output) : base(output)
{
}
public class Test
{
@ -20,7 +16,7 @@ namespace DtronixMessageQueue.Tests.Rpc
public int Length { get; set; }
}
[Fact]
[Test]
public void Client_calls_proxy_method()
{
Server.SessionSetup += (sender, args) => { args.Session.AddService(new CalculatorService()); };
@ -41,13 +37,13 @@ namespace DtronixMessageQueue.Tests.Rpc
LastException = new Exception("Service returned wrong result.");
}
TestStatus.Set();
TestComplete.Set();
};
StartAndWait();
}
[Fact]
[Test]
public void Client_calls_proxy_method_sequential()
{
Server.SessionSetup += (sender, args) => { args.Session.AddService(new CalculatorService()); };
@ -60,19 +56,30 @@ namespace DtronixMessageQueue.Tests.Rpc
Stopwatch stopwatch = Stopwatch.StartNew();
int addedInt = 0;
for (int i = 0; i < 10; i++)
int totalAdds = 50;
for (int i = 0; i < totalAdds; i++)
{
addedInt = service.Add(addedInt, 1);
}
Output.WriteLine($"{stopwatch.ElapsedMilliseconds}");
TestStatus.Set();
try
{
Assert.AreEqual(totalAdds, addedInt);
TestComplete.Set();
}
catch (Exception e)
{
LastException = e;
}
};
StartAndWait();
}
[Fact]
[Test]
public void Client_calls_proxy_method_and_canceles()
{
Server.SessionSetup += (sender, args) =>
@ -80,7 +87,7 @@ namespace DtronixMessageQueue.Tests.Rpc
var service = new CalculatorService();
args.Session.AddService<ICalculatorService>(service);
service.LongRunningTaskCanceled += (o, eventArgs) => { TestStatus.Set(); };
service.LongRunningTaskCanceled += (o, eventArgs) => { TestComplete.Set(); };
};
@ -111,19 +118,19 @@ namespace DtronixMessageQueue.Tests.Rpc
StartAndWait();
}
[Fact]
[Test]
public void Server_requests_authentication()
{
Server.Config.RequireAuthentication = true;
Client.Authenticate += (sender, e) => { TestStatus.Set(); };
Client.Authenticate += (sender, e) => { TestComplete.Set(); };
StartAndWait();
}
[Fact]
[Test]
public void Server_does_not_request_authentication()
{
Server.Config.RequireAuthentication = false;
@ -145,7 +152,7 @@ namespace DtronixMessageQueue.Tests.Rpc
{
LastException = new Exception("Client authenticated.");
}
TestStatus.Set();
TestComplete.Set();
};
@ -153,7 +160,7 @@ namespace DtronixMessageQueue.Tests.Rpc
}
[Fact]
[Test]
public void Server_verifies_authentication()
{
var authData = new byte[] {1, 2, 3, 4, 5};
@ -167,7 +174,7 @@ namespace DtronixMessageQueue.Tests.Rpc
{
try
{
Assert.Equal(authData, e.AuthData);
Assert.AreEqual(authData, e.AuthData);
}
catch (Exception ex)
{
@ -175,7 +182,7 @@ namespace DtronixMessageQueue.Tests.Rpc
}
finally
{
TestStatus.Set();
TestComplete.Set();
}
};
@ -185,7 +192,7 @@ namespace DtronixMessageQueue.Tests.Rpc
StartAndWait();
}
[Fact]
[Test]
public void Server_disconnectes_from_failed_authentication()
{
Server.Config.RequireAuthentication = true;
@ -197,11 +204,11 @@ namespace DtronixMessageQueue.Tests.Rpc
Server.Closed += (sender, e) =>
{
if (e.CloseReason != SocketCloseReason.AuthenticationFailure)
if (e.CloseReason != CloseReason.AuthenticationFailure)
{
LastException = new Exception("Server closed session for invalid reason");
}
TestStatus.Set();
TestComplete.Set();
};
Client.Authenticate += (sender, e) => { e.AuthData = new byte[] {5, 4, 3, 2, 1}; };
@ -209,7 +216,7 @@ namespace DtronixMessageQueue.Tests.Rpc
StartAndWait();
}
[Fact]
[Test]
public void Client_disconnectes_from_failed_authentication()
{
Server.Config.RequireAuthentication = true;
@ -221,11 +228,11 @@ namespace DtronixMessageQueue.Tests.Rpc
Client.Closed += (sender, e) =>
{
if (e.CloseReason != SocketCloseReason.AuthenticationFailure)
if (e.CloseReason != CloseReason.AuthenticationFailure)
{
LastException = new Exception("Server closed session for invalid reason");
}
TestStatus.Set();
TestComplete.Set();
};
Client.Authenticate += (sender, e) => { e.AuthData = new byte[] {5, 4, 3, 2, 1}; };
@ -234,10 +241,10 @@ namespace DtronixMessageQueue.Tests.Rpc
}
[Fact]
[Test]
public void Client_notified_of_authentication_success()
{
Server.Config.RequireAuthentication = true;
ServerConfig.RequireAuthentication = true;
Server.SessionSetup +=
(sender, args) => { args.Session.AddService<ICalculatorService>(new CalculatorService()); };
@ -250,7 +257,7 @@ namespace DtronixMessageQueue.Tests.Rpc
{
LastException = new Exception("Client notified of authentication wrongly.");
}
TestStatus.Set();
TestComplete.Set();
};
Client.Authenticate += (sender, e) => { e.AuthData = new byte[] {5, 4, 3, 2, 1}; };
@ -258,7 +265,7 @@ namespace DtronixMessageQueue.Tests.Rpc
StartAndWait();
}
[Fact]
[Test]
public void Client_times_out_on_long_auth()
{
Server.Config.RequireAuthentication = true;
@ -266,44 +273,20 @@ namespace DtronixMessageQueue.Tests.Rpc
Client.Closed += (sender, e) =>
{
if (e.CloseReason != SocketCloseReason.TimeOut)
if (e.CloseReason != CloseReason.TimeOut)
{
LastException = new Exception("Client was not notified that the authentication failed.");
}
TestStatus.Set();
TestComplete.Set();
};
Server.Authenticate += (sender, e) => { Thread.Sleep(500); };
StartAndWait(true, 5000, true);
StartAndWait(true, 5000);
}
[Fact]
public void Client_does_not_ready_before_server_authenticates()
{
Server.Config.RequireAuthentication = true;
Server.Authenticate += (sender, args) =>
{
args.Authenticated = true;
Thread.Sleep(200);
};
Client.Ready += (sender, args) =>
{
if (!args.Session.Authenticated)
{
LastException = new Exception("Client ready event called while authentication failed.");
}
TestStatus.Set();
};
Client.Authenticate += (sender, e) => { e.AuthData = new byte[] {5, 4, 3, 2, 1}; };
StartAndWait();
}
[Fact]
[Test]
public void Client_connects_disconnects_and_reconnects()
{
Server.Config.RequireAuthentication = false;
@ -314,7 +297,7 @@ namespace DtronixMessageQueue.Tests.Rpc
{
if (++connectedTimes == 5)
{
TestStatus.Set();
TestComplete.Set();
}
else
{
@ -324,7 +307,7 @@ namespace DtronixMessageQueue.Tests.Rpc
Client.Closed += (sender, args) =>
{
if (!TestStatus.IsSet)
if (!TestComplete.IsSet)
{
Client.Connect();
}

Просмотреть файл

@ -3,113 +3,75 @@ using System.Net;
using System.Net.Sockets;
using System.Threading;
using DtronixMessageQueue.Rpc;
using Xunit;
using Xunit.Abstractions;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests.Rpc
{
public class RpcTestsBase : IDisposable
public class RpcTestsBase : TestBase
{
private Random _random = new Random();
public ITestOutputHelper Output;
public RpcServer<SimpleRpcSession, RpcConfig> Server { get; protected set; }
public RpcClient<SimpleRpcSession, RpcConfig> Client { get; protected set; }
public int Port { get; }
protected RpcConfig Config;
protected RpcConfig ClientConfig;
protected RpcConfig ServerConfig;
public Exception LastException { get; set; }
public TimeSpan TestTimeout { get; set; } = new TimeSpan(0, 0, 0, 0, 5000);
public ManualResetEventSlim TestStatus { get; set; } = new ManualResetEventSlim(false);
public RpcTestsBase(ITestOutputHelper output)
public override void Init()
{
Output = output;
Port = FreeTcpPort();
base.Init();
Config = new RpcConfig
ClientConfig = new RpcConfig
{
Ip = "127.0.0.1",
Port = Port
Address = $"127.0.0.1:{Port}",
};
Server = new RpcServer<SimpleRpcSession, RpcConfig>(Config, null);
Client = new RpcClient<SimpleRpcSession, RpcConfig>(Config);
ServerConfig = new RpcConfig
{
Address = $"127.0.0.1:{Port}",
};
Server = new RpcServer<SimpleRpcSession, RpcConfig>(ServerConfig);
Client = new RpcClient<SimpleRpcSession, RpcConfig>(ClientConfig);
}
public static int FreeTcpPort()
{
TcpListener l = new TcpListener(IPAddress.Loopback, 0);
l.Start();
int port = ((IPEndPoint) l.LocalEndpoint).Port;
l.Stop();
return port;
}
public void StartAndWait(bool timeoutError = true, int timeoutLength = -1, bool startServer = true)
{
if (Server.IsRunning == false && startServer)
{
Server.Start();
}
if (Client.IsRunning == false)
{
Client.Connect();
}
timeoutLength = timeoutLength != -1 ? timeoutLength : (int) TestTimeout.TotalMilliseconds;
TestStatus.Wait(new TimeSpan(0, 0, 0, 0, timeoutLength));
if (timeoutError && TestStatus.IsSet == false)
protected override void StopClientServer()
{
throw new TimeoutException("Test timed out.");
}
if (LastException != null)
{
throw LastException;
}
try
{
Server.Stop();
}
catch
{
}
try
{
Client.Close();
}
catch
{
// ignored
}
}
public void CompareMessages(MqMessage expected, MqMessage actual)
{
try
{
// Total frame count comparison.
Assert.Equal(expected.Count, actual.Count);
for (int i = 0; i < expected.Count; i++)
public void StartAndWait(bool timeoutError = true, int timeoutLength = -1, bool startServer = true, bool startClient = true)
{
// Frame length comparison.
Assert.Equal(expected[i].DataLength, actual[i].DataLength);
Assert.Equal(expected[i].Buffer, actual[i].Buffer);
}
}
catch (Exception e)
{
LastException = e;
}
if (startServer)
Server.Start();
if (startClient)
Client.Connect();
base.StartAndWait(timeoutError, timeoutLength);
}
public MqMessage GenerateRandomMessage(int frames = -1, int frameLength = -1)
{
var frameCount = frames == -1 ? _random.Next(8, 16) : frames;
var frameCount = frames == -1 ? Random.Next(8, 16) : frames;
var message = new MqMessage();
for (int i = 0; i < frameCount; i++)
{
@ -117,37 +79,18 @@ namespace DtronixMessageQueue.Tests.Rpc
if (frameLength == -1)
{
frame = new MqFrame(Utilities.SequentialBytes(_random.Next(50, 1024 * 16 - 3)),
(i + 1 < frameCount) ? MqFrameType.More : MqFrameType.Last, Config);
frame = new MqFrame(Utilities.SequentialBytes(Random.Next(50, 1024 * 16 - 3)),
(i + 1 < frameCount) ? MqFrameType.More : MqFrameType.Last, ClientConfig);
}
else
{
frame = new MqFrame(Utilities.SequentialBytes(frameLength),
(i + 1 < frameCount) ? MqFrameType.More : MqFrameType.Last, Config);
(i + 1 < frameCount) ? MqFrameType.More : MqFrameType.Last, ClientConfig);
}
message.Add(frame);
}
return message;
}
public void Dispose()
{
try
{
Server.Stop();
}
catch
{
}
try
{
Client.Close();
}
catch
{
}
}
}
}

Просмотреть файл

@ -0,0 +1,112 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests
{
public abstract class TestBase : IDisposable
{
protected Random Random = new Random();
private Exception _lastException;
public static int Port { get; private set; }
public static bool IsMono => Type.GetType("Mono.Runtime") != null;
public Exception LastException
{
get => _lastException;
set
{
_lastException = value;
TestComplete.Set();
}
}
public TimeSpan TestTimeout { get; } = new TimeSpan(0, 0, 0, 0, 2000);
public ManualResetEventSlim TestComplete { get; private set; }
static TestBase()
{
}
[SetUp]
public virtual void Init()
{
TestComplete = new ManualResetEventSlim(false);
_lastException = null;
Port = FreeTcpPort();
}
public static int FreeTcpPort()
{
TcpListener l = new TcpListener(IPAddress.Loopback, 0);
l.Start();
int port = ((IPEndPoint)l.LocalEndpoint).Port;
l.Stop();
return port;
}
protected abstract void StopClientServer();
protected void StartAndWait(bool timeoutError = true, int timeoutLength = -1)
{
timeoutLength = timeoutLength != -1 ? timeoutLength : (int)TestTimeout.TotalMilliseconds;
#if false
timeoutLength = 100000;
#endif
TestComplete.Wait(TimeSpan.FromMilliseconds(timeoutLength));
if (timeoutError && TestComplete.IsSet == false)
{
throw new TimeoutException("Test timed out.");
}
if (LastException != null)
{
throw LastException;
}
StopClientServer();
}
public void CompareMessages(MqMessage expected, MqMessage actual)
{
try
{
// Total frame count comparison.
Assert.AreEqual(expected.Count, actual.Count);
for (int i = 0; i < expected.Count; i++)
{
// Frame length comparison.
Assert.AreEqual(expected[i].DataLength, actual[i].DataLength);
Assert.AreEqual(expected[i].Buffer, actual[i].Buffer);
}
}
catch (Exception e)
{
LastException = e;
}
}
[TearDown]
public void Dispose()
{
TestComplete?.Dispose();
StopClientServer();
}
}
}

Просмотреть файл

@ -1,5 +1,5 @@
using System;
using Xunit;
using NUnit.Framework;
namespace DtronixMessageQueue.Tests
{
@ -10,8 +10,8 @@ namespace DtronixMessageQueue.Tests
if (expected == null) throw new ArgumentNullException(nameof(expected));
if (actual == null) throw new ArgumentNullException(nameof(actual));
Assert.Equal(expected.FrameType, actual.FrameType);
Assert.Equal(expected.Buffer, actual.Buffer);
Assert.AreEqual(expected.FrameType, actual.FrameType);
Assert.AreEqual(expected.Buffer, actual.Buffer);
}
public static byte[] SequentialBytes(int len)

Просмотреть файл

@ -1,12 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NuGet.CommandLine" version="4.1.0" targetFramework="net45" developmentDependency="true" />
<package id="xunit" version="2.2.0-beta2-build3300" targetFramework="net45" />
<package id="xunit.abstractions" version="2.0.1" targetFramework="net45" />
<package id="xunit.assert" version="2.2.0-beta2-build3300" targetFramework="net45" />
<package id="xunit.core" version="2.2.0-beta2-build3300" targetFramework="net45" />
<package id="xunit.extensibility.core" version="2.2.0-beta2-build3300" targetFramework="net45" />
<package id="xunit.extensibility.execution" version="2.2.0-beta2-build3300" targetFramework="net45" />
<package id="xunit.runner.console" version="2.1.0" targetFramework="net45" />
<package id="xunit.runner.visualstudio" version="2.2.0-beta2-build1149" targetFramework="net45" developmentDependency="true" />
<package id="NuGet.CommandLine" version="4.3.0" targetFramework="net45" developmentDependency="true" />
<package id="NUnit" version="3.8.1" targetFramework="net45" />
<package id="NUnit.ConsoleRunner" version="3.7.0" targetFramework="net45" />
<package id="NUnit3TestAdapter" version="3.8.0" targetFramework="net45" />
</packages>

Просмотреть файл

@ -1,9 +1,9 @@
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue
{
/// <summary>
/// CloseReason enum
/// </summary>
public enum SocketCloseReason : byte
public enum CloseReason : byte
{
/// <summary>
/// The socket is closed for unknown reason
@ -18,12 +18,7 @@
/// <summary>
/// The client close the socket
/// </summary>
ClientClosing = 2,
/// <summary>
/// The server side close the socket
/// </summary>
ServerClosing = 3,
Closing = 2,
/// <summary>
/// Application error

Просмотреть файл

@ -32,8 +32,8 @@
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="protobuf-net, Version=2.3.0.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
<HintPath>..\packages\protobuf-net.2.3.0\lib\net40\protobuf-net.dll</HintPath>
<Reference Include="protobuf-net, Version=2.3.2.0, Culture=neutral, PublicKeyToken=257b51d87d2e4d67, processorArchitecture=MSIL">
<HintPath>..\packages\protobuf-net.2.3.2\lib\net40\protobuf-net.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Configuration" />
@ -46,6 +46,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="MemoryQueueBufferStream.cs" />
<Compile Include="MqCommandType.cs" />
<Compile Include="MqMessageReader.cs" />
<Compile Include="MqMessageWriter.cs" />
@ -69,19 +70,19 @@
<Compile Include="Rpc\RpcServer.cs" />
<Compile Include="Rpc\RpcSession.cs" />
<Compile Include="Rpc\SerializationCache.cs" />
<Compile Include="ServiceMethodCache.cs" />
<Compile Include="Socket\BufferManager.cs" />
<Compile Include="Socket\ISetupSocketSession.cs" />
<Compile Include="Socket\SessionEventArgs.cs" />
<Compile Include="Socket\SessionClosedEventArgs.cs" />
<Compile Include="Socket\SocketAsyncEventArgsManager.cs" />
<Compile Include="Socket\SessionHandler.cs" />
<Compile Include="Socket\SocketClient.cs" />
<Compile Include="Socket\SocketCloseReason.cs" />
<Compile Include="Socket\SocketConfig.cs" />
<Compile Include="Socket\SocketMode.cs" />
<Compile Include="Socket\SocketServer.cs" />
<Compile Include="Socket\SocketSession.cs" />
<Compile Include="Rpc\ServiceMethodCache.cs" />
<Compile Include="TcpSocket\BufferManager.cs" />
<Compile Include="TcpSocket\ISetupSocketSession.cs" />
<Compile Include="SessionEventArgs.cs" />
<Compile Include="SessionClosedEventArgs.cs" />
<Compile Include="TcpSocket\SocketAsyncEventArgsManager.cs" />
<Compile Include="TcpSocket\TcpSocketHandler.cs" />
<Compile Include="TcpSocket\TcpSocketClient.cs" />
<Compile Include="CloseReason.cs" />
<Compile Include="TcpSocket\TcpSocketConfig.cs" />
<Compile Include="TcpSocket\TcpSocketMode.cs" />
<Compile Include="TcpSocket\TcpSocketServer.cs" />
<Compile Include="TcpSocket\TcpSocketSession.cs" />
<Compile Include="Utilities.cs" />
<Content Include="DtronixMessageQueue.nuspec">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>

Просмотреть файл

@ -0,0 +1,169 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DtronixMessageQueue
{
/// <summary>
/// This stream maintains data only until the data is read, then it is purged from the stream.
/// </summary>
public class MemoryQueueBufferStream : Stream
{
public override bool CanSeek => false;
/// <summary>
/// Always returns 0
/// </summary>
public override long Position {
get => 0;
set => throw new NotSupportedException(GetType().Name + " is not seekable");
}
public override bool CanWrite => true;
public override bool CanRead => true;
public override long Length {
get {
if (_buffer == null)
{
return 0;
}
if (_buffer.Count == 0)
{
return 0;
}
return _buffer.Sum(b => b.Data.Length - b.ChunkReadStartIndex);
}
}
/// <summary>
/// Represents a single write into the MemoryQueueBufferStream. Each write is a separate chunk
/// </summary>
private class Chunk
{
/// <summary>
/// As we read through the chunk, the start index will increment. When we get to the end of the chunk,
/// we will remove the chunk
/// </summary>
public int ChunkReadStartIndex { get; set; }
/// <summary>
/// Actual Data
/// </summary>
public byte[] Data { get; set; }
}
//Maintains the streams data. The Queue object provides an easy and efficient way to add and remove data
//Each item in the queue represents each write to the stream. Every call to write translates to an item in the queue
private readonly Queue<Chunk> _buffer;
public MemoryQueueBufferStream()
{
_buffer = new Queue<Chunk>();
}
/// <summary>
/// Reads up to count bytes from the stream, and removes the read data from the stream.
/// </summary>
/// <param name="buffer"></param>
/// <param name="offset"></param>
/// <param name="count"></param>
/// <returns></returns>
public override int Read(byte[] buffer, int offset, int count)
{
var remainingBytesToRead = count;
var totalBytesRead = 0;
//Read until we hit the requested count, or until we hav nothing left to read
while (totalBytesRead <= count && _buffer.Count > 0)
{
//Get first chunk from the queue
var chunk = _buffer.Peek();
//Determine how much of the chunk there is left to read
var unreadChunkLength = chunk.Data.Length - chunk.ChunkReadStartIndex;
//Determine how much of the unread part of the chunk we can actually read
var bytesToRead = Math.Min(unreadChunkLength, remainingBytesToRead);
if (bytesToRead > 0)
{
//Read from the chunk into the buffer
Buffer.BlockCopy(chunk.Data, chunk.ChunkReadStartIndex, buffer, offset + totalBytesRead, bytesToRead);
totalBytesRead += bytesToRead;
remainingBytesToRead -= bytesToRead;
//If the entire chunk has been read, remove it
if (chunk.ChunkReadStartIndex + bytesToRead >= chunk.Data.Length)
{
_buffer.Dequeue();
}
else
{
//Otherwise just update the chunk read start index, so we know where to start reading on the next call
chunk.ChunkReadStartIndex = chunk.ChunkReadStartIndex + bytesToRead;
}
}
else
{
break;
}
}
return totalBytesRead;
}
/// <summary>
/// Writes data to the stream
/// </summary>
/// <param name="buffer">Data to copy into the stream</param>
/// <param name="offset"></param>
/// <param name="count"></param>
public override void Write(byte[] buffer, int offset, int count)
{
//We don't want to use the buffer passed in, as it could be altered by the caller
var bufSave = new byte[count];
Buffer.BlockCopy(buffer, offset, bufSave, 0, count);
//Add the data to the queue
_buffer.Enqueue(new Chunk { ChunkReadStartIndex = 0, Data = bufSave });
}
/// <summary>
/// Adds the passed buffer to the steam.
/// </summary>
/// <param name="buffer">Data to add to the stream</param>
public void Write(byte[] buffer)
{
//Add the data to the queue
_buffer.Enqueue(new Chunk { ChunkReadStartIndex = 0, Data = buffer });
}
public override long Seek(long offset, SeekOrigin origin)
{
throw new NotSupportedException(GetType().Name + " is not seekable");
}
public override void SetLength(long value)
{
throw new NotSupportedException(GetType().Name + " length can not be changed");
}
public override void Flush()
{
}
}
}

Просмотреть файл

@ -1,6 +1,6 @@
using System;
using System.Threading;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue
@ -10,7 +10,7 @@ namespace DtronixMessageQueue
/// </summary>
/// <typeparam name="TSession">Session type for this connection.</typeparam>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
public class MqClient<TSession, TConfig> : SocketClient<TSession, TConfig>
public class MqClient<TSession, TConfig> : TcpSocketClient<TSession, TConfig>
where TSession : MqSession<TSession, TConfig>, new()
where TConfig : MqConfig
{
@ -54,7 +54,7 @@ namespace DtronixMessageQueue
base.OnConnect(session);
}
protected override void OnClose(TSession session, SocketCloseReason reason)
protected override void OnClose(TSession session, CloseReason reason)
{
// Stop the timeout timer.
_pingTimer.Change(Timeout.Infinite, Timeout.Infinite);
@ -117,7 +117,7 @@ namespace DtronixMessageQueue
return;
}
Session.IncomingMessage -= OnIncomingMessage;
Session.Close(SocketCloseReason.ClientClosing);
Session.Close(CloseReason.Closing);
Session.Dispose();
}

Просмотреть файл

@ -1,8 +1,8 @@
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue
{
public class MqConfig : SocketConfig
public class MqConfig : TcpSocketConfig
{
/// <summary>
/// Max size of the frame. Needs to be equal or smaller than SendAndReceiveBufferSize.

Просмотреть файл

@ -10,11 +10,6 @@ namespace DtronixMessageQueue
/// </summary>
public class MqFrameBuilder : IDisposable
{
/// <summary>
/// Byte buffer used to maintain and parse the passed buffers.
/// </summary>
private readonly byte[] _internalBuffer;
/// <summary>
/// Data for this frame
/// </summary>
@ -25,25 +20,10 @@ namespace DtronixMessageQueue
/// </summary>
private MqFrameType _currentFrameType;
/// <summary>
/// Reading position in the internal buffer. Set by the internal reader.
/// </summary>
private int _readPosition;
/// <summary>
/// Writing position in the internal buffer. Set by the internal writer.
/// </summary>
private int _writePosition;
/// <summary>
/// Total length of the internal buffer's data. Set by the reader and writer.
/// </summary>
private int _streamLength;
/// <summary>
/// Memory stream used to read and write to the internal buffer.
/// </summary>
private readonly MemoryStream _bufferStream;
private readonly MemoryQueueBufferStream _bufferStream;
/// <summary>
/// Used to cache the maximum size of the MqFrameType.
@ -55,16 +35,14 @@ namespace DtronixMessageQueue
/// </summary>
private readonly MqConfig _config;
public Queue<MqFrame> Frames { get; }
/// <summary>
/// Size in bytes of the header of a frame.
/// MqFrameType:byte[1], Length:UInt16[2]
/// </summary>
public const int HeaderLength = 3;
/// <summary>
/// Parsed frames from the incoming stream.
/// </summary>
public Queue<MqFrame> Frames { get; } = new Queue<MqFrame>();
/// <summary>
/// Creates a new instance of the frame builder to handle parsing of incoming byte stream.
@ -73,116 +51,23 @@ namespace DtronixMessageQueue
public MqFrameBuilder(MqConfig config)
{
_config = config;
_internalBuffer = new byte[(config.FrameBufferSize + MqFrame.HeaderLength) * 2 ];
Frames = new Queue<MqFrame>();
_bufferStream = new MemoryQueueBufferStream();
// Determine what our max enum value is for the FrameType
if (_maxTypeEnum == -1)
{
_maxTypeEnum = Enum.GetValues(typeof(MqFrameType)).Cast<byte>().Max();
}
_bufferStream = new MemoryStream(_internalBuffer, 0, _internalBuffer.Length, true, true);
}
/// <summary>
/// Reads from the internal stream.
/// </summary>
/// <param name="buffer">Byte buffer to read into.</param>
/// <param name="offset">Offset position in the buffer to copy from.</param>
/// <param name="count">Number of bytes to attempt to read.</param>
/// <returns>Total bytes that were read.</returns>
private int ReadInternal(byte[] buffer, int offset, int count)
{
_bufferStream.Position = _readPosition;
var length = _bufferStream.Read(buffer, offset, count);
_readPosition += length;
// Update the stream length
_streamLength = _writePosition - _readPosition;
return length;
}
/// <summary>
/// Writes to the internal stream from the specified buffer.
/// </summary>
/// <param name="buffer">Buffer to write from.</param>
/// <param name="offset">Offset position in the buffer copy from.</param>
/// <param name="count">Number of bytes to copy from the write_buffer.</param>
private void WriteInternal(byte[] buffer, int offset, int count)
{
_bufferStream.Position = _writePosition;
try
{
_bufferStream.Write(buffer, offset, count);
}
catch (Exception e)
{
throw new InvalidDataException("FrameBuilder was sent a frame larger than the session allows.", e);
}
_writePosition += count;
// Update the stream length
_streamLength = _writePosition - _readPosition;
}
/// <summary>
/// Moves the internal buffer stream from the read position to the end, to the beginning.
/// Frees up space to write in the buffer.
/// </summary>
private void MoveStreamBytesToBeginning()
{
var i = 0;
for (; i < _writePosition - _readPosition; i++)
{
_internalBuffer[i] = _internalBuffer[i + _readPosition];
}
// Update the length for the new size.
_bufferStream.SetLength(i);
//buffer_stream.Position -= write_position;
// Reset the internal writer and reader positions.
_streamLength = _writePosition = i;
_readPosition = 0;
}
/// <summary>
/// Writes the specified bytes to the FrameBuilder and parses them as they are copied.
/// Writes the specified bytes to the FrameBuilder and parses them as they are read.
/// </summary>
/// <param name="buffer">Byte buffer to write and parse.</param>
/// <param name="offset">Offset in the byte buffer to copy from.</param>
/// <param name="count">Number of bytes to write into the builder.</param>
public void Write(byte[] buffer, int offset, int count)
public void Write(byte[] buffer)
{
while (count > 0)
{
int maxWrite = count;
// If we are over the byte limitation, then move the buffer back to the beginning of the stream and reset the stream.
if (count + _writePosition > _internalBuffer.Length)
{
MoveStreamBytesToBeginning();
maxWrite = Math.Min(Math.Abs(count - _writePosition), count);
}
WriteInternalPart(buffer, offset, maxWrite);
offset += maxWrite;
count -= maxWrite;
//count
}
}
/// <summary>
/// Writes the specified partial bytes to the FrameBuilder and parses them as they are copied.
/// </summary>
/// <param name="buffer">Byte buffer to write and parse.</param>
/// <param name="offset">Offset in the byte buffer to copy from.</param>
/// <param name="count">Number of bytes to write into the builder.</param>
private void WriteInternalPart(byte[] buffer, int offset, int count)
{
// Write the incoming bytes to the stream.
WriteInternal(buffer, offset, count);
_bufferStream.Write(buffer);
// Loop until we require more data
while (true)
@ -192,7 +77,7 @@ namespace DtronixMessageQueue
var frameTypeBytes = new byte[1];
// This will always return one byte.
ReadInternal(frameTypeBytes, 0, 1);
_bufferStream.Read(frameTypeBytes, 0, 1);
if (frameTypeBytes[0] > _maxTypeEnum)
{
@ -208,15 +93,15 @@ namespace DtronixMessageQueue
_currentFrameType == MqFrameType.Ping)
{
EnqueueAndReset();
break;
continue;
}
// Read the length from the stream if there are enough buffer.
if (_currentFrameData == null && _streamLength >= 2)
if (_currentFrameData == null && _bufferStream.Length >= 2)
{
var frameLen = new byte[2];
ReadInternal(frameLen, 0, frameLen.Length);
_bufferStream.Read(frameLen, 0, frameLen.Length);
var currentFrameLength = BitConverter.ToUInt16(frameLen, 0);
if (currentFrameLength < 1)
@ -225,7 +110,7 @@ namespace DtronixMessageQueue
$"FrameBuilder was sent a frame with an invalid size of {currentFrameLength}");
}
if (currentFrameLength > _internalBuffer.Length)
if (currentFrameLength > _config.FrameBufferSize)
{
throw new InvalidDataException(
$"Frame size is {currentFrameLength} while the maximum size for frames is 16KB.");
@ -237,15 +122,15 @@ namespace DtronixMessageQueue
}
// Read the data into the frame holder.
if (_currentFrameData != null && _streamLength >= _currentFrameData.Length)
if (_currentFrameData != null && _bufferStream.Length >= _currentFrameData.Length)
{
ReadInternal(_currentFrameData, 0, _currentFrameData.Length);
_bufferStream.Read(_currentFrameData, 0, _currentFrameData.Length);
// Create the frame and enqueue it.
EnqueueAndReset();
// If we are at the end of the data, complete this loop and wait for more data.
if (_writePosition == _readPosition)
if (_bufferStream.Length == 0)
{
break;
}

Просмотреть файл

@ -1,5 +1,5 @@
using System;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue
{
@ -8,7 +8,7 @@ namespace DtronixMessageQueue
/// </summary>
/// <typeparam name="TSession">Session type for this connection.</typeparam>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
public class MqServer<TSession, TConfig> : SocketServer<TSession, TConfig>
public class MqServer<TSession, TConfig> : TcpSocketServer<TSession, TConfig>
where TSession : MqSession<TSession, TConfig>, new()
where TConfig : MqConfig
{
@ -52,7 +52,7 @@ namespace DtronixMessageQueue
/// </summary>
/// <param name="session">Session which closed.</param>
/// <param name="reason">Reason the session closed.</param>
protected override void OnClose(TSession session, SocketCloseReason reason)
protected override void OnClose(TSession session, CloseReason reason)
{
session.IncomingMessage -= OnIncomingMessage;
session.Dispose();

Просмотреть файл

@ -3,7 +3,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue
{
@ -12,7 +12,7 @@ namespace DtronixMessageQueue
/// </summary>
/// <typeparam name="TSession">Session type for this connection.</typeparam>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
public abstract class MqSession<TSession, TConfig> : SocketSession<TSession, TConfig>
public abstract class MqSession<TSession, TConfig> : TcpSocketSession<TSession, TConfig>
where TSession : MqSession<TSession, TConfig>, new()
where TConfig : MqConfig
{
@ -111,7 +111,7 @@ namespace DtronixMessageQueue
while (_outbox.TryDequeue(out message))
{
if(CurrentState != State.Closing)
if(CurrentState != State.Closed)
_sendingSemaphore.Release();
message.PrepareSend();
@ -162,15 +162,18 @@ namespace DtronixMessageQueue
if (CurrentState == State.Connected)
_receivingSemaphore.Release();
if (buffer == null)
Close(CloseReason.Closing);
try
{
_frameBuilder.Write(buffer, 0, buffer.Length);
_frameBuilder.Write(buffer);
}
catch (InvalidDataException)
{
//logger.Error(ex, "Connector {0}: Client send invalid data.", Connection.Id);
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
break;
}
@ -184,7 +187,7 @@ namespace DtronixMessageQueue
// Do nothing if this is a ping frame.
if (frame.FrameType == MqFrameType.Ping)
{
if (BaseSocket.Mode == SocketMode.Server)
if (SocketHandler.Mode == TcpSocketMode.Server)
{
// Re-send ping frame back to the client to refresh client connection timeout timer.
Send(CreateFrame(null, MqFrameType.Ping));
@ -242,18 +245,14 @@ namespace DtronixMessageQueue
/// Notifies the recipient connection the reason for the session's closure.
/// </summary>
/// <param name="reason">Reason for closing this session.</param>
public override void Close(SocketCloseReason reason)
{
if (CurrentState == State.Closed)
public override void Close(CloseReason reason)
{
if (CurrentState == State.Closed && reason != CloseReason.ConnectionRefused)
return;
}
MqFrame closeFrame = null;
if (CurrentState == State.Connected || CurrentState == State.Connecting)
if (CurrentState == State.Connected || reason == CloseReason.ConnectionRefused)
{
CurrentState = State.Closing;
closeFrame = CreateFrame(new byte[2], MqFrameType.Command);
closeFrame.Write(0, (byte)0);
@ -278,6 +277,9 @@ namespace DtronixMessageQueue
msg = new MqMessage(closeFrame);
_outbox.Enqueue(msg);
// Take one wait to send the close packet.
_sendingSemaphore.Wait();
// QueueOnce the last bit of data.
ProcessOutbox();
}
@ -352,12 +354,11 @@ namespace DtronixMessageQueue
switch (commandType)
{
case MqCommandType.Disconnect:
CurrentState = State.Closing;
Close((SocketCloseReason)frame.ReadByte(1));
Close((CloseReason)frame.ReadByte(1));
break;
default:
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
break;
}
}
@ -368,7 +369,7 @@ namespace DtronixMessageQueue
/// <returns>String representation.</returns>
public override string ToString()
{
return $"MqSession; Reading {_inboxBytes.Count} byte packets; Sending {_outbox.Count} messages.";
return $"{SocketHandler.Mode} RcpSocketSession; Reading {_inboxBytes.Count} byte packets; Sending {_outbox.Count} messages.";
}

Просмотреть файл

@ -1,5 +1,5 @@
using System.Collections.Generic;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Rpc
{
@ -49,7 +49,7 @@ namespace DtronixMessageQueue.Rpc
{
if (message[0][0] != Id)
{
Session.Close(SocketCloseReason.ProtocolError);
Session.Close(CloseReason.ProtocolError);
}
// Read the type of message.
@ -63,7 +63,7 @@ namespace DtronixMessageQueue.Rpc
}
// Unknown message type passed. Disconnect the connection.
Session.Close(SocketCloseReason.ProtocolError);
Session.Close(CloseReason.ProtocolError);
return false;
}

Просмотреть файл

@ -1,6 +1,6 @@
using System;
using DtronixMessageQueue.Rpc.DataContract;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Rpc
{

Просмотреть файл

@ -19,6 +19,6 @@
/// <summary>
/// Server is sending the result of the authentication request.
/// </summary>
AuthenticationResult = 2,
AuthenticationSuccess = 2,
}
}

Просмотреть файл

@ -1,6 +1,6 @@
using System;
using DtronixMessageQueue.Rpc.DataContract;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Rpc
{
@ -78,12 +78,12 @@ namespace DtronixMessageQueue.Rpc
if (session.LastReceived < timeoutTime)
{
// Check for session timeout
session.Close(SocketCloseReason.TimeOut);
session.Close(CloseReason.TimeOut);
}
else if (session.Authenticated == false && session.ConnectedTime < timeoutTime)
{
// Ensure that failed authentications are removed.
session.Close(SocketCloseReason.AuthenticationFailure);
session.Close(CloseReason.AuthenticationFailure);
}
}
}

Просмотреть файл

@ -4,7 +4,7 @@ using System.Threading;
using System.Threading.Tasks;
using DtronixMessageQueue.Rpc.DataContract;
using DtronixMessageQueue.Rpc.MessageHandlers;
using DtronixMessageQueue.Socket;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Rpc
{
@ -75,10 +75,10 @@ namespace DtronixMessageQueue.Rpc
base.OnSetup();
// Determine if this session is running on the server or client to retrieve the worker thread pool.
if (BaseSocket.Mode == SocketMode.Server)
Server = (RpcServer<TSession, TConfig>) BaseSocket;
if (SocketHandler.Mode == TcpSocketMode.Server)
Server = (RpcServer<TSession, TConfig>) SocketHandler;
else
Client = (RpcClient<TSession, TConfig>) BaseSocket;
Client = (RpcClient<TSession, TConfig>) SocketHandler;
SerializationCache = new SerializationCache(Config);
@ -112,9 +112,9 @@ namespace DtronixMessageQueue.Rpc
// RpcCommand:byte; RpcCommandType:byte; RpcServerInfoDataContract:byte[];
// Ensure that this command is running on the client.
if (BaseSocket.Mode != SocketMode.Client)
if (SocketHandler.Mode != TcpSocketMode.Client)
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
return;
}
@ -131,7 +131,7 @@ namespace DtronixMessageQueue.Rpc
if (Client.ServerInfo == null)
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
return;
}
@ -169,7 +169,7 @@ namespace DtronixMessageQueue.Rpc
}
if (!_authTimeoutCancel.IsCancellationRequested)
Close(SocketCloseReason.TimeOut);
Close(CloseReason.TimeOut);
});
// RpcCommand:byte; RpcCommandType:byte; AuthData:byte[];
@ -194,16 +194,16 @@ namespace DtronixMessageQueue.Rpc
// RpcCommand:byte; RpcCommandType:byte; AuthData:byte[];
// If this is not run on the server, quit.
if (BaseSocket.Mode != SocketMode.Server)
if (SocketHandler.Mode != TcpSocketMode.Server)
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
return;
}
// Ensure that the server requires authentication.
if (Server.Config.RequireAuthentication == false)
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
return;
}
@ -222,18 +222,15 @@ namespace DtronixMessageQueue.Rpc
if (Authenticated == false)
{
Close(SocketCloseReason.AuthenticationFailure);
Close(CloseReason.AuthenticationFailure);
}
else
{
var authFrame = CreateFrame(new byte[authArgs.AuthData.Length + 2], MqFrameType.Command);
authFrame.Write(0, (byte) MqCommandType.RpcCommand);
authFrame.Write(1, (byte) RpcCommandType.AuthenticationResult);
authFrame.Write(1, (byte) RpcCommandType.AuthenticationSuccess);
// State of the authentication
authFrame.Write(2, Authenticated);
// RpcCommand:byte; RpcCommandType:byte; AuthResult:bool;
// RpcCommand:byte; RpcCommandType:byte;
Send(authFrame);
// Alert the server that this session is ready for usage.
@ -241,32 +238,29 @@ namespace DtronixMessageQueue.Rpc
() => { Ready?.Invoke(this, new SessionEventArgs<TSession, TConfig>((TSession) this)); });
}
}
else if (rpcCommandType == RpcCommandType.AuthenticationResult)
else if (rpcCommandType == RpcCommandType.AuthenticationSuccess)
{
// RpcCommand:byte; RpcCommandType:byte; AuthResult:bool;
// RpcCommand:byte; RpcCommandType:byte;
// Cancel the timeout request.
_authTimeoutCancel.Cancel();
// Ensure that this command is running on the client.
if (BaseSocket.Mode != SocketMode.Client)
if (SocketHandler.Mode != TcpSocketMode.Client)
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
return;
}
if (Client.Config.RequireAuthentication == false)
if (Client.ServerInfo.RequireAuthentication == false)
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
return;
}
Authenticated = true;
var authArgs = new RpcAuthenticateEventArgs<TSession, TConfig>((TSession) this)
{
Authenticated = frame.ReadBoolean(2)
};
var authArgs = new RpcAuthenticateEventArgs<TSession, TConfig>((TSession) this);
// Alert the client that the sesion has been authenticated.
AuthenticationSuccess?.Invoke(this, authArgs);
@ -276,12 +270,12 @@ namespace DtronixMessageQueue.Rpc
}
else
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
}
}
catch (Exception)
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
}
}
@ -291,7 +285,7 @@ namespace DtronixMessageQueue.Rpc
protected override void OnConnected()
{
// If this is a new session on the server, send the welcome message.
if (BaseSocket.Mode == SocketMode.Server)
if (SocketHandler.Mode == TcpSocketMode.Server)
{
Server.ServerInfo.RequireAuthentication = Config.RequireAuthentication;
@ -312,7 +306,7 @@ namespace DtronixMessageQueue.Rpc
base.OnConnected();
// If the server does not require authentication, alert the server session that it is ready.
if (BaseSocket.Mode == SocketMode.Server && Config.RequireAuthentication == false)
if (SocketHandler.Mode == TcpSocketMode.Server && Config.RequireAuthentication == false)
{
Authenticated = true;
Ready?.Invoke(this, new SessionEventArgs<TSession, TConfig>((TSession) this));
@ -348,7 +342,7 @@ namespace DtronixMessageQueue.Rpc
}
catch
{
Close(SocketCloseReason.ApplicationError);
Close(CloseReason.ApplicationError);
return;
}
@ -357,7 +351,7 @@ namespace DtronixMessageQueue.Rpc
// If the we can not handle this message, disconnect the session.
if (handledMessage == false)
{
Close(SocketCloseReason.ProtocolError);
Close(CloseReason.ProtocolError);
return;
}
}

Просмотреть файл

@ -5,7 +5,7 @@ using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
namespace DtronixMessageQueue
namespace DtronixMessageQueue.Rpc
{
public class ServiceMethodCache
{

Просмотреть файл

@ -1,6 +1,7 @@
using System;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue
{
/// <summary>
/// Event args used when a session is closed.
@ -8,8 +9,8 @@ namespace DtronixMessageQueue.Socket
/// <typeparam name="TSession">Session type for this connection.</typeparam>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
public class SessionClosedEventArgs<TSession, TConfig> : EventArgs
where TSession : SocketSession<TSession, TConfig>, new()
where TConfig : SocketConfig
where TSession : TcpSocketSession<TSession, TConfig>, new()
where TConfig : TcpSocketConfig
{
/// <summary>
/// Closed session.
@ -19,14 +20,14 @@ namespace DtronixMessageQueue.Socket
/// <summary>
/// Reason the session was closed.
/// </summary>
public SocketCloseReason CloseReason { get; }
public CloseReason CloseReason { get; }
/// <summary>
/// Creates a new instance of the session closed event args.
/// </summary>
/// <param name="session">Closed session.</param>
/// <param name="closeReason">Reason the session was closed.</param>
public SessionClosedEventArgs(TSession session, SocketCloseReason closeReason)
public SessionClosedEventArgs(TSession session, CloseReason closeReason)
{
Session = session;
CloseReason = closeReason;

Просмотреть файл

@ -1,6 +1,7 @@
using System;
using DtronixMessageQueue.TcpSocket;
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue
{
/// <summary>
/// Event args used when the session has connected to a remote endpoint.
@ -8,8 +9,8 @@ namespace DtronixMessageQueue.Socket
/// <typeparam name="TSession">Session type for this connection.</typeparam>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
public class SessionEventArgs<TSession, TConfig> : EventArgs
where TSession : SocketSession<TSession, TConfig>, new()
where TConfig : SocketConfig
where TSession : TcpSocketSession<TSession, TConfig>, new()
where TConfig : TcpSocketConfig
{
/// <summary>
/// Connected session.

Просмотреть файл

@ -1,7 +1,7 @@
using System.Collections.Generic;
using System.Net.Sockets;
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Large memory buffer manager

Просмотреть файл

@ -1,4 +1,4 @@
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Class to implement on classes which have setup events.

Просмотреть файл

@ -1,9 +1,7 @@
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Net.Sockets;
using System.Threading;
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Represents a collection of reusable SocketAsyncEventArgs objects.

Просмотреть файл

@ -4,16 +4,16 @@ using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Base functionality for all client connections to a remote server.
/// </summary>
/// <typeparam name="TSession">Session type for this connection.</typeparam>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
public class SocketClient<TSession, TConfig> : SessionHandler<TSession, TConfig>
where TSession : SocketSession<TSession, TConfig>, new()
where TConfig : SocketConfig
public class TcpSocketClient<TSession, TConfig> : TcpSocketHandler<TSession, TConfig>
where TSession : TcpSocketSession<TSession, TConfig>, new()
where TConfig : TcpSocketConfig
{
/// <summary>
/// True if the client is connected to a server.
@ -26,11 +26,16 @@ namespace DtronixMessageQueue.Socket
/// </summary>
public TSession Session { get; private set; }
/// <summary>
/// Cancellation token to cancel the timeout event for connections.
/// </summary>
private CancellationTokenSource _connectionTimeoutCancellation;
/// <summary>
/// Creates a socket client with the specified configurations.
/// </summary>
/// <param name="config">Configurations to use.</param>
public SocketClient(TConfig config) : base(config, SocketMode.Client)
public TcpSocketClient(TConfig config) : base(config, TcpSocketMode.Client)
{
// Override the number of processors to one for each sending queue and receiving queue.
config.ProcessorThreads = 1;
@ -41,13 +46,9 @@ namespace DtronixMessageQueue.Socket
/// </summary>
public void Connect()
{
Connect(new IPEndPoint(IPAddress.Parse(Config.Ip), Config.Port));
Connect(Utilities.CreateIPEndPoint(Config.Address));
}
/// <summary>
/// Cancellation token to cancel the timeout event for connections.
/// </summary>
private CancellationTokenSource _connectionTimeoutCancellation;
/// <summary>
/// Connects to the specified endpoint.
@ -55,7 +56,7 @@ namespace DtronixMessageQueue.Socket
/// <param name="endPoint">Endpoint to connect to.</param>
public void Connect(IPEndPoint endPoint)
{
if (MainSocket != null && Session?.CurrentState != SocketSession<TSession, TConfig>.State.Closed)
if (MainSocket != null && Session?.CurrentState != TcpSocketSession<TSession, TConfig>.State.Closed)
{
throw new InvalidOperationException("Client is in the process of connecting.");
}
@ -114,12 +115,12 @@ namespace DtronixMessageQueue.Socket
}
timedOut = true;
OnClose(null, SocketCloseReason.TimeOut);
OnClose(null, CloseReason.TimeOut);
MainSocket.Close();
}, _connectionTimeoutCancellation.Token);
}
protected override void OnClose(TSession session, SocketCloseReason reason)
protected override void OnClose(TSession session, CloseReason reason)
{
MainSocket.Close();

Просмотреть файл

@ -1,9 +1,9 @@
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Configurations for the server/client.
/// </summary>
public class SocketConfig
public class TcpSocketConfig
{
/// <summary>
/// Maximum number of connections allowed. Only used by the server.
@ -34,12 +34,7 @@
/// <summary>
/// IP address to bind or connect to.
/// </summary>
public string Ip { get; set; }
/// <summary>
/// Port to bind or connect to.
/// </summary>
public int Port { get; set; }
public string Address { get; set; }
/// <summary>
/// (Server)

Просмотреть файл

@ -2,22 +2,23 @@
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading;
using DtronixMessageQueue.Rpc;
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Base socket for all server and client sockets.
/// </summary>
/// <typeparam name="TSession">Session type for this connection.</typeparam>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
public abstract class SessionHandler<TSession, TConfig>
where TSession : SocketSession<TSession, TConfig>, new()
where TConfig : SocketConfig
public abstract class TcpSocketHandler<TSession, TConfig>
where TSession : TcpSocketSession<TSession, TConfig>, new()
where TConfig : TcpSocketConfig
{
/// <summary>
/// Mode that this socket is running as.
/// </summary>
public SocketMode Mode { get; }
public TcpSocketMode Mode { get; }
/// <summary>
/// True if the socket is connected/listening.
@ -90,7 +91,7 @@ namespace DtronixMessageQueue.Socket
/// </summary>
/// <param name="config">Configurations for this socket.</param>
/// <param name="mode">Mode of that this socket is running in.</param>
protected SessionHandler(TConfig config, SocketMode mode)
protected TcpSocketHandler(TConfig config, TcpSocketMode mode)
{
TimeoutTimer = new Timer(TimeoutCallback);
ServiceMethodCache = new ServiceMethodCache();
@ -98,7 +99,7 @@ namespace DtronixMessageQueue.Socket
Config = config;
var modeLower = mode.ToString().ToLower();
if (mode == SocketMode.Client)
if (mode == TcpSocketMode.Client)
{
OutboxProcessor = new ActionProcessor<Guid>(new ActionProcessor<Guid>.Config
{
@ -149,7 +150,7 @@ namespace DtronixMessageQueue.Socket
{
if (session.LastReceived < timeoutTime)
{
session.Close(SocketCloseReason.TimeOut);
session.Close(CloseReason.TimeOut);
}
}
}
@ -177,7 +178,7 @@ namespace DtronixMessageQueue.Socket
/// </summary>
/// <param name="session">Session that closed.</param>
/// <param name="reason">Reason for the closing of the session.</param>
protected virtual void OnClose(TSession session, SocketCloseReason reason)
protected virtual void OnClose(TSession session, CloseReason reason)
{
// If there are no clients connected, stop the timer.
if (ConnectedSessions.IsEmpty)
@ -209,7 +210,7 @@ namespace DtronixMessageQueue.Socket
/// <returns>New session instance.</returns>
protected virtual TSession CreateSession(System.Net.Sockets.Socket socket)
{
var session = SocketSession<TSession, TConfig>.Create(socket,
var session = TcpSocketSession<TSession, TConfig>.Create(socket,
AsyncManager,
Config,
this,

Просмотреть файл

@ -1,9 +1,9 @@
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Mode that the current Socket base is in.
/// </summary>
public enum SocketMode
public enum TcpSocketMode
{
/// <summary>
/// Socket base is running in server mode.

Просмотреть файл

@ -2,16 +2,16 @@
using System.Net;
using System.Net.Sockets;
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Base functionality for handling connection requests.
/// </summary>
/// <typeparam name="TSession">Session type for this connection.</typeparam>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
public class SocketServer<TSession, TConfig> : SessionHandler<TSession, TConfig>
where TSession : SocketSession<TSession, TConfig>, new()
where TConfig : SocketConfig
public class TcpSocketServer<TSession, TConfig> : TcpSocketHandler<TSession, TConfig>
where TSession : TcpSocketSession<TSession, TConfig>, new()
where TConfig : TcpSocketConfig
{
/// <summary>
/// Set to the max number of connections allowed for the server.
@ -48,7 +48,7 @@ namespace DtronixMessageQueue.Socket
/// Creates a socket server with the specified configurations.
/// </summary>
/// <param name="config">Configurations for this socket.</param>
public SocketServer(TConfig config) : base(config, SocketMode.Server)
public TcpSocketServer(TConfig config) : base(config, TcpSocketMode.Server)
{
}
@ -61,8 +61,7 @@ namespace DtronixMessageQueue.Socket
// Reset the remaining connections.
_remainingConnections = Config.MaxConnections;
var ip = IPAddress.Parse(Config.Ip);
var localEndPoint = new IPEndPoint(ip, Config.Port);
var localEndPoint = Utilities.CreateIPEndPoint(Config.Address);
if (_isStopped == false)
{
throw new InvalidOperationException("Server is already running.");
@ -151,7 +150,7 @@ namespace DtronixMessageQueue.Socket
// If we are at max sessions, close the new connection with a connection refused reason.
if (maxSessions)
{
session.Close(SocketCloseReason.ConnectionRefused);
session.Close(CloseReason.ConnectionRefused);
}
else
{
@ -208,7 +207,7 @@ namespace DtronixMessageQueue.Socket
foreach (var session in sessions)
{
session.Close(SocketCloseReason.ServerClosing);
session.Close(CloseReason.Closing);
}
try

Просмотреть файл

@ -1,17 +1,18 @@
using System;
using System.Net.Sockets;
using System.Threading;
using DtronixMessageQueue.Rpc;
namespace DtronixMessageQueue.Socket
namespace DtronixMessageQueue.TcpSocket
{
/// <summary>
/// Base socket session to be sub-classes by the implementer.
/// </summary>
/// <typeparam name="TConfig">Configuration for this connection.</typeparam>
/// <typeparam name="TSession">Session for this connection.</typeparam>
public abstract class SocketSession<TSession, TConfig> : IDisposable, ISetupSocketSession
where TSession : SocketSession<TSession, TConfig>, new()
where TConfig : SocketConfig
public abstract class TcpSocketSession<TSession, TConfig> : IDisposable, ISetupSocketSession
where TSession : TcpSocketSession<TSession, TConfig>, new()
where TConfig : TcpSocketConfig
{
/// <summary>
/// Current state of the socket.
@ -23,21 +24,11 @@ namespace DtronixMessageQueue.Socket
/// </summary>
Unknown,
/// <summary>
/// Session is attempting to connect to remote connection.
/// </summary>
Connecting,
/// <summary>
/// Session has connected to remote session.
/// </summary>
Connected,
/// <summary>
/// Session is in the process of closing its connection.
/// </summary>
Closing,
/// <summary>
/// Session has been closed and no longer can be used.
/// </summary>
@ -84,7 +75,7 @@ namespace DtronixMessageQueue.Socket
/// <summary>
/// Base socket for this session.
/// </summary>
public SessionHandler<TSession, TConfig> BaseSocket { get; private set; }
public TcpSocketHandler<TSession, TConfig> SocketHandler { get; private set; }
/// <summary>
/// Processor to handle all inbound messages.
@ -143,10 +134,10 @@ namespace DtronixMessageQueue.Socket
/// <summary>
/// Creates a new socket session with a new Id.
/// </summary>
protected SocketSession()
protected TcpSocketSession()
{
Id = Guid.NewGuid();
CurrentState = State.Connecting;
CurrentState = State.Closed;
}
/// <summary>
@ -155,14 +146,14 @@ namespace DtronixMessageQueue.Socket
/// <param name="sessionSocket">Socket this session is to use.</param>
/// <param name="socketArgsManager">Argument pool for this session to use. Pulls two asyncevents for reading and writing and returns them at the end of this socket's life.</param>
/// <param name="sessionConfig">Socket configurations this session is to use.</param>
/// <param name="sessionHandler">Handler base which is handling this session.</param>
/// <param name="tcpSocketHandler">Handler base which is handling this session.</param>
/// <param name="inboxProcessor">Processor which handles all inbox data.</param>
/// /// <param name="outboxProcessor">Processor which handles all outbox data.</param>
/// <param name="serviceMethodCache">Cache for commonly called methods used throughout the session.</param>
public static TSession Create(System.Net.Sockets.Socket sessionSocket,
SocketAsyncEventArgsManager socketArgsManager,
TConfig sessionConfig,
SessionHandler<TSession, TConfig> sessionHandler,
TcpSocketHandler<TSession, TConfig> tcpSocketHandler,
ActionProcessor<Guid> inboxProcessor,
ActionProcessor<Guid> outboxProcessor,
ServiceMethodCache serviceMethodCache)
@ -173,7 +164,7 @@ namespace DtronixMessageQueue.Socket
_argsPool = socketArgsManager,
_socket = sessionSocket,
_writeSemaphore = new SemaphoreSlim(1, 1),
BaseSocket = sessionHandler,
SocketHandler = tcpSocketHandler,
_sendArgs = socketArgsManager.Create(),
_receiveArgs = socketArgsManager.Create(),
InboxProcessor = inboxProcessor,
@ -206,7 +197,7 @@ namespace DtronixMessageQueue.Socket
/// </summary>
void ISetupSocketSession.Start()
{
if (CurrentState != State.Connecting)
if (CurrentState != State.Closed)
return;
CurrentState = State.Connected;
@ -235,7 +226,7 @@ namespace DtronixMessageQueue.Socket
/// Called when this session is disconnected from the socket.
/// </summary>
/// <param name="reason">Reason this socket is disconnecting</param>
protected virtual void OnDisconnected(SocketCloseReason reason)
protected virtual void OnDisconnected(CloseReason reason)
{
Closed?.Invoke(this, new SessionClosedEventArgs<TSession, TConfig>((TSession)this, reason));
}
@ -257,7 +248,7 @@ namespace DtronixMessageQueue.Socket
switch (e.LastOperation)
{
case SocketAsyncOperation.Disconnect:
Close(SocketCloseReason.ClientClosing);
Close(CloseReason.Closing);
break;
case SocketAsyncOperation.Receive:
@ -303,7 +294,7 @@ namespace DtronixMessageQueue.Socket
}
catch (ObjectDisposedException)
{
Close(SocketCloseReason.SocketError);
Close(CloseReason.SocketError);
}
}
@ -317,7 +308,7 @@ namespace DtronixMessageQueue.Socket
{
if (e.SocketError != SocketError.Success)
{
Close(SocketCloseReason.SocketError);
Close(CloseReason.SocketError);
}
_writeSemaphore.Release(1);
}
@ -329,12 +320,12 @@ namespace DtronixMessageQueue.Socket
/// <param name="e">Event args of this action.</param>
protected void RecieveComplete(SocketAsyncEventArgs e)
{
if (CurrentState == State.Closing)
if (CurrentState == State.Closed)
return;
if (e.BytesTransferred == 0 && CurrentState == State.Connected)
if (e.BytesTransferred == 0)
{
CurrentState = State.Closing;
HandleIncomingBytes(null);
return;
}
if (e.BytesTransferred > 0 && e.SocketError == SocketError.Success)
@ -359,12 +350,12 @@ namespace DtronixMessageQueue.Socket
}
catch (ObjectDisposedException)
{
Close(SocketCloseReason.SocketError);
Close(CloseReason.SocketError);
}
}
else
{
Close(SocketCloseReason.SocketError);
Close(CloseReason.SocketError);
}
}
@ -372,18 +363,23 @@ namespace DtronixMessageQueue.Socket
/// Called when this session is desired or requested to be closed.
/// </summary>
/// <param name="reason">Reason this socket is closing.</param>
public virtual void Close(SocketCloseReason reason)
public virtual void Close(CloseReason reason)
{
// If this session has already been closed, nothing more to do.
if (CurrentState == State.Closed)
if (CurrentState == State.Closed && reason != CloseReason.ConnectionRefused)
return;
CurrentState = State.Closed;
// close the socket associated with the client
try
{
if (Socket.Connected)
{
Socket.Shutdown(SocketShutdown.Receive);
Socket.Disconnect(false);
}
}
catch (Exception)
{
// ignored
@ -409,14 +405,25 @@ namespace DtronixMessageQueue.Socket
OnDisconnected(reason);
}
/// <summary>
/// String representation of the active session.
/// </summary>
/// <returns>String representation.</returns>
public override string ToString()
{
return $"{SocketHandler.Mode} RcpSocketSession;";
}
/// <summary>
/// Disconnects client and releases resources.
/// </summary>
public void Dispose()
{
if (CurrentState == State.Connected)
Close(SocketCloseReason.ClientClosing);
Close(CloseReason.Closing);
}
}
}

Просмотреть файл

@ -1,9 +1,17 @@
namespace DtronixMessageQueue
using System;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Net;
using System.Runtime.CompilerServices;
using System.Threading;
namespace DtronixMessageQueue
{
/// <summary>
/// Static helper utility class.
/// </summary>
public static class Utilities
internal static class Utilities
{
/// <summary>
/// Creates a frame with the specified parameters.
@ -21,5 +29,58 @@
}
return new MqFrame(bytes, type, config);
}
/// <summary>
/// Parses an IPv4 and IPv6 strings with port into an IpEndpoint.
/// </summary>
/// <param name="endPoint">Endpoint string to parse.</param>
/// <returns>Configured IPEndPoint from the input string.</returns>
/// <remarks>
/// Created by Jens Granlund
/// https://stackoverflow.com/a/2727880
/// </remarks>
// ReSharper disable once InconsistentNaming
public static IPEndPoint CreateIPEndPoint(string endPoint)
{
string[] ep = endPoint.Split(':');
if (ep.Length < 2)
throw new FormatException("Invalid endpoint format");
IPAddress ip;
if (ep.Length > 2)
{
if (!IPAddress.TryParse(string.Join(":", ep, 0, ep.Length - 1), out ip))
{
throw new FormatException("Invalid ip-adress");
}
}
else
{
if (!IPAddress.TryParse(ep[0], out ip))
{
throw new FormatException("Invalid ip-adress");
}
}
int port;
if (!int.TryParse(ep[ep.Length - 1], NumberStyles.None, NumberFormatInfo.CurrentInfo, out port))
{
throw new FormatException("Invalid port");
}
return new IPEndPoint(ip, port);
}
private static Stopwatch sw = new Stopwatch();
internal static void TraceHelper(string text = "", [CallerMemberName] string callerName = "",
[CallerFilePath] string file = "", [CallerLineNumber] int lineNumber = 0)
{
#if false
if (!sw.IsRunning)
sw.Start();
Console.WriteLine($"{sw.Elapsed}{Thread.CurrentThread.Name,-20}{Path.GetFileNameWithoutExtension(file),-30}:{lineNumber:0000} {callerName,-15:5}: {text}");
#endif
}
}
}

Просмотреть файл

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="protobuf-net" version="2.3.0" targetFramework="net45" />
<package id="protobuf-net" version="2.3.2" targetFramework="net45" />
</packages>

Просмотреть файл

@ -1 +1 @@
git log v1.0..HEAD --pretty="%%H - %%s" --no-merges >output.txt
git log v0.5..HEAD --pretty="%%H - %%s" --no-merges >output.txt

1
tools/MonoTests.bat Normal file
Просмотреть файл

@ -0,0 +1 @@
"C:\Program Files\Mono\bin\mono.exe" .././src/packages/NUnit.ConsoleRunner.3.7.0/tools/nunit3-console.exe .././src/DtronixMessageQueue.Tests/bin/Release/DtronixMessageQueue.Tests.dll

Просмотреть файл

@ -1,2 +1,2 @@
..\..\..\packages\NuGet.CommandLine.4.1.0\tools\nuget.exe push *0.nupkg -Source https://www.nuget.org/api/v2/package
..\..\..\packages\NuGet.CommandLine.4.1.0\tools\nuget.exe push *.symbols.nupkg -Source https://nuget.smbsrc.net/
..\..\..\packages\NuGet.CommandLine.3.4.3\tools\nuget.exe push *0.nupkg -Source https://www.nuget.org/api/v2/package
..\..\..\packages\NuGet.CommandLine.3.4.3\tools\nuget.exe push *.symbols.nupkg -Source https://www.nuget.org/api/v2/package