feat: enforce jetstream retention and limits

This commit is contained in:
Joseph Doherty
2026-02-23 06:04:23 -05:00
parent 95691fa9e7
commit d73e7e2f88
6 changed files with 107 additions and 8 deletions

View File

@@ -1,6 +1,7 @@
using System.Text;
using NATS.Server.JetStream;
using NATS.Server.JetStream.Api;
using NATS.Server.JetStream.Models;
using NATS.Server.JetStream.Publish;
namespace NATS.Server.Tests;
@@ -47,5 +48,10 @@ internal sealed class JetStreamApiFixture : IAsyncDisposable
return Task.FromResult(_router.Route(subject, Encoding.UTF8.GetBytes(payload)));
}
public Task<StreamState> GetStreamStateAsync(string streamName)
{
return _streamManager.GetStateAsync(streamName, default).AsTask();
}
public ValueTask DisposeAsync() => ValueTask.CompletedTask;
}

View File

@@ -0,0 +1,18 @@
namespace NATS.Server.Tests;
public class JetStreamRetentionPolicyTests
{
[Fact]
public async Task MaxMsgs_limit_evicts_oldest_message()
{
await using var fixture = await JetStreamApiFixture.StartWithStreamAsync("L", "l.*", maxMsgs: 2);
await fixture.PublishAndGetAckAsync("l.1", "a");
await fixture.PublishAndGetAckAsync("l.2", "b");
await fixture.PublishAndGetAckAsync("l.3", "c");
var state = await fixture.GetStreamStateAsync("L");
state.Messages.ShouldBe((ulong)2);
state.FirstSeq.ShouldBe((ulong)2);
}
}