Skip to content

Commit 92d7d70

Browse files
committed
Add unit tests for the retry heuristics
Signed-off-by: Miloslav Trmač <mitr@redhat.com>
1 parent 68e7485 commit 92d7d70

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

docker/body_reader_test.go

+86
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
package docker
22

33
import (
4+
"errors"
5+
"math"
46
"net/http"
57
"testing"
8+
"time"
69

10+
"github.com/sirupsen/logrus"
711
"github.com/stretchr/testify/assert"
812
"github.com/stretchr/testify/require"
913
)
@@ -108,3 +112,85 @@ func TestParseContentRange(t *testing.T) {
108112
assert.Error(t, err, c, c)
109113
}
110114
}
115+
116+
func TestMillisecondsSinceOptional(t *testing.T) {
117+
current := time.Date(2023, 2, 9, 8, 7, 6, 5, time.UTC)
118+
res := millisecondsSinceOptional(current, time.Time{})
119+
assert.True(t, math.IsNaN(res))
120+
tm := current.Add(-60 * time.Second) // 60 seconds _before_ current
121+
res = millisecondsSinceOptional(current, tm)
122+
assert.Equal(t, res, 60_000.0)
123+
}
124+
125+
func TestBodyReaderErrorIfNotReconnecting(t *testing.T) {
126+
// Silence logrus.Info logs in the tested method
127+
prevLevel := logrus.StandardLogger().Level
128+
logrus.StandardLogger().SetLevel(logrus.WarnLevel)
129+
t.Cleanup(func() {
130+
logrus.StandardLogger().SetLevel(prevLevel)
131+
})
132+
133+
for _, c := range []struct {
134+
name string
135+
previousRetry bool
136+
currentOffset int64
137+
currentTime int // milliseconds
138+
expectReconnect bool
139+
}{
140+
{
141+
name: "A lot of progress, after a long time, second retry",
142+
previousRetry: true,
143+
currentOffset: 2 * bodyReaderMinimumProgress,
144+
currentTime: 2 * bodyReaderMSSinceLastRetry,
145+
expectReconnect: true,
146+
},
147+
{
148+
name: "A lot of progress, after little time, second retry",
149+
previousRetry: true,
150+
currentOffset: 2 * bodyReaderMinimumProgress,
151+
currentTime: 1,
152+
expectReconnect: true,
153+
},
154+
{
155+
name: "Little progress, after a long time, second retry",
156+
previousRetry: true,
157+
currentOffset: 1,
158+
currentTime: 2 * bodyReaderMSSinceLastRetry,
159+
expectReconnect: true,
160+
},
161+
{
162+
name: "Little progress, after little time, second retry",
163+
previousRetry: true,
164+
currentOffset: 1,
165+
currentTime: 1,
166+
expectReconnect: false,
167+
},
168+
{
169+
name: "Little progress, after little time, first retry",
170+
previousRetry: false,
171+
currentOffset: 1,
172+
currentTime: bodyReaderMSSinceLastRetry / 2,
173+
expectReconnect: true,
174+
},
175+
} {
176+
tm := time.Now()
177+
br := bodyReader{}
178+
if c.previousRetry {
179+
br.lastRetryOffset = 2 * bodyReaderMinimumProgress
180+
br.offset = br.lastRetryOffset + c.currentOffset
181+
br.firstConnectionTime = tm.Add(-time.Duration(c.currentTime+2*bodyReaderMSSinceLastRetry) * time.Millisecond)
182+
br.lastRetryTime = tm.Add(-time.Duration(c.currentTime) * time.Millisecond)
183+
} else {
184+
br.lastRetryOffset = -1
185+
br.lastRetryTime = time.Time{}
186+
br.offset = c.currentOffset
187+
br.firstConnectionTime = tm.Add(-time.Duration(c.currentTime) * time.Millisecond)
188+
}
189+
err := br.errorIfNotReconnecting(errors.New("some error for error text only"), "URL for error text only")
190+
if c.expectReconnect {
191+
assert.NoError(t, err, c.name, br)
192+
} else {
193+
assert.Error(t, err, c.name, br)
194+
}
195+
}
196+
}

0 commit comments

Comments
 (0)