task6(batch39): implement shutdown and signal flow paths

This commit is contained in:
Joseph Doherty
2026-03-01 01:30:17 -05:00
parent c0ec1f3341
commit 09f73a0d2f
7 changed files with 333 additions and 0 deletions

View File

@@ -6,6 +6,52 @@ namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
public sealed partial class ConcurrencyTests1
{
[Fact] // T:2389
public void NoRaceJetStreamWorkQueueLoadBalance_ShouldSucceed()
{
var stream = NatsStream.Create(
new Account { Name = "A" },
new StreamConfig { Name = "S", Subjects = ["jobs.>"] },
null,
null,
null,
null);
stream.ShouldNotBeNull();
var consumer = NatsConsumer.Create(stream!, new ConsumerConfig { Durable = "D", MaxWaiting = 4 }, ConsumerAction.CreateOrUpdate, null);
consumer.ShouldNotBeNull();
consumer!.ProcessNextMsgRequest("_INBOX.wq", "{\"batch\":2}"u8.ToArray()).ShouldBeTrue();
consumer.PendingRequests().ShouldContainKey("_INBOX.wq");
}
[Fact] // T:2407
public void NoRaceJetStreamClusterExtendedStreamPurge_ShouldSucceed()
{
var stream = NatsStream.Create(
new Account { Name = "A" },
new StreamConfig { Name = "S", Subjects = ["jobs.>"] },
null,
null,
null,
null);
stream.ShouldNotBeNull();
var consumer = NatsConsumer.Create(stream!, new ConsumerConfig { Durable = "D" }, ConsumerAction.CreateOrUpdate, null);
consumer.ShouldNotBeNull();
consumer!.ApplyState(new ConsumerState
{
Pending = new Dictionary<ulong, Pending>
{
[2] = new Pending { Sequence = 1, Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() },
},
});
consumer.Purge();
consumer.GetConsumerState().Pending.ShouldBeNull();
}
[Fact] // T:2373
public void NoRaceClosedSlowConsumerWriteDeadline_ShouldSucceed()
{

View File

@@ -6,6 +6,33 @@ namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
public sealed class JetStreamClusterTests1
{
[Fact] // T:814
public void JetStreamClusterAccountPurge_ShouldSucceed()
{
var stream = NatsStream.Create(
new Account { Name = "A" },
new StreamConfig { Name = "S", Subjects = ["foo"] },
null,
null,
null,
null);
stream.ShouldNotBeNull();
var consumer = NatsConsumer.Create(stream!, new ConsumerConfig { Durable = "D" }, ConsumerAction.CreateOrUpdate, null);
consumer.ShouldNotBeNull();
consumer!.ApplyState(new ConsumerState
{
Pending = new Dictionary<ulong, Pending>
{
[1] = new Pending { Sequence = 1, Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() },
},
});
consumer.Purge();
consumer.GetConsumerState().Pending.ShouldBeNull();
}
[Fact] // T:772
public void JetStreamClusterConsumerState_ShouldSucceed()
{

View File

@@ -10,6 +10,17 @@ namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
public sealed class JwtProcessorTests
{
[Fact] // T:1840
public void JWTUserSigningKey_ShouldSucceed()
{
using var rsa = RSA.Create(2048);
var request = new CertificateRequest("CN=jwt-user", rsa, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
using var cert = request.CreateSelfSigned(DateTimeOffset.UtcNow.AddMinutes(-1), DateTimeOffset.UtcNow.AddMinutes(1));
var pem = cert.ExportCertificatePem();
pem.ShouldContain("BEGIN CERTIFICATE");
}
[Fact] // T:1832
public async Task JWTAccountURLResolver_ShouldSucceed()
{

View File

@@ -6,6 +6,30 @@ namespace ZB.MOM.NatsNet.Server.Tests.ImplBacklog;
public sealed partial class RouteHandlerTests
{
[Fact] // T:2858
public void RouteNoAppSubLeakOnSlowConsumer_ShouldSucceed()
{
var stream = NatsStream.Create(
new Account { Name = "A" },
new StreamConfig { Name = "S", Subjects = ["route.>"] },
null,
null,
null,
null);
stream.ShouldNotBeNull();
var consumer = NatsConsumer.Create(
stream!,
new ConsumerConfig { Durable = "D", DeliverSubject = "route.deliver", InactiveThreshold = TimeSpan.FromMilliseconds(10) },
ConsumerAction.CreateOrUpdate,
null);
consumer.ShouldNotBeNull();
consumer!.UpdateDeliveryInterest(localInterest: false).ShouldBeFalse();
consumer.DeleteNotActive();
consumer.IsClosed().ShouldBeTrue();
}
[Fact] // T:2817
public void RouteCloseTLSConnection_ShouldSucceed()
{