Тестовое соединения и тесты к нему
checks / check and test (push) Has been cancelled Details

revision
vlad zverzhkhovskiy 2025-08-07 12:48:10 +03:00
parent 0c59ba8d64
commit 7ddb102efe
16 changed files with 329 additions and 451 deletions

View File

@ -0,0 +1,109 @@
using Sphagnum.Common.Infrastructure.Contracts;
using System.Net;
using System.Net.Sockets;
using System.Threading.Channels;
namespace Sphagnum.Server.Tests.Services
{
/// <summary>
/// Класс имитирующий передачу данных через сокет.
/// </summary>
internal class TestConnection : IConnection
{
public CancellationTokenSource CancellationTokenSource { get; set; } = new CancellationTokenSource();
public Guid ConnectionId { get; private set; }
public bool Connected { get; set; }
public event Action<Guid>? ConnectionClosed;
public Channel<byte[]> _channel = Channel.CreateUnbounded<byte[]>();
public Channel<TestConnection> _newConnectionsChannel = Channel.CreateUnbounded<TestConnection>();
public TestConnection(Guid id)
{
ConnectionId = id;
}
public TestConnection()
{
ConnectionId = Guid.NewGuid();
}
public void Bind(EndPoint endPoint)
{
}
public void Close()
{
Connected = false;
CancellationTokenSource.Cancel();
ConnectionClosed?.Invoke(ConnectionId);
}
public Task ConnectAsync(string host, int port)
{
Connected = true;
return Task.CompletedTask;
}
public void Dispose()
{
CancellationTokenSource.Cancel();
ConnectionClosed?.Invoke(ConnectionId);
}
public void Listen(int backlog)
{
}
public async ValueTask<int> ReceiveAsync(Memory<byte> buffer, SocketFlags socketFlags, CancellationToken cancellationToken = default)
{
var canRead = await _channel.Reader.WaitToReadAsync(cancellationToken);
if (canRead)
{
if (socketFlags == SocketFlags.Peek)
{
if (_channel.Reader.TryPeek(out var data))
{
int i;
for (i = 0; i < buffer.Length && i < data.Length; i++)
{
buffer.Span[i] = data[i];
}
return i;
}
}
else
{
var data = await _channel.Reader.ReadAsync(cancellationToken);
for (var i = 0; i < buffer.Length && i < data.Length; i++)
{
buffer.Span[i] = data[i];
}
return data.Length;
}
}
return 0;
}
public async ValueTask<int> SendAsync(ReadOnlyMemory<byte> buffer, SocketFlags socketFlags, CancellationToken cancellationToken = default)
{
var data = new byte[buffer.Length];
buffer.CopyTo(data);
await _channel.Writer.WriteAsync(data, cancellationToken);
return data.Length;
}
public async Task<IConnection> AcceptAsync()
{
return await _newConnectionsChannel.Reader.ReadAsync();
}
internal async Task AddInputConnection(Guid? connectionId = null)
{
await _newConnectionsChannel.Writer.WriteAsync(connectionId.HasValue ? new TestConnection(connectionId.Value) : new TestConnection());
}
}
}

View File

