1
0
mirror of https://github.com/JKorf/CryptoExchange.Net synced 2026-04-12 16:13:12 +00:00
Jan Korf 4e2dc564dd
Socket routing improvements, unit test cleanup (#276)
Updated WebSocket message routing improving performance for scenarios with multiple different subscriptions and topics
Added AddCommaSeparated helper for Enum value arrays to ParameterCollection
Improved EnumConverter performance and removed string allocation for happy path
Fixed CreateParamString extension method for ArrayParametersSerialization.Json
Fixed Shared GetOrderBookOptions and GetRecentTradeOptions base validations not being called
2026-04-08 13:04:18 +02:00

157 lines
4.1 KiB
C#

using CryptoExchange.Net.Objects;
using NUnit.Framework;
using NUnit.Framework.Legacy;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace CryptoExchange.Net.UnitTests
{
[TestFixture()]
public class AsyncResetEventTests
{
[Test]
public async Task InitialFalseAndResetFalse_Should_BothCompleteAfterSingleSet()
{
var evnt = new AsyncResetEvent(false, false);
var waiter1 = evnt.WaitAsync();
var waiter2 = evnt.WaitAsync();
evnt.Set();
var result1 = await waiter1;
var result2 = await waiter2;
Assert.That(result1);
Assert.That(result2);
}
[Test]
public async Task InitialTrueAndResetFalse_Should_BothCompleteImmediately()
{
var evnt = new AsyncResetEvent(true, false);
var waiter1 = evnt.WaitAsync();
var waiter2 = evnt.WaitAsync();
var result1 = await waiter1;
var result2 = await waiter2;
Assert.That(result1);
Assert.That(result2);
}
[Test]
public async Task InitialFalseAndResetTrue_Should_CompleteEachAfterASet()
{
var evnt = new AsyncResetEvent(false, true);
var waiter1 = evnt.WaitAsync();
var waiter2 = evnt.WaitAsync();
evnt.Set();
var result1 = await waiter1;
Assert.That(result1);
Assert.That(waiter2.Status != TaskStatus.RanToCompletion);
evnt.Set();
var result2 = await waiter2;
Assert.That(result2);
}
[Test]
public async Task InitialTrueAndResetTrue_Should_CompleteFirstImmediatelyAndSecondAfterSet()
{
var evnt = new AsyncResetEvent(true, true);
var waiter1 = evnt.WaitAsync();
var waiter2 = evnt.WaitAsync();
var result1 = await waiter1;
Assert.That(result1);
Assert.That(waiter2.Status != TaskStatus.RanToCompletion);
evnt.Set();
var result2 = await waiter2;
Assert.That(result2);
}
[Test]
public async Task Awaiting10TimesOnSameEvent_Should_AllCompleteAfter10Sets()
{
var evnt = new AsyncResetEvent(false, true);
var waiters = new List<Task<bool>>();
for(var i = 0; i < 10; i++)
{
waiters.Add(evnt.WaitAsync());
}
List<bool>? results = null;
var resultsWaiter = Task.Run(async () =>
{
await Task.WhenAll(waiters);
results = waiters.Select(w => w.Result).ToList();
});
for(var i = 1; i <= 10; i++)
{
evnt.Set();
await Task.Delay(1); // Wait for the continuation.
Assert.That(10 - i == waiters.Count(w => w.Status != TaskStatus.RanToCompletion));
}
await resultsWaiter;
Assert.That(10 == results?.Count(r => r));
}
[Test]
public async Task WaitingShorterThanTimeout_Should_ReturnTrue()
{
var evnt = new AsyncResetEvent(false, true);
var waiter1 = evnt.WaitAsync(TimeSpan.FromMilliseconds(100));
await Task.Delay(50);
evnt.Set();
var result1 = await waiter1;
Assert.That(result1);
}
[Test]
public async Task WaitingLongerThanTimeout_Should_ReturnFalse()
{
var evnt = new AsyncResetEvent(false, true);
var waiter1 = evnt.WaitAsync(TimeSpan.FromMilliseconds(100));
var result1 = await waiter1;
ClassicAssert.False(result1);
}
[Test]
public async Task CancellingWait_Should_ReturnFalse()
{
var evnt = new AsyncResetEvent(false, true);
var waiter1 = evnt.WaitAsync(ct: new CancellationTokenSource(50).Token);
var result1 = await waiter1;
ClassicAssert.False(result1);
}
}
}