feat: harden jetstream consumer state machine parity
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
using NATS.Server.JetStream;
|
||||
using NATS.Server.JetStream.Models;
|
||||
|
||||
namespace NATS.Server.Tests.JetStream;
|
||||
|
||||
public class JetStreamConsumerStateMachineStrictParityTests
|
||||
{
|
||||
[Fact]
|
||||
public async Task Ack_redelivery_backoff_and_replay_timing_follow_monotonic_consumer_state_machine_rules()
|
||||
{
|
||||
var streams = new StreamManager();
|
||||
var consumers = new ConsumerManager();
|
||||
|
||||
streams.CreateOrUpdate(new StreamConfig
|
||||
{
|
||||
Name = "ORDERS_SM",
|
||||
Subjects = ["orders.sm"],
|
||||
Retention = RetentionPolicy.Limits,
|
||||
MaxMsgs = 32,
|
||||
}).Error.ShouldBeNull();
|
||||
|
||||
consumers.CreateOrUpdate("ORDERS_SM", new ConsumerConfig
|
||||
{
|
||||
DurableName = "D1",
|
||||
AckPolicy = AckPolicy.Explicit,
|
||||
AckWaitMs = 1,
|
||||
MaxDeliver = 1,
|
||||
BackOffMs = [1],
|
||||
}).Error.ShouldBeNull();
|
||||
|
||||
streams.Capture("orders.sm", "x"u8.ToArray());
|
||||
|
||||
var first = await consumers.FetchAsync("ORDERS_SM", "D1", 1, streams, default);
|
||||
first.Messages.Count.ShouldBe(1);
|
||||
|
||||
await Task.Delay(5);
|
||||
var second = await consumers.FetchAsync("ORDERS_SM", "D1", 1, streams, default);
|
||||
|
||||
// MaxDeliver=1 means the initial delivery is the only allowed delivery.
|
||||
second.Messages.Count.ShouldBe(0);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user