@ -0,0 +1,29 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoFixture" Version="4.18.1" />
<PackageReference Include="coverlet.collector" Version="6.0.0" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
<PackageReference Include="NUnit" Version="3.14.0" />
<PackageReference Include="NUnit.Analyzers" Version="3.9.0" />
<PackageReference Include="NUnit3TestAdapter" Version="4.5.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\src\Sphagnum.Server\Sphagnum.Server.csproj" />
</ItemGroup>
<ItemGroup>
<Using Include="NUnit.Framework" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,162 @@
using AutoFixture;
using Sphagnum.Common.Messaging.Extensions;
using Sphagnum.Server.Tests.Services;
using System.Security.Cryptography;
namespace Sphagnum.Server.Tests
{
public class TestConnectionTests
{
[Test]
public async Task IsNewConnectionCretesCorrect()
{
var connection = new TestConnection();
var connectionTask = connection.AcceptAsync();
var id = Guid.NewGuid();
await Task.WhenAll(connection.AddInputConnection(id), connectionTask);
Assert.That(id, Is.EqualTo(connectionTask.Result.ConnectionId));
}
/// <summary>
/// Ïðîâåðÿåò ñöåíàðèé, êîãäà íåñêîëüêî ðàç ïîäðÿä ÷èòàþòñÿ äàííûå
/// ñ ôëàãîì peek - òî åñòü ãëÿíóòü ÷òî ëåæèò íà ïîâåðõíîñòè, íå âû÷èòûâàÿ.
/// </summary>
/// <returns></returns>
[Test]
public async Task SendRecieveData_WithPeekSocketFlag_MultipleReading()
{
var connection = new TestConnection();
var buffer1 = new byte[5];
var recievingTask = connection.ReceiveAsync(buffer1, System.Net.Sockets.SocketFlags.Peek);
var fix = new Fixture();
var data = fix.CreateMany<byte>(11).ToArray();
var sendingTask = connection.SendAsync(data, System.Net.Sockets.SocketFlags.None);
await Task.WhenAll(sendingTask.AsTask(), recievingTask.AsTask());
for (int i = 0; i < 5; i++)
{
Assert.That(buffer1[i] == data[i]);
}
Assert.That(recievingTask.Result == 5);
var buffer2 = new byte[5];
var count = await connection.ReceiveAsync(buffer2, System.Net.Sockets.SocketFlags.Peek);
Assert.That(recievingTask.Result == count);
for (int i = 0; i < 5; i++)
{
Assert.That(buffer2[i] == data[i]);
}
var buffer3 = new byte[5];
var count3 = await connection.ReceiveAsync(buffer3, System.Net.Sockets.SocketFlags.Peek);
Assert.That(recievingTask.Result == count3);
for (int i = 0; i < 5; i++)
{
Assert.That(buffer3[i] == data[i]);
}
}
/// <summary>
/// Ïðîâåðÿåò ñöåíàðèé, êîãäà íåñêîëüêî ðàç ïîäðÿä ÷èòàþòñÿ äàííûå
/// ñ ôëàãîì peek - òî åñòü ãëÿíóòü ÷òî ëåæèò íà ïîâåðõíîñòè, íå âû÷èòûâàÿ. Ïðè ýòîì, â ïðîöåññå ðàáîòû ïðîäîëæàþò ïèñàòüñÿ íîâûå äàííûå.
/// </summary>
/// <returns></returns>
[Test]
public async Task SendRecieveData_WithPeekSocketFlag_MultipleReadingWithWriting()
{
var connection = new TestConnection();
var buffer1 = new byte[5];
var recievingTask = connection.ReceiveAsync(buffer1, System.Net.Sockets.SocketFlags.Peek);
var fix = new Fixture();
var data = fix.CreateMany<byte>(RandomNumberGenerator.GetInt32(5, 100)).ToArray();
var sendingTask = connection.SendAsync(data, System.Net.Sockets.SocketFlags.None);
await Task.WhenAll(sendingTask.AsTask(), recievingTask.AsTask());
for (int i = 0; i < 5; i++)
{
Assert.That(buffer1[i] == data[i]);
}
Assert.That(recievingTask.Result == 5);
var buffer2 = new byte[5];
var count = await connection.ReceiveAsync(buffer2, System.Net.Sockets.SocketFlags.Peek);
Assert.That(recievingTask.Result == count);
for (int i = 0; i < 5; i++)
{
Assert.That(buffer2[i] == data[i]);
}
for (int c = 0; c < 20; c++)
{
var data2 = fix.CreateMany<byte>(RandomNumberGenerator.GetInt32(5, 100)).ToArray();
var sendingCount = await connection.SendAsync(data2, System.Net.Sockets.SocketFlags.None);
var buffer3 = new byte[5];
var count3 = await connection.ReceiveAsync(buffer3, System.Net.Sockets.SocketFlags.Peek);
Assert.That(recievingTask.Result == count3);
for (int i = 0; i < 5; i++)
{
Assert.That(buffer3[i] == data[i]);
}
}
}
/// <summary>
/// Ïðîâåðÿåò ñöåíàðèé, ÷òåíèÿ-îòïðàâëåíèÿ äàííûõ.
/// </summary>
/// <returns></returns>
[Test]
public async Task SendRecieveData_WithNoneSocketFlag()
{
var fix = new Fixture();
var connection = new TestConnection();
for (int c = 0; c < 20; c++)
{
int dataSize = RandomNumberGenerator.GetInt32(5, 100);
var buffer1 = new byte[dataSize];
var recievingTask = connection.ReceiveAsync(buffer1, System.Net.Sockets.SocketFlags.None);
var data = fix.CreateMany<byte>(dataSize).ToArray();
var sendingTask = connection.SendAsync(data, System.Net.Sockets.SocketFlags.None);
await Task.WhenAll(sendingTask.AsTask(), recievingTask.AsTask());
for (int i = 0; i < dataSize; i++)
{
Assert.That(buffer1[i] == data[i]);
}
Assert.IsTrue(recievingTask.Result == sendingTask.Result);
}
}
/// <summary>
/// Ïðîâåðÿåò ñöåíàðèé, ÷òåíèÿ-îòïðàâëåíèÿ äàííûõ c ïîìîùüþ ìåòîäà ðàñøèðåíèÿ.
/// </summary>
/// <returns></returns>
[Test]
public async Task SendRecieveData_WithExtensionMethod()
{
var fix = new Fixture();
var connection = new TestConnection();
for (int c = 0; c < 20; c++)
{
int dataSize = RandomNumberGenerator.GetInt32(5, 100);
var recievingTask = connection.ReceiveAsync(CancellationToken.None);
var payload = fix.CreateMany<byte>(dataSize).ToArray();
var length = BitConverter.GetBytes(dataSize);
var data = new byte[dataSize + 4];
length.CopyTo(data, 0);
payload.CopyTo(data, 4);
var sendingTask = connection.SendAsync(data, System.Net.Sockets.SocketFlags.None);
await Task.WhenAll(sendingTask.AsTask(), recievingTask.AsTask());
for (int i = 0; i < dataSize; i++)
{
Assert.That(recievingTask.Result[i] == data[i]);
}
}
}
}
}

