@@ -11,8 +11,10 @@ import (
11
11
"github.com/Azure/azure-sdk-for-go/sdk/azcore/to"
12
12
"github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus"
13
13
. "github.com/onsi/gomega"
14
+ "github.com/prometheus/client_golang/prometheus"
14
15
15
16
"github.com/Azure/go-shuttle/v2"
17
+ "github.com/Azure/go-shuttle/v2/metrics/processor"
16
18
)
17
19
18
20
type fakeSBLockRenewer struct {
@@ -150,24 +152,40 @@ func Test_RenewPeriodically_Error(t *testing.T) {
150
152
isRenewerCanceled bool
151
153
cancelCtxOnStop * bool
152
154
gotMessageCtx context.Context
153
- verify func (g Gomega , tc * testCase )
155
+ verify func (g Gomega , tc * testCase , metrics * processor. Informer )
154
156
}
155
157
testCases := []testCase {
156
158
{
157
159
name : "continue periodic renewal on unknown error" ,
158
160
renewer : & fakeSBLockRenewer {Err : fmt .Errorf ("unknown error" )},
159
- verify : func (g Gomega , tc * testCase ) {
161
+ verify : func (g Gomega , tc * testCase , metrics * processor. Informer ) {
160
162
g .Eventually (
161
163
func (g Gomega ) { g .Expect (tc .renewer .RenewCount .Load ()).To (Equal (int32 (2 ))) },
162
164
130 * time .Millisecond ,
163
165
20 * time .Millisecond ).Should (Succeed ())
164
166
},
165
167
},
168
+ {
169
+ name : "stop periodic renewal on context canceled" ,
170
+ isRenewerCanceled : false ,
171
+ renewer : & fakeSBLockRenewer {Err : context .Canceled },
172
+ verify : func (g Gomega , tc * testCase , metrics * processor.Informer ) {
173
+ g .Consistently (
174
+ func (g Gomega ) {
175
+ g .Expect (tc .renewer .RenewCount .Load ()).To (Equal (int32 (1 )),
176
+ "should not attempt to renew" )
177
+ g .Expect (metrics .GetMessageLockRenewedFailureCount ()).To (Equal (float64 (0 )),
178
+ "should not record failure metric" )
179
+ },
180
+ 130 * time .Millisecond ,
181
+ 20 * time .Millisecond ).Should (Succeed ())
182
+ },
183
+ },
166
184
{
167
185
name : "stop periodic renewal on context canceled" ,
168
186
isRenewerCanceled : true ,
169
187
renewer : & fakeSBLockRenewer {Err : context .Canceled },
170
- verify : func (g Gomega , tc * testCase ) {
188
+ verify : func (g Gomega , tc * testCase , metrics * processor. Informer ) {
171
189
g .Consistently (
172
190
func (g Gomega ) { g .Expect (tc .renewer .RenewCount .Load ()).To (Equal (int32 (0 ))) },
173
191
130 * time .Millisecond ,
@@ -177,7 +195,7 @@ func Test_RenewPeriodically_Error(t *testing.T) {
177
195
{
178
196
name : "stop periodic renewal on permanent error (lockLost)" ,
179
197
renewer : & fakeSBLockRenewer {Err : & azservicebus.Error {Code : azservicebus .CodeLockLost }},
180
- verify : func (g Gomega , tc * testCase ) {
198
+ verify : func (g Gomega , tc * testCase , metrics * processor. Informer ) {
181
199
g .Consistently (
182
200
func (g Gomega ) { g .Expect (tc .renewer .RenewCount .Load ()).To (Equal (int32 (1 ))) },
183
201
130 * time .Millisecond ,
@@ -187,7 +205,7 @@ func Test_RenewPeriodically_Error(t *testing.T) {
187
205
{
188
206
name : "cancel message context on stop by default" ,
189
207
renewer : & fakeSBLockRenewer {Err : & azservicebus.Error {Code : azservicebus .CodeLockLost }},
190
- verify : func (g Gomega , tc * testCase ) {
208
+ verify : func (g Gomega , tc * testCase , metrics * processor. Informer ) {
191
209
g .Consistently (
192
210
func (g Gomega ) { g .Expect (tc .renewer .RenewCount .Load ()).To (Equal (int32 (1 ))) },
193
211
130 * time .Millisecond ,
@@ -199,7 +217,7 @@ func Test_RenewPeriodically_Error(t *testing.T) {
199
217
name : "does not cancel message context on stop if disabled" ,
200
218
renewer : & fakeSBLockRenewer {Err : & azservicebus.Error {Code : azservicebus .CodeLockLost }},
201
219
cancelCtxOnStop : to .Ptr (false ),
202
- verify : func (g Gomega , tc * testCase ) {
220
+ verify : func (g Gomega , tc * testCase , metrics * processor. Informer ) {
203
221
g .Consistently (
204
222
func (g Gomega ) {
205
223
g .Expect (tc .renewer .RenewCount .Load ()).To (Equal (int32 (1 )))
@@ -212,7 +230,7 @@ func Test_RenewPeriodically_Error(t *testing.T) {
212
230
{
213
231
name : "continue periodic renewal on transient error (timeout)" ,
214
232
renewer : & fakeSBLockRenewer {Err : & azservicebus.Error {Code : azservicebus .CodeTimeout }},
215
- verify : func (g Gomega , tc * testCase ) {
233
+ verify : func (g Gomega , tc * testCase , metrics * processor. Informer ) {
216
234
g .Eventually (
217
235
func (g Gomega ) { g .Expect (tc .renewer .RenewCount .Load ()).To (Equal (int32 (2 ))) },
218
236
140 * time .Millisecond ,
@@ -225,7 +243,15 @@ func Test_RenewPeriodically_Error(t *testing.T) {
225
243
t .Run (tc .name , func (t * testing.T ) {
226
244
t .Parallel ()
227
245
interval := 50 * time .Millisecond
228
- lr := shuttle .NewLockRenewalHandler (tc .renewer , & shuttle.LockRenewalOptions {Interval : & interval , CancelMessageContextOnStop : tc .cancelCtxOnStop },
246
+ reg := processor .NewRegistry ()
247
+ reg .Init (prometheus .NewRegistry ())
248
+ informer := processor .NewInformerFor (reg )
249
+ lr := shuttle .NewLockRenewalHandler (tc .renewer ,
250
+ & shuttle.LockRenewalOptions {
251
+ Interval : & interval ,
252
+ CancelMessageContextOnStop : tc .cancelCtxOnStop ,
253
+ MetricRecorder : reg ,
254
+ },
229
255
shuttle .HandlerFunc (func (ctx context.Context , settler shuttle.MessageSettler ,
230
256
message * azservicebus.ReceivedMessage ) {
231
257
tc .gotMessageCtx = ctx
@@ -237,13 +263,13 @@ func Test_RenewPeriodically_Error(t *testing.T) {
237
263
}
238
264
}))
239
265
msg := & azservicebus.ReceivedMessage {}
240
- ctx , cancel := context .WithTimeout (context .TODO (), 200 * time .Millisecond )
266
+ ctx , cancel := context .WithTimeout (context .Background (), 200 * time .Millisecond )
241
267
if tc .isRenewerCanceled {
242
268
cancel ()
243
269
}
244
270
defer cancel ()
245
271
lr .Handle (ctx , & fakeSettler {}, msg )
246
- tc .verify (NewWithT (t ), & tc )
272
+ tc .verify (NewWithT (t ), & tc , informer )
247
273
})
248
274
}
249
275
}
0 commit comments