test(batch26): port cross-module websocket-dependent tests

This commit is contained in:
Joseph Doherty
2026-02-28 21:53:55 -05:00
parent 59a69f82d0
commit becd3c92b0
7 changed files with 322 additions and 0 deletions

View File

@@ -330,6 +330,64 @@ public sealed partial class ConcurrencyTests2
}, cfg);
}
[Fact] // T:2488
public void NoRaceJetStreamSnapshotsWithSlowAckDontSlowConsumer_ShouldSucceed()
{
var cfg = DefaultStreamConfig();
cfg.Subjects = ["snap.>"];
WithStore((fs, _) =>
{
var errors = new ConcurrentQueue<Exception>();
using var cts = new CancellationTokenSource();
var payload = "snapshot"u8.ToArray();
var ts = DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1_000_000_000L;
var consumer = fs.ConsumerStore("snap-consumer", DateTime.UtcNow, new ConsumerConfig { AckPolicy = AckPolicy.AckExplicit });
var slowAcker = Task.Run(async () =>
{
for (ulong i = 1; i <= 100; i++)
{
try
{
consumer.UpdateDelivered(i, i, 1, ts + (long)i);
await Task.Delay(2, cts.Token);
}
catch (OperationCanceledException)
{
break;
}
catch (Exception ex)
{
errors.Enqueue(ex);
break;
}
}
});
for (var i = 0; i < 100; i++)
fs.StoreMsg($"snap.{i % 5}", null, payload, 0);
var sw = Stopwatch.StartNew();
var (snapshot, err) = fs.Snapshot(TimeSpan.FromSeconds(2), includeConsumers: true, checkMsgs: true);
sw.Stop();
err.ShouldBeNull();
snapshot.ShouldNotBeNull();
snapshot!.State.Msgs.ShouldBeGreaterThan(0UL);
sw.Elapsed.ShouldBeLessThan(TimeSpan.FromSeconds(2));
using (snapshot.Reader)
{
}
cts.Cancel();
Should.NotThrow(() => slowAcker.Wait(TimeSpan.FromSeconds(1)));
errors.ShouldBeEmpty();
consumer.Stop();
}, cfg);
}
private static void WithStore(Action<JetStreamFileStore, string> action, StreamConfig? cfg = null)
{
var root = NewRoot();