Files
natsnet/dotnet/tests/ZB.MOM.NatsNet.Server.Tests/ImplBacklog/ConcurrencyTests1.Batch36.cs
2026-02-28 23:20:30 -05:00

62 lines
1.7 KiB
C#

using System.Collections.Concurrent;
using Shouldly;
using ZB.MOM.NatsNet.Server;
namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
public sealed partial class ConcurrencyTests1
{
[Fact] // T:2387
public void NoRaceJetStreamAPIStreamListPaging_ShouldSucceed()
{
var names = Enumerable.Range(0, 500).Select(i => $"STREAM-{i:D4}").ToList();
var errors = new ConcurrentQueue<Exception>();
Parallel.For(0, 20, page =>
{
try
{
var offset = page * 10;
var slice = names.Skip(offset).Take(10).ToArray();
slice.Length.ShouldBe(10);
slice[0].ShouldBe($"STREAM-{offset:D4}");
}
catch (Exception ex)
{
errors.Enqueue(ex);
}
});
errors.ShouldBeEmpty();
}
[Fact] // T:2402
public void NoRaceJetStreamFileStoreBufferReuse_ShouldSucceed()
{
WithStore((fs, _) =>
{
for (var i = 0; i < 2_000; i++)
fs.StoreMsg($"reuse.{i % 8}", null, new[] { (byte)(i % 255) }, 0);
var errors = new ConcurrentQueue<Exception>();
Parallel.For(0, 100, i =>
{
try
{
var subject = $"reuse.{i % 8}";
var msg = fs.LoadLastMsg(subject, null);
msg.ShouldNotBeNull();
msg!.Subject.ShouldBe(subject);
}
catch (Exception ex)
{
errors.Enqueue(ex);
}
});
errors.ShouldBeEmpty();
fs.State().Msgs.ShouldBe(2_000UL);
}, DefaultStreamConfig());
}
}