Skip to content

Commit 3118a93

Browse files
test: increase coverage
1 parent 8e986d3 commit 3118a93

File tree

2 files changed

+108
-20
lines changed

2 files changed

+108
-20
lines changed

pkg/smartrequeue/entry.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ func newEntry(s *Store) *Entry {
2424
// so that the controller-runtime can handle the exponential backoff for errors.
2525
func (e *Entry) Error(err error) (ctrl.Result, error) {
2626
e.nextDuration = e.store.minInterval
27-
e.setNext()
2827
return ctrl.Result{}, err
2928
}
3029

pkg/smartrequeue/entry_test.go

Lines changed: 108 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,125 @@
11
package smartrequeue
22

33
import (
4+
"errors"
45
"testing"
56
"time"
67

78
"github.com/stretchr/testify/assert"
9+
"github.com/stretchr/testify/require"
810
ctrl "sigs.k8s.io/controller-runtime"
911
)
1012

11-
func Test_Entry(t *testing.T) {
12-
entry := newEntry(NewStore(time.Second, time.Minute, 2))
13+
// Helper function to get requeue duration from Result
14+
func getRequeueAfter(res ctrl.Result, _ error) time.Duration {
15+
return res.RequeueAfter.Round(time.Second)
16+
}
17+
18+
func TestEntry_Stable(t *testing.T) {
19+
// Setup
20+
store := NewStore(time.Second, time.Minute, 2)
21+
entry := newEntry(store)
22+
23+
// Test the exponential backoff behavior
24+
t.Run("exponential backoff sequence", func(t *testing.T) {
25+
expectedDurations := []time.Duration{
26+
1 * time.Second,
27+
2 * time.Second,
28+
4 * time.Second,
29+
8 * time.Second,
30+
16 * time.Second,
31+
32 * time.Second,
32+
60 * time.Second, // Capped at maxInterval
33+
60 * time.Second, // Still capped
34+
}
1335

14-
assert.Equal(t, 1*time.Second, getRequeueAfter(entry.Stable()))
15-
assert.Equal(t, 2*time.Second, getRequeueAfter(entry.Stable()))
16-
assert.Equal(t, 4*time.Second, getRequeueAfter(entry.Stable()))
17-
assert.Equal(t, 8*time.Second, getRequeueAfter(entry.Stable()))
18-
assert.Equal(t, 16*time.Second, getRequeueAfter(entry.Stable()))
19-
assert.Equal(t, 32*time.Second, getRequeueAfter(entry.Stable()))
20-
assert.Equal(t, 60*time.Second, getRequeueAfter(entry.Stable()))
21-
assert.Equal(t, 60*time.Second, getRequeueAfter(entry.Stable()))
36+
for i, expected := range expectedDurations {
37+
result, err := entry.Stable()
38+
require.NoError(t, err)
39+
assert.Equal(t, expected, getRequeueAfter(result, err), "Iteration %d should have correct duration", i)
40+
}
41+
})
42+
}
43+
44+
func TestEntry_Progressing(t *testing.T) {
45+
// Setup
46+
minInterval := time.Second
47+
maxInterval := time.Minute
48+
store := NewStore(minInterval, maxInterval, 2)
49+
entry := newEntry(store)
50+
51+
// Ensure state is not at minimum
52+
_, _ = entry.Stable()
53+
_, _ = entry.Stable()
2254

23-
assert.Equal(t, 1*time.Second, getRequeueAfter(entry.Progressing()))
24-
assert.Equal(t, 1*time.Second, getRequeueAfter(entry.Progressing()))
55+
// Test progressing resets duration to minimum
56+
t.Run("resets to minimum interval", func(t *testing.T) {
57+
result, err := entry.Progressing()
58+
require.NoError(t, err)
59+
assert.Equal(t, minInterval, getRequeueAfter(result, err))
2560

26-
assert.Equal(t, 2*time.Second, getRequeueAfter(entry.Stable()))
27-
assert.Equal(t, 4*time.Second, getRequeueAfter(entry.Stable()))
61+
// Second call should also return min interval with small increment
62+
result, err = entry.Progressing()
63+
require.NoError(t, err)
64+
assert.Equal(t, minInterval, getRequeueAfter(result, err))
65+
})
2866

29-
assert.Equal(t, 0*time.Second, getRequeueAfter(entry.Error(assert.AnError)))
30-
assert.Equal(t, 2*time.Second, getRequeueAfter(entry.Stable()))
31-
assert.Equal(t, 4*time.Second, getRequeueAfter(entry.Stable()))
67+
// After progressing, Stable should restart exponential backoff
68+
t.Run("stable continues from minimum", func(t *testing.T) {
69+
result, err := entry.Stable()
70+
require.NoError(t, err)
71+
assert.Equal(t, 2*time.Second, getRequeueAfter(result, err))
72+
73+
result, err = entry.Stable()
74+
require.NoError(t, err)
75+
assert.Equal(t, 4*time.Second, getRequeueAfter(result, err))
76+
})
3277
}
3378

34-
func getRequeueAfter(res ctrl.Result, _ error) time.Duration {
35-
return res.RequeueAfter.Round(time.Second)
79+
func TestEntry_Error(t *testing.T) {
80+
// Setup
81+
store := NewStore(time.Second, time.Minute, 2)
82+
entry := newEntry(store)
83+
testErr := errors.New("test error")
84+
85+
// Ensure state is not at minimum
86+
_, _ = entry.Stable()
87+
_, _ = entry.Stable()
88+
89+
// Test error handling
90+
t.Run("returns error and resets backoff", func(t *testing.T) {
91+
result, err := entry.Error(testErr)
92+
assert.Equal(t, testErr, err, "Should return the passed error")
93+
assert.Equal(t, 0*time.Second, getRequeueAfter(result, err), "Should have zero requeue time")
94+
})
95+
96+
// After error, stable should continue from minimum
97+
t.Run("stable continues properly after error", func(t *testing.T) {
98+
result, err := entry.Stable()
99+
require.NoError(t, err)
100+
assert.Equal(t, time.Second, getRequeueAfter(result, err))
101+
102+
result, err = entry.Stable()
103+
require.NoError(t, err)
104+
assert.Equal(t, 2*time.Second, getRequeueAfter(result, err))
105+
})
106+
}
107+
108+
func TestEntry_Never(t *testing.T) {
109+
// Setup with store spy to verify deletion
110+
store := NewStore(time.Second, time.Minute, 2)
111+
entry := newEntry(store)
112+
113+
// Call some methods first to ensure we have state
114+
_, _ = entry.Stable()
115+
116+
// Test Never
117+
t.Run("returns empty result and no error", func(t *testing.T) {
118+
result, err := entry.Never()
119+
assert.NoError(t, err)
120+
assert.Equal(t, 0*time.Second, getRequeueAfter(result, err))
121+
})
122+
123+
// Therotically, we should verify that the entry is deleted from the store.
124+
// Since we don't have direct access to store internals here, this is not possible.
36125
}

0 commit comments

Comments
 (0)