@@ -94,14 +94,27 @@ func TestDownloadWithRetries(t *testing.T) {
94
94
95
95
parsedVersion , err := agtversion .ParseVersion ("8.9.0" )
96
96
require .NoError (t , err )
97
- upgradeDetails := details .NewDetails (parsedVersion .String (), details .StateRequested , "" )
97
+
98
+ upgradeDetails , upgradeDetailsRetryUntil , upgradeDetailsRetryUntilWasUnset , upgradeDetailsRetryErrorMsg := mockUpgradeDetails (parsedVersion )
99
+ minRetryDeadline := time .Now ().Add (settings .Timeout )
100
+
98
101
path , err := u .downloadWithRetries (context .Background (), mockDownloaderCtor , parsedVersion , & settings , upgradeDetails )
99
102
require .NoError (t , err )
100
103
require .Equal (t , expectedDownloadPath , path )
101
104
102
105
logs := obs .TakeAll ()
103
106
require .Len (t , logs , 1 )
104
107
require .Equal (t , "download attempt 1" , logs [0 ].Message )
108
+
109
+ // Check that upgradeDetails.Metadata.RetryUntil was set at some point
110
+ // during the retryable download and then check that it was unset upon
111
+ // successful download.
112
+ require .GreaterOrEqual (t , * upgradeDetailsRetryUntil , minRetryDeadline )
113
+ require .True (t , * upgradeDetailsRetryUntilWasUnset )
114
+ require .Nil (t , upgradeDetails .Metadata .RetryUntil )
115
+
116
+ // Check that upgradeDetails.Metadata.RetryErrorMsg was never set.
117
+ require .Empty (t , * upgradeDetailsRetryErrorMsg )
105
118
})
106
119
107
120
// Downloader constructor failing on first attempt, but succeeding on second attempt (= first retry)
@@ -131,7 +144,10 @@ func TestDownloadWithRetries(t *testing.T) {
131
144
132
145
parsedVersion , err := agtversion .ParseVersion ("8.9.0" )
133
146
require .NoError (t , err )
134
- upgradeDetails := details .NewDetails (parsedVersion .String (), details .StateRequested , "" )
147
+
148
+ upgradeDetails , upgradeDetailsRetryUntil , upgradeDetailsRetryUntilWasUnset , upgradeDetailsRetryErrorMsg := mockUpgradeDetails (parsedVersion )
149
+ minRetryDeadline := time .Now ().Add (settings .Timeout )
150
+
135
151
path , err := u .downloadWithRetries (context .Background (), mockDownloaderCtor , parsedVersion , & settings , upgradeDetails )
136
152
require .NoError (t , err )
137
153
require .Equal (t , expectedDownloadPath , path )
@@ -141,6 +157,19 @@ func TestDownloadWithRetries(t *testing.T) {
141
157
require .Equal (t , "download attempt 1" , logs [0 ].Message )
142
158
require .Contains (t , logs [1 ].Message , "unable to create fetcher: failed to construct downloader" )
143
159
require .Equal (t , "download attempt 2" , logs [2 ].Message )
160
+
161
+ // Check that upgradeDetails.Metadata.RetryUntil was set at some point
162
+ // during the retryable download and then check that it was unset upon
163
+ // successful download.
164
+ require .GreaterOrEqual (t , * upgradeDetailsRetryUntil , minRetryDeadline )
165
+ require .True (t , * upgradeDetailsRetryUntilWasUnset )
166
+ require .Nil (t , upgradeDetails .Metadata .RetryUntil )
167
+
168
+ // Check that upgradeDetails.Metadata.RetryErrorMsg was set at some point
169
+ // during the retryable download and then check that it was unset upon
170
+ // successful download.
171
+ require .NotEmpty (t , * upgradeDetailsRetryErrorMsg )
172
+ require .Empty (t , upgradeDetails .Metadata .RetryErrorMsg )
144
173
})
145
174
146
175
// Download failing on first attempt, but succeeding on second attempt (= first retry)
@@ -170,7 +199,10 @@ func TestDownloadWithRetries(t *testing.T) {
170
199
171
200
parsedVersion , err := agtversion .ParseVersion ("8.9.0" )
172
201
require .NoError (t , err )
173
- upgradeDetails := details .NewDetails (parsedVersion .String (), details .StateRequested , "" )
202
+
203
+ upgradeDetails , upgradeDetailsRetryUntil , upgradeDetailsRetryUntilWasUnset , upgradeDetailsRetryErrorMsg := mockUpgradeDetails (parsedVersion )
204
+ minRetryDeadline := time .Now ().Add (settings .Timeout )
205
+
174
206
path , err := u .downloadWithRetries (context .Background (), mockDownloaderCtor , parsedVersion , & settings , upgradeDetails )
175
207
require .NoError (t , err )
176
208
require .Equal (t , expectedDownloadPath , path )
@@ -180,6 +212,19 @@ func TestDownloadWithRetries(t *testing.T) {
180
212
require .Equal (t , "download attempt 1" , logs [0 ].Message )
181
213
require .Contains (t , logs [1 ].Message , "unable to download package: download failed; retrying" )
182
214
require .Equal (t , "download attempt 2" , logs [2 ].Message )
215
+
216
+ // Check that upgradeDetails.Metadata.RetryUntil was set at some point
217
+ // during the retryable download and then check that it was unset upon
218
+ // successful download.
219
+ require .GreaterOrEqual (t , * upgradeDetailsRetryUntil , minRetryDeadline )
220
+ require .True (t , * upgradeDetailsRetryUntilWasUnset )
221
+ require .Nil (t , upgradeDetails .Metadata .RetryUntil )
222
+
223
+ // Check that upgradeDetails.Metadata.RetryErrorMsg was set at some point
224
+ // during the retryable download and then check that it was unset upon
225
+ // successful download.
226
+ require .NotEmpty (t , * upgradeDetailsRetryErrorMsg )
227
+ require .Empty (t , upgradeDetails .Metadata .RetryErrorMsg )
183
228
})
184
229
185
230
// Download timeout expired (before all retries are exhausted)
@@ -197,7 +242,10 @@ func TestDownloadWithRetries(t *testing.T) {
197
242
198
243
parsedVersion , err := agtversion .ParseVersion ("8.9.0" )
199
244
require .NoError (t , err )
200
- upgradeDetails := details .NewDetails (parsedVersion .String (), details .StateRequested , "" )
245
+
246
+ upgradeDetails , upgradeDetailsRetryUntil , upgradeDetailsRetryUntilWasUnset , upgradeDetailsRetryErrorMsg := mockUpgradeDetails (parsedVersion )
247
+ minRetryDeadline := time .Now ().Add (testCaseSettings .Timeout )
248
+
201
249
path , err := u .downloadWithRetries (context .Background (), mockDownloaderCtor , parsedVersion , & testCaseSettings , upgradeDetails )
202
250
require .Equal (t , "context deadline exceeded" , err .Error ())
203
251
require .Equal (t , "" , path )
@@ -209,5 +257,48 @@ func TestDownloadWithRetries(t *testing.T) {
209
257
require .Equal (t , fmt .Sprintf ("download attempt %d" , i + 1 ), logs [(2 * i )].Message )
210
258
require .Contains (t , logs [(2 * i + 1 )].Message , "unable to download package: download failed; retrying" )
211
259
}
260
+
261
+ // Check that upgradeDetails.Metadata.RetryUntil was set at some point
262
+ // during the retryable download and then check that it was never unset,
263
+ // since we didn't have a successful download.
264
+ require .GreaterOrEqual (t , * upgradeDetailsRetryUntil , minRetryDeadline )
265
+ require .False (t , * upgradeDetailsRetryUntilWasUnset )
266
+ require .Equal (t , * upgradeDetailsRetryUntil , * upgradeDetails .Metadata .RetryUntil )
267
+
268
+ // Check that upgradeDetails.Metadata.RetryErrorMsg was set at some point
269
+ // during the retryable download and then check that it was never unset,
270
+ //since we didn't have a successful download.
271
+ require .NotEmpty (t , * upgradeDetailsRetryErrorMsg )
272
+ require .Equal (t , * upgradeDetailsRetryErrorMsg , upgradeDetails .Metadata .RetryErrorMsg )
212
273
})
213
274
}
275
+
276
+ // mockUpgradeDetails returns a *details.Details value that has an observer registered on it for inspecting
277
+ // certain properties of the object being set and unset. It also returns:
278
+ // - a *time.Time value, which will be not nil if Metadata.RetryUntil is set on the mock value,
279
+ // - a *bool value, which will be true if Metadata.RetryUntil is set and then unset on the mock value,
280
+ // - a *string value, which will be non-empty if Metadata.RetryErrorMsg is set on the mock value.
281
+ func mockUpgradeDetails (parsedVersion * agtversion.ParsedSemVer ) (* details.Details , * time.Time , * bool , * string ) {
282
+ var upgradeDetailsRetryUntil time.Time
283
+ var upgradeDetailsRetryUntilWasUnset bool
284
+ var upgradeDetailsRetryErrorMsg string
285
+
286
+ upgradeDetails := details .NewDetails (parsedVersion .String (), details .StateRequested , "" )
287
+ upgradeDetails .RegisterObserver (func (details * details.Details ) {
288
+ if details .Metadata .RetryUntil != nil {
289
+ upgradeDetailsRetryUntil = * details .Metadata .RetryUntil
290
+ }
291
+
292
+ if ! upgradeDetailsRetryUntil .IsZero () && details .Metadata .RetryUntil == nil {
293
+ upgradeDetailsRetryUntilWasUnset = true
294
+ }
295
+
296
+ if details .Metadata .RetryErrorMsg != "" {
297
+ upgradeDetailsRetryErrorMsg = details .Metadata .RetryErrorMsg
298
+ }
299
+ })
300
+
301
+ return upgradeDetails ,
302
+ & upgradeDetailsRetryUntil , & upgradeDetailsRetryUntilWasUnset ,
303
+ & upgradeDetailsRetryErrorMsg
304
+ }
0 commit comments