View File

@ -9,7 +9,6 @@ namespace Sphagnum.DebugClient.Controllers
public class TestController : ControllerBase
{
private readonly ClientDefault _connection;
private static readonly Task? rec;
public TestController(ClientDefault connection)
{
@ -17,7 +16,7 @@ namespace Sphagnum.DebugClient.Controllers
}
[HttpGet]
public string test()
public string Test()
{
return "Ok!";
}

View File

@ -23,6 +23,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sphagnum.Common.UnitTests",
EndProject
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{BF7E9B18-1C0F-4AA6-B4BD-F38617B72A1B}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sphagnum.Server.Tests", "..\Sphagnum.Server.Tests\Sphagnum.Server.Tests.csproj", "{134442E7-CA62-4BE4-B7EB-63847385A98C}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -57,6 +59,10 @@ Global
{BF7E9B18-1C0F-4AA6-B4BD-F38617B72A1B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{BF7E9B18-1C0F-4AA6-B4BD-F38617B72A1B}.Release|Any CPU.ActiveCfg = Release|Any CPU
{BF7E9B18-1C0F-4AA6-B4BD-F38617B72A1B}.Release|Any CPU.Build.0 = Release|Any CPU
{134442E7-CA62-4BE4-B7EB-63847385A98C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{134442E7-CA62-4BE4-B7EB-63847385A98C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{134442E7-CA62-4BE4-B7EB-63847385A98C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{134442E7-CA62-4BE4-B7EB-63847385A98C}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -68,6 +74,7 @@ Global
{C344FDF3-3D4D-4BC6-B257-4AD907BE1BE4} = {71CDAFF8-7C3D-4915-8FAA-5C263857AD62}
{77F76F27-D883-4392-90D5-8F441043F468} = {71CDAFF8-7C3D-4915-8FAA-5C263857AD62}
{25865911-1F2D-4083-A99C-C65E13F05C14} = {8E76791F-BA23-44AD-BACB-E14DD5FCE750}
{134442E7-CA62-4BE4-B7EB-63847385A98C} = {8E76791F-BA23-44AD-BACB-E14DD5FCE750}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {42DA8F91-1667-49BC-971D-D83C0870393A}

View File

@ -2,6 +2,6 @@
//Тесты
[assembly: InternalsVisibleTo("Sphagnum.Common.UnitTests")]
[assembly: InternalsVisibleTo("Sphagnum.Server.Tests")]
[assembly: InternalsVisibleTo("Sphagnum.Client")]
[assembly: InternalsVisibleTo("Sphagnum.Server")]

View File

@ -28,6 +28,6 @@ namespace Sphagnum.Common.Infrastructure.Contracts
void Close();
bool Connected { get; }
public event Action<Guid> ConnectionClosed;
public event Action<Guid>? ConnectionClosed;
}
}

View File

@ -6,11 +6,11 @@ using System.Threading.Tasks;
namespace Sphagnum.Common.Messaging.Extensions
{
internal static class IConntcrionExtensions
internal static class IConnectionExtensions
{
public static async ValueTask<byte[]> ReceiveAsync(this IConnection connection, CancellationToken cancellationToken = default)
{
var lengthBuffer = new byte[4];
var lengthBuffer = new byte[5];
await connection.ReceiveAsync(lengthBuffer, SocketFlags.Peek, cancellationToken);
var length = BitConverter.ToInt32(lengthBuffer, 0);
var result = new byte[length];

View File

@ -9,7 +9,6 @@ namespace Sphagnum.Server.Broker.Services
{
private readonly int _port;
private readonly CancellationTokenSource _cts = new();
private Task _acceptationTask;
private readonly IConnection _connection;
private readonly ConnectionsManager _manager;
private readonly MessagesProcessor _processor;
@ -43,7 +42,7 @@ namespace Sphagnum.Server.Broker.Services
{
_connection.Bind(new IPEndPoint(IPAddress.Any, _port));
_connection?.Listen(1000); //todo разобраться что делает этот параметр.
_acceptationTask = AcceptationWorker();
var _ = AcceptationWorker();
return Task.CompletedTask;
}

View File

@ -14,7 +14,7 @@ namespace Sphagnum.Server.Broker.Services
{
Connections.TryRemove(id, out var conn);
};
ProcessMessages(connection);
var _ = ProcessMessages(connection);
}
internal static async Task ProcessMessages(IConnection connection)

View File

@ -18,8 +18,11 @@ namespace Sphagnum.Common.UnitTests
var bytes2 = MessageParser.PackMessage(message2);
var f1 = (MessageFlags)BitConverter.ToUInt16(bytes.AsSpan(5, 2));
var f2 = (MessageFlags)BitConverter.ToUInt16(bytes2.AsSpan(5, 2));
Assert.That(Comparers.MessagesComparer.Compare(message, message2), Is.True);
Assert.Multiple(() =>
{
Assert.That(f1, Is.EqualTo(f2));
Assert.That(Comparers.MessagesComparer.Compare(message, message2), Is.True);
});
count++;
}
}
@ -36,9 +39,11 @@ namespace Sphagnum.Common.UnitTests
var bytes2 = MessageParser.PackMessage(message2);
var f1 = (MessageFlags)BitConverter.ToUInt16(bytes.AsSpan(5, 2));
var f2 = (MessageFlags)BitConverter.ToUInt16(bytes2.AsSpan(5, 2));
Assert.IsTrue(f1 == f2);
Assert.That(Comparers.MessagesComparer.Compare(message, message2), Is.True);
Assert.Multiple(() =>
{
Assert.That(f1, Is.EqualTo(f2));
Assert.That(Comparers.MessagesComparer.Compare(message, message2), Is.True);
});
count++;
}
}
@ -56,8 +61,11 @@ namespace Sphagnum.Common.UnitTests
var bytes2 = MessageParser.PackMessage(message2);
var f1 = (MessageFlags)BitConverter.ToUInt16(bytes.AsSpan(5, 2));
var f2 = (MessageFlags)BitConverter.ToUInt16(bytes2.AsSpan(5, 2));
Assert.IsTrue(f1 == f2);
Assert.That(Comparers.MessagesComparer.Compare(message, message2), Is.True);
Assert.Multiple(() =>
{
Assert.That(f1, Is.EqualTo(f2));
Assert.That(Comparers.MessagesComparer.Compare(message, message2), Is.True);
});
count++;
}
}

View File

@ -1,17 +0,0 @@
namespace Sphagnum.Common.UnitTests.Old
{
public class ConnectionTests
{
[SetUp]
public void Setup()
{
}
[Test]
public void Test1()
{
Assert.Pass();
}
}
}

View File

@ -1,160 +0,0 @@
//using Sphagnum.Common.Messaging.Utils;
//using Sphagnum.Common.Old.Utils.Enums;
//using Sphagnum.Common.UnitTests.Comparers;
//using Sphagnum.Common.UnitTests.DataGenerators;
//namespace Sphagnum.Common.UnitTests.Old
//{
// public class MessageParserTests
// {
// [Test]
// public void PackUnpackIncomingMessage_WithPayload()
// {
// var count = 0;
// while (count < 100)
// {
// var message = MessagesGenerator.GetRandomIncommingMessage();
// var bytes = MessageParserold.PackMessage(message);
// var message2 = MessageParserold.UnpackIncomingMessage(bytes);
// Assert.That(MessagesComparer.Compare(message, message2), Is.True);
// count++;
// }
// }
// [Test]
// public void PackUnpackIncomingMessage_WithEmptyPayload()
// {
// var count = 0;
// while (count < 100)
// {
// var message = MessagesGenerator.GetRandoIncommingMessage(true);
// var bytes = MessageParserold.PackMessage(message);
// var message2 = MessageParserold.UnpackIncomingMessage(bytes);
// Assert.That(MessagesComparer.Compare(message, message2), Is.True);
// Assert.IsTrue((MessageFlags)BitConverter.ToUInt16(bytes.AsSpan(5, 2)) == MessageFlags.HasPayload);
// count++;
// }
// }
// [Test]
// public void PackUnpackOutgoingMessageGetMessageId_WithRoutingKeyAndPayload()
// {
// var count = 0;
// while (count < 100)
// {
// var id = Guid.NewGuid();
// var message = MessagesGenerator.GetRandomOutgoingMessage();
// var bytesForFlags = MessageParserold.PackMessage(message);
// var flags = (MessageFlags)BitConverter.ToUInt16(bytesForFlags.AsSpan(5, 2));
// var bytes = MessageParserold.Pack(message, id, flags, bytesForFlags.Length);
// var message2 = MessageParserold.UnpackOutgoingMessage(bytes);
// Assert.That(MessagesComparer.Compare(message, message2), Is.True);
// var id2 = MessageParserold.GetMessageId(bytes);
// Assert.That(id, Is.EqualTo(id2));
// count++;
// }
// }
// [Test]
// public void PackUnpackOutgoingMessageGetMessageId_WithEmptyRoutingKeyAndEmptyPayload()
// {
// var count = 0;
// while (count < 100)
// {
// var id = Guid.NewGuid();
// var message = MessagesGenerator.GetRandomOutgoingMessage(true, true);
// var bytesForFlags = MessageParserold.PackMessage(message);
// var flags = (MessageFlags)BitConverter.ToUInt16(bytesForFlags.AsSpan(5, 2));
// var bytes = MessageParserold.Pack(message, id, flags, bytesForFlags.Length);
// var message2 = MessageParserold.UnpackOutgoingMessage(bytes);
// Assert.That(MessagesComparer.Compare(message, message2), Is.True);
// var id2 = MessageParserold.GetMessageId(bytes);
// Assert.That(id, Is.EqualTo(id2));
// count++;
// }
// }
// [Test]
// public void PackUnpackOutgoingMessage_WithRoutingKeyAndPayload()
// {
// var count = 0;
// while (count < 100)
// {
// var message = MessagesGenerator.GetRandomOutgoingMessage();
// var bytes = MessageParserold.PackMessage(message);
// var message2 = MessageParserold.UnpackOutgoingMessage(bytes);
// Assert.That(MessagesComparer.Compare(message, message2), Is.True);
// var bytes2 = MessageParserold.PackMessage(message2);
// var message3 = MessageParserold.UnpackOutgoingMessage(bytes2);
// Assert.That(MessagesComparer.ComparePayloads(message2, message3), Is.True);
// var bytes3 = MessageParserold.PackMessage(message2);
// var message4 = MessageParserold.UnpackOutgoingMessage(bytes3);
// Assert.That(MessagesComparer.ComparePayloads(message3, message4), Is.True);
// count++;
// }
// }
// [Test]
// public void PackUnpackOutgoingMessage_WithRoutingKeyAndEmptyPayload()
// {
// var count = 0;
// while (count < 100)
// {
// var message = MessagesGenerator.GetRandomOutgoingMessage(false, true);
// var bytes = MessageParserold.PackMessage(message);
// var message2 = MessageParserold.UnpackOutgoingMessage(bytes);
// Assert.That(MessagesComparer.Compare(message, message2), Is.True);
// var bytes2 = MessageParserold.PackMessage(message2);
// var message3 = MessageParserold.UnpackOutgoingMessage(bytes2);
// Assert.That(MessagesComparer.ComparePayloads(message2, message3), Is.True);
// var bytes3 = MessageParserold.PackMessage(message2);
// var message4 = MessageParserold.UnpackOutgoingMessage(bytes3);
// Assert.That(MessagesComparer.ComparePayloads(message3, message4), Is.True);
// count++;
// }
// }
// [Test]
// public void PackUnpackOutgoingMessage_WithEmptyRoutingKey()
// {
// var count = 0;
// while (count < 100)
// {
// var message = MessagesGenerator.GetRandomOutgoingMessage(true);
// var bytes = MessageParserold.PackMessage(message);
// var message2 = MessageParserold.UnpackOutgoingMessage(bytes);
// Assert.That(MessagesComparer.Compare(message, message2), Is.True);
// var bytes2 = MessageParserold.PackMessage(message2);
// var message3 = MessageParserold.UnpackOutgoingMessage(bytes2);
// Assert.That(MessagesComparer.ComparePayloads(message2, message3), Is.True);
// var bytes3 = MessageParserold.PackMessage(message2);
// var message4 = MessageParserold.UnpackOutgoingMessage(bytes3);
// Assert.That(MessagesComparer.ComparePayloads(message3, message4), Is.True);
// count++;
// }
// }
// [Test]
// public void PackUnpackOutgoingMessage_WithEmptyRoutingKeyAndEmptyPayload()
// {
// var count = 0;
// while (count < 100)
// {
// var message = MessagesGenerator.GetRandomOutgoingMessage(true, true);
// var bytes = MessageParserold.PackMessage(message);
// var message2 = MessageParserold.UnpackOutgoingMessage(bytes);
// Assert.That(MessagesComparer.Compare(message, message2), Is.True);
// var bytes2 = MessageParserold.PackMessage(message2);
// var message3 = MessageParserold.UnpackOutgoingMessage(bytes2);
// Assert.That(MessagesComparer.ComparePayloads(message2, message3), Is.True);
// var bytes3 = MessageParserold.PackMessage(message2);
// var message4 = MessageParserold.UnpackOutgoingMessage(bytes3);
// Assert.That(MessagesComparer.ComparePayloads(message3, message4), Is.True);
// count++;
// }
// }
// }
//}

View File

@ -1,82 +0,0 @@
using Sphagnum.Common.Infrastructure.Contracts;
using System.Collections.Concurrent;
using System.Net;
using System.Net.Sockets;
namespace Sphagnum.Common.UnitTests.Old.Services
{
internal class TestConnection : IConnection
{
private readonly ConcurrentQueue<byte[]> _queue = new();
public bool Connected => true;
public IConnection Accept()
{
return new TestConnection();
}
public Task<IConnection> AcceptAsync()
{
return Task.FromResult<IConnection>(new TestConnection());
}
public void Bind(EndPoint endPoint)
{
}
public void Close()
{
}
public Task ConnectAsync(string host, int port)
{
return Task.CompletedTask;
}
public void Dispose()
{
}
public void Listen(int backlog)
{
}
public async ValueTask<int> ReceiveAsync(Memory<byte> buffer, SocketFlags socketFlags, CancellationToken cancellationToken = default)
{
var res = new byte[buffer.Length];
await Receive(res, socketFlags, cancellationToken);
res.CopyTo(buffer);
return res.Length;
}
public ValueTask<int> SendAsync(ReadOnlyMemory<byte> buffer, SocketFlags socketFlags, CancellationToken cancellationToken = default)
{
_queue.Enqueue(buffer.Span.ToArray());
return ValueTask.FromResult(buffer.Length);
}
private async ValueTask<int> Receive(byte[] buffer, SocketFlags socketFlags, CancellationToken cancellationToken = default, int counter = 0)
{
if (counter > 200)
{
throw new TimeoutException();
}
if (socketFlags == SocketFlags.Peek ? _queue.TryPeek(out byte[]? result) : _queue.TryDequeue(out result))
{
result.CopyTo(buffer, 0);
return result.Length;
}
else
{
await Task.Delay(100, cancellationToken);
counter++;
await Receive(buffer, socketFlags, cancellationToken, counter);
}
throw new TimeoutException();
}
}
}

View File

@ -1,18 +0,0 @@
//using Sphagnum.Common.Old.Contracts.Login;
//using Sphagnum.Common.Old.Services;
//namespace Sphagnum.Common.UnitTests.Old.Services
//{
// internal class TestConnectionFactory : ConnectionFactory
// {
// internal override SphagnumConnectionOld CreateDefault(Func<Func<byte[], Task>> messagesProcessorFactory)
// {
// return new SphagnumConnectionOld(() => new TestConnection(), messagesProcessorFactory);
// }
// internal override Task<SphagnumConnectionOld> CreateDefaultConnected(Func<Func<byte[], Task>> messagesProcessorFactory)
// {
// return Task.FromResult(new SphagnumConnectionOld(() => new TestConnection(), messagesProcessorFactory));
// }
// }
//}

View File

@ -1,158 +0,0 @@
//using Sphagnum.Common.UnitTests.Services;
//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//namespace Sphagnum.Common.UnitTests
//{
// public class TestConnectionTests
// {
// [Test]
// public async Task SendRecieve8BytesWithBufferSize10()
// {
// var connection = new TestConnection
// {
// BufferSize = 10
// };
// var data = new byte[8];
// Array.Fill<byte>(data, 1);
// _ = await connection.SendAsync(data);
// var forResult = new List<byte>();
// for (int i = 0; i < 1; i++)
// {
// var buffer = new byte[connection.BufferSize];
// _ = await connection.ReceiveAsync(buffer);
// for (int j = 0; j < buffer.Length; j++)
// {
// var el = buffer[j];
// if (el == 1)
// {
// forResult.Add(el);
// }
// }
// Array.Clear(buffer);
// }
// Assert.IsTrue(data.Length == forResult.Count);
// }
// [Test]
// public async Task SendRecieve10BytesWithBufferSize10()
// {
// var connection = new TestConnection
// {
// BufferSize = 10
// };
// var data = new byte[10];
// Array.Fill<byte>(data, 1);
// _ = await connection.SendAsync(data);
// var forResult = new List<byte>();
// for (int i = 0; i < 1; i++)
// {
// var buffer = new byte[connection.BufferSize];
// _ = await connection.ReceiveAsync(buffer);
// for (int j = 0; j < buffer.Length; j++)
// {
// var el = buffer[j];
// if (el == 1)
// {
// forResult.Add(el);
// }
// }
// Array.Clear(buffer);
// }
// Assert.IsTrue(data.Length == forResult.Count);
// }
// [Test]
// public async Task SendRecieve11BytesWithBufferSize10()
// {
// var connection = new TestConnection
// {
// BufferSize = 10
// };
// var data = new byte[11];
// Array.Fill<byte>(data, 1);
// _ = await connection.SendAsync(data);
// var forResult = new List<byte>();
// for (int i = 0; i < 2; i++)
// {
// var buffer = new byte[connection.BufferSize];
// _ = await connection.ReceiveAsync(buffer);
// for (int j = 0; j < buffer.Length; j++)
// {
// var el = buffer[j];
// if (el==1)
// {
// forResult.Add(el);
// }
// }
// Array.Clear(buffer);
// }
// Assert.IsTrue(data.Length == forResult.Count);
// }
// [Test]
// public async Task SendRecieve31BytesWithBufferSize10()
// {
// var connection = new TestConnection
// {
// BufferSize = 10
// };
// var data = new byte[31];
// Array.Fill<byte>(data, 1);
// _ = await connection.SendAsync(data);
// var forResult = new List<byte>();
// for (int i = 0; i < 4; i++)
// {
// var buffer = new byte[connection.BufferSize];
// _ = await connection.ReceiveAsync(buffer);
// for (int j = 0; j < buffer.Length; j++)
// {
// var el = buffer[j];
// if (el == 1)
// {
// forResult.Add(el);
// }
// }
// Array.Clear(buffer);
// }
// Assert.IsTrue(data.Length == forResult.Count);
// }
// [Test]
// public async Task SendRecieve30BytesWithBufferSize10()
// {
// var connection = new TestConnection
// {
// BufferSize = 10
// };
// var data = new byte[30];
// Array.Fill<byte>(data, 1);
// _ = await connection.SendAsync(data);
// var forResult = new List<byte>();
// for (int i = 0; i < 3; i++)
// {
// var buffer = new byte[connection.BufferSize];
// _ = await connection.ReceiveAsync(buffer);
// for (int j = 0; j < buffer.Length; j++)
// {
// var el = buffer[j];
// if (el == 1)
// {
// forResult.Add(el);
// }
// }
// Array.Clear(buffer);
// }
// Assert.IsTrue(data.Length == forResult.Count);
// }
// }
//}