Skip to content

Commit 2aa4299

Browse files
committed
test: retry poll timeout
1 parent 7b3e2b0 commit 2aa4299

File tree

1 file changed

+63
-52
lines changed

1 file changed

+63
-52
lines changed

internal/deliverymq/retry_test.go

Lines changed: 63 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,18 @@ import (
1919
)
2020

2121
type RetryDeliveryMQSuite struct {
22-
ctx context.Context
23-
mqConfig *mqs.QueueConfig
24-
retryMaxCount int
25-
retryBackoff backoff.Backoff
26-
publisher deliverymq.Publisher
27-
eventGetter deliverymq.EventGetter
28-
logPublisher deliverymq.LogPublisher
29-
destGetter deliverymq.DestinationGetter
30-
alertMonitor deliverymq.AlertMonitor
31-
deliveryMQ *deliverymq.DeliveryMQ
32-
teardown func()
22+
ctx context.Context
23+
mqConfig *mqs.QueueConfig
24+
retryMaxCount int
25+
retryBackoff backoff.Backoff
26+
schedulerPollBackoff time.Duration
27+
publisher deliverymq.Publisher
28+
eventGetter deliverymq.EventGetter
29+
logPublisher deliverymq.LogPublisher
30+
destGetter deliverymq.DestinationGetter
31+
alertMonitor deliverymq.AlertMonitor
32+
deliveryMQ *deliverymq.DeliveryMQ
33+
teardown func()
3334
}
3435

3536
func (s *RetryDeliveryMQSuite) SetupTest(t *testing.T) {
@@ -47,7 +48,12 @@ func (s *RetryDeliveryMQSuite) SetupTest(t *testing.T) {
4748
require.NoError(t, err)
4849

4950
// Setup retry scheduler
50-
retryScheduler, err := deliverymq.NewRetryScheduler(s.deliveryMQ, testutil.CreateTestRedisConfig(t), "", 100*time.Millisecond, testutil.CreateTestLogger(t))
51+
// Use provided poll backoff or default to 100ms
52+
pollBackoff := s.schedulerPollBackoff
53+
if pollBackoff == 0 {
54+
pollBackoff = 100 * time.Millisecond
55+
}
56+
retryScheduler, err := deliverymq.NewRetryScheduler(s.deliveryMQ, testutil.CreateTestRedisConfig(t), "", pollBackoff, testutil.CreateTestLogger(t))
5157
require.NoError(t, err)
5258
require.NoError(t, retryScheduler.Init(s.ctx))
5359
go retryScheduler.Monitor(s.ctx)
@@ -130,15 +136,16 @@ func TestDeliveryMQRetry_EligibleForRetryFalse(t *testing.T) {
130136
eventGetter.registerEvent(&event)
131137

132138
suite := &RetryDeliveryMQSuite{
133-
ctx: ctx,
134-
mqConfig: &mqs.QueueConfig{InMemory: &mqs.InMemoryConfig{Name: testutil.RandomString(5)}},
135-
publisher: publisher,
136-
eventGetter: eventGetter,
137-
logPublisher: newMockLogPublisher(nil),
138-
destGetter: &mockDestinationGetter{dest: &destination},
139-
alertMonitor: newMockAlertMonitor(),
140-
retryMaxCount: 10,
141-
retryBackoff: &backoff.ConstantBackoff{Interval: 50 * time.Millisecond},
139+
ctx: ctx,
140+
mqConfig: &mqs.QueueConfig{InMemory: &mqs.InMemoryConfig{Name: testutil.RandomString(5)}},
141+
publisher: publisher,
142+
eventGetter: eventGetter,
143+
logPublisher: newMockLogPublisher(nil),
144+
destGetter: &mockDestinationGetter{dest: &destination},
145+
alertMonitor: newMockAlertMonitor(),
146+
retryMaxCount: 10,
147+
retryBackoff: &backoff.ConstantBackoff{Interval: 50 * time.Millisecond},
148+
schedulerPollBackoff: 10 * time.Millisecond,
142149
}
143150
suite.SetupTest(t)
144151
defer suite.TeardownTest(t)
@@ -192,15 +199,16 @@ func TestDeliveryMQRetry_EligibleForRetryTrue(t *testing.T) {
192199
eventGetter.registerEvent(&event)
193200

194201
suite := &RetryDeliveryMQSuite{
195-
ctx: ctx,
196-
mqConfig: &mqs.QueueConfig{InMemory: &mqs.InMemoryConfig{Name: testutil.RandomString(5)}},
197-
publisher: publisher,
198-
eventGetter: eventGetter,
199-
logPublisher: newMockLogPublisher(nil),
200-
destGetter: &mockDestinationGetter{dest: &destination},
201-
alertMonitor: newMockAlertMonitor(),
202-
retryMaxCount: 10,
203-
retryBackoff: &backoff.ConstantBackoff{Interval: 50 * time.Millisecond},
202+
ctx: ctx,
203+
mqConfig: &mqs.QueueConfig{InMemory: &mqs.InMemoryConfig{Name: testutil.RandomString(5)}},
204+
publisher: publisher,
205+
eventGetter: eventGetter,
206+
logPublisher: newMockLogPublisher(nil),
207+
destGetter: &mockDestinationGetter{dest: &destination},
208+
alertMonitor: newMockAlertMonitor(),
209+
retryMaxCount: 10,
210+
retryBackoff: &backoff.ConstantBackoff{Interval: 50 * time.Millisecond},
211+
schedulerPollBackoff: 10 * time.Millisecond,
204212
}
205213
suite.SetupTest(t)
206214
defer suite.TeardownTest(t)
@@ -212,10 +220,11 @@ func TestDeliveryMQRetry_EligibleForRetryTrue(t *testing.T) {
212220
}
213221
require.NoError(t, suite.deliveryMQ.Publish(ctx, deliveryEvent))
214222

215-
// Wait for all attempts to complete (3 attempts with 50ms backoff = ~150ms)
223+
// Wait for all attempts to complete
224+
// Note: 50ms backoff + 10ms poll interval = fast, deterministic retries
216225
require.Eventually(t, func() bool {
217226
return publisher.Current() >= 3
218-
}, 3*time.Second, 10*time.Millisecond, "should complete 3 attempts (2 failures + 1 success)")
227+
}, 5*time.Second, 10*time.Millisecond, "should complete 3 attempts (2 failures + 1 success)")
219228

220229
assert.Equal(t, 3, publisher.Current(), "should retry until success (2 failures + 1 success)")
221230
}
@@ -248,15 +257,16 @@ func TestDeliveryMQRetry_SystemError(t *testing.T) {
248257
eventGetter.registerEvent(&event)
249258

250259
suite := &RetryDeliveryMQSuite{
251-
ctx: ctx,
252-
mqConfig: &mqs.QueueConfig{InMemory: &mqs.InMemoryConfig{Name: testutil.RandomString(5)}},
253-
publisher: newMockPublisher(nil), // publisher won't be called due to early error
254-
eventGetter: eventGetter,
255-
logPublisher: newMockLogPublisher(nil),
256-
destGetter: destGetter,
257-
alertMonitor: newMockAlertMonitor(),
258-
retryMaxCount: 10,
259-
retryBackoff: &backoff.ConstantBackoff{Interval: 50 * time.Millisecond},
260+
ctx: ctx,
261+
mqConfig: &mqs.QueueConfig{InMemory: &mqs.InMemoryConfig{Name: testutil.RandomString(5)}},
262+
publisher: newMockPublisher(nil), // publisher won't be called due to early error
263+
eventGetter: eventGetter,
264+
logPublisher: newMockLogPublisher(nil),
265+
destGetter: destGetter,
266+
alertMonitor: newMockAlertMonitor(),
267+
retryMaxCount: 10,
268+
retryBackoff: &backoff.ConstantBackoff{Interval: 50 * time.Millisecond},
269+
schedulerPollBackoff: 10 * time.Millisecond,
260270
}
261271
suite.SetupTest(t)
262272
defer suite.TeardownTest(t)
@@ -317,15 +327,16 @@ func TestDeliveryMQRetry_RetryMaxCount(t *testing.T) {
317327
eventGetter.registerEvent(&event)
318328

319329
suite := &RetryDeliveryMQSuite{
320-
ctx: ctx,
321-
mqConfig: &mqs.QueueConfig{InMemory: &mqs.InMemoryConfig{Name: testutil.RandomString(5)}},
322-
publisher: publisher,
323-
eventGetter: eventGetter,
324-
logPublisher: newMockLogPublisher(nil),
325-
destGetter: &mockDestinationGetter{dest: &destination},
326-
alertMonitor: newMockAlertMonitor(),
327-
retryMaxCount: 2, // 1 initial + 2 retries = 3 total attempts
328-
retryBackoff: &backoff.ConstantBackoff{Interval: 50 * time.Millisecond}, // Fast backoff for testing
330+
ctx: ctx,
331+
mqConfig: &mqs.QueueConfig{InMemory: &mqs.InMemoryConfig{Name: testutil.RandomString(5)}},
332+
publisher: publisher,
333+
eventGetter: eventGetter,
334+
logPublisher: newMockLogPublisher(nil),
335+
destGetter: &mockDestinationGetter{dest: &destination},
336+
alertMonitor: newMockAlertMonitor(),
337+
retryMaxCount: 2, // 1 initial + 2 retries = 3 total attempts
338+
retryBackoff: &backoff.ConstantBackoff{Interval: 50 * time.Millisecond},
339+
schedulerPollBackoff: 10 * time.Millisecond,
329340
}
330341
suite.SetupTest(t)
331342
defer suite.TeardownTest(t)
@@ -338,10 +349,10 @@ func TestDeliveryMQRetry_RetryMaxCount(t *testing.T) {
338349
require.NoError(t, suite.deliveryMQ.Publish(ctx, deliveryEvent))
339350

340351
// Poll until we get 3 attempts or timeout
341-
// With 50ms backoff: initial + 50ms + retry + 50ms + retry = ~150ms minimum
352+
// With 50ms backoff + 10ms poll: initial + 60ms + retry + 60ms + retry = ~150ms minimum
342353
require.Eventually(t, func() bool {
343354
return publisher.Current() >= 3
344-
}, 3*time.Second, 10*time.Millisecond, "should complete 3 attempts (1 initial + 2 retries)")
355+
}, 5*time.Second, 10*time.Millisecond, "should complete 3 attempts (1 initial + 2 retries)")
345356

346357
assert.Equal(t, 3, publisher.Current(), "should stop after max retries (1 initial + 2 retries = 3 total attempts)")
347358
}

0 commit comments

Comments
 (0)