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));
}
///
/// Проверяет сценарий, когда несколько раз подряд читаются данные
/// с флагом peek - то есть глянуть что лежит на поверхности, не вычитывая.
///
///
[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(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]);
}
}
///
/// Проверяет сценарий, когда несколько раз подряд читаются данные
/// с флагом peek - то есть глянуть что лежит на поверхности, не вычитывая. При этом, в процессе работы продолжают писаться новые данные.
///
///
[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(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(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]);
}
}
}
///
/// Проверяет сценарий, чтения-отправления данных.
///
///
[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(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);
}
}
///
/// Проверяет сценарий, чтения-отправления данных c помощью метода расширения.
///
///
[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(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]);
}
}
}
}
}