Skip to content

Commit 3b27436

Browse files
committed
add integration tests for claimMinIdleTime
1 parent e03029b commit 3b27436

File tree

2 files changed

+54
-3
lines changed

2 files changed

+54
-3
lines changed

src/StackExchange.Redis/RedisFeatures.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ namespace StackExchange.Redis
4646
v7_4_0_rc1 = new Version(7, 3, 240), // 7.4 RC1 is version 7.3.240
4747
v7_4_0_rc2 = new Version(7, 3, 241), // 7.4 RC2 is version 7.3.241
4848
v8_0_0_M04 = new Version(7, 9, 227), // 8.0 M04 is version 7.9.227
49-
v8_2_0_rc1 = new Version(8, 1, 240); // 8.2 RC1 is version 8.1.240
49+
v8_2_0_rc1 = new Version(8, 1, 240), // 8.2 RC1 is version 8.1.240
50+
v8_4_0_rc1 = new Version(8, 3, 224); // 8.2 RC1 is version 8.3.224
5051

5152
#pragma warning restore SA1310 // Field names should not contain underscore
5253
#pragma warning restore SA1311 // Static readonly fields should begin with upper-case letter

tests/StackExchange.Redis.Tests/StreamTests.cs

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -495,8 +495,8 @@ public async Task StreamConsumerGroupSetId()
495495

496496
var db = conn.GetDatabase();
497497
var key = Me();
498-
const string groupName = "test_group",
499-
consumer = "consumer";
498+
await db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
499+
const string groupName = "test_group", consumer = "consumer";
500500

501501
// Create a stream
502502
db.StreamAdd(key, "field1", "value1");
@@ -519,6 +519,56 @@ public async Task StreamConsumerGroupSetId()
519519
Assert.Equal(2, secondRead.Length);
520520
}
521521

522+
[Fact]
523+
public async Task StreamConsumerGroupAutoClaim()
524+
{
525+
await using var conn = Create(require: RedisFeatures.v8_4_0_rc1);
526+
527+
var db = conn.GetDatabase();
528+
var key = Me();
529+
await db.KeyDeleteAsync(key, CommandFlags.FireAndForget);
530+
const string groupName = "test_group", consumer = "consumer";
531+
532+
// Create a group and set the position to deliver new messages only.
533+
await db.StreamCreateConsumerGroupAsync(key, groupName, StreamPosition.NewMessages);
534+
535+
// add some entries
536+
await db.StreamAddAsync(key, "field1", "value1");
537+
await db.StreamAddAsync(key, "field2", "value2");
538+
539+
var idleTime = TimeSpan.FromMilliseconds(100);
540+
// Read into the group, expect the two entries; we don't expect any data
541+
// here, at least on a fast server, because it hasn't been idle long enough.
542+
StreamPosition[] positions = [new(key, StreamPosition.NewMessages)];
543+
var groups = await db.StreamReadGroupAsync(positions, groupName, consumer, noAck: false, countPerStream: 10, claimMinIdleTime: idleTime);
544+
var grp = Assert.Single(groups);
545+
Assert.Equal(key, grp.Key);
546+
Assert.Equal(2, grp.Entries.Length);
547+
foreach (var entry in grp.Entries)
548+
{
549+
Assert.Equal(0, entry.DeliveryCount); // never delivered before
550+
Assert.Equal(TimeSpan.Zero, entry.IdleTime); // never delivered before
551+
}
552+
553+
// now repeat immediately; we didn't "ack", so they're still pending, but not idle long enough
554+
groups = await db.StreamReadGroupAsync(positions, groupName, consumer, noAck: false, countPerStream: 10, claimMinIdleTime: idleTime);
555+
Assert.Empty(groups); // nothing available from any group
556+
557+
// wait long enough for the messages to be considered idle
558+
await Task.Delay(idleTime + idleTime);
559+
560+
// repeat again; we should get the entries
561+
groups = await db.StreamReadGroupAsync(positions, groupName, consumer, noAck: false, countPerStream: 10, claimMinIdleTime: idleTime);
562+
grp = Assert.Single(groups);
563+
Assert.Equal(key, grp.Key);
564+
Assert.Equal(2, grp.Entries.Length);
565+
foreach (var entry in grp.Entries)
566+
{
567+
Assert.Equal(1, entry.DeliveryCount); // this is a redelivery
568+
Assert.True(entry.IdleTime > TimeSpan.Zero); // and is considered idle
569+
}
570+
}
571+
522572
[Fact]
523573
public async Task StreamConsumerGroupWithNoConsumers()
524574
{

0 commit comments

Comments
 (0)