@@ -361,31 +361,103 @@ func TestTelemetryItem(t *testing.T) {
361
361
require .Equal (t , item .Value , "new_value" )
362
362
}
363
363
364
- func collectSnapshot (t * testing.T , db database.Store , addOptionsFn func (opts telemetry.Options ) telemetry.Options ) (* telemetry.Deployment , * telemetry.Snapshot ) {
364
+ func TestReportDisabledIfNeeded (t * testing.T ) {
365
+ t .Parallel ()
366
+ db , _ := dbtestutil .NewDB (t )
367
+ ctx := testutil .Context (t , testutil .WaitMedium )
368
+ serverURL , _ , snapshotChan := setupTelemetryServer (t )
369
+
370
+ options := telemetry.Options {
371
+ Database : db ,
372
+ Logger : testutil .Logger (t ),
373
+ URL : serverURL ,
374
+ DeploymentID : uuid .NewString (),
375
+ }
376
+
377
+ reporter , err := telemetry .New (options )
378
+ require .NoError (t , err )
379
+ t .Cleanup (reporter .Close )
380
+
381
+ // No telemetry updated item, so no report should be sent
382
+ require .NoError (t , reporter .ReportDisabledIfNeeded ())
383
+ require .Empty (t , snapshotChan )
384
+
385
+ // Telemetry disabled item not present, and a telemetry update item present
386
+ // Report should be sent
387
+ _ = dbgen .TelemetryItem (t , db , database.TelemetryItem {
388
+ Key : string (telemetry .TelemetryItemKeyLastTelemetryUpdate ),
389
+ Value : time .Now ().Format (time .RFC3339 ),
390
+ })
391
+ require .NoError (t , reporter .ReportDisabledIfNeeded ())
392
+ select {
393
+ case snapshot := <- snapshotChan :
394
+ require .Len (t , snapshot .TelemetryItems , 1 )
395
+ require .Equal (t , snapshot .TelemetryItems [0 ].Key , string (telemetry .TelemetryItemKeyTelemetryDisabled ))
396
+ case <- time .After (testutil .WaitShort / 2 ):
397
+ t .Fatal ("timeout waiting for snapshot" )
398
+ }
399
+
400
+ // Telemetry disabled item present, and a telemetry update item present
401
+ // with an updated at time equal to or after the telemetry disabled item
402
+ // Report should not be sent
403
+ require .NoError (t , reporter .ReportDisabledIfNeeded ())
404
+ require .Empty (t , snapshotChan )
405
+
406
+ // Telemetry disabled item present, and a telemetry update item present
407
+ // with an updated at time before the telemetry disabled item
408
+ // Report should be sent
409
+ // Wait a bit to ensure UpdatedAt is bigger when we upsert the telemetry disabled item
410
+ time .Sleep (100 * time .Millisecond )
411
+ require .NoError (t , db .UpsertTelemetryItem (ctx , database.UpsertTelemetryItemParams {
412
+ Key : string (telemetry .TelemetryItemKeyTelemetryDisabled ),
413
+ Value : time .Now ().Format (time .RFC3339 ),
414
+ }))
415
+ require .NoError (t , reporter .ReportDisabledIfNeeded ())
416
+ select {
417
+ case snapshot := <- snapshotChan :
418
+ require .Len (t , snapshot .TelemetryItems , 1 )
419
+ require .Equal (t , snapshot .TelemetryItems [0 ].Key , string (telemetry .TelemetryItemKeyTelemetryDisabled ))
420
+ case <- time .After (testutil .WaitShort / 2 ):
421
+ t .Fatal ("timeout waiting for snapshot" )
422
+ }
423
+ }
424
+
425
+ func setupTelemetryServer (t * testing.T ) (* url.URL , chan * telemetry.Deployment , chan * telemetry.Snapshot ) {
365
426
t .Helper ()
366
427
deployment := make (chan * telemetry.Deployment , 64 )
367
428
snapshot := make (chan * telemetry.Snapshot , 64 )
368
429
r := chi .NewRouter ()
369
430
r .Post ("/deployment" , func (w http.ResponseWriter , r * http.Request ) {
370
431
require .Equal (t , buildinfo .Version (), r .Header .Get (telemetry .VersionHeader ))
371
- w .WriteHeader (http .StatusAccepted )
372
432
dd := & telemetry.Deployment {}
373
433
err := json .NewDecoder (r .Body ).Decode (dd )
374
434
require .NoError (t , err )
375
435
deployment <- dd
436
+ // Ensure the header is sent only after deployment is sent
437
+ w .WriteHeader (http .StatusAccepted )
376
438
})
377
439
r .Post ("/snapshot" , func (w http.ResponseWriter , r * http.Request ) {
378
440
require .Equal (t , buildinfo .Version (), r .Header .Get (telemetry .VersionHeader ))
379
- w .WriteHeader (http .StatusAccepted )
380
441
ss := & telemetry.Snapshot {}
381
442
err := json .NewDecoder (r .Body ).Decode (ss )
382
443
require .NoError (t , err )
383
444
snapshot <- ss
445
+ // Ensure the header is sent only after snapshot is sent
446
+ w .WriteHeader (http .StatusAccepted )
384
447
})
385
448
server := httptest .NewServer (r )
386
449
t .Cleanup (server .Close )
387
450
serverURL , err := url .Parse (server .URL )
388
451
require .NoError (t , err )
452
+
453
+ return serverURL , deployment , snapshot
454
+ }
455
+
456
+ func collectSnapshot (t * testing.T , db database.Store , addOptionsFn func (opts telemetry.Options ) telemetry.Options ) (* telemetry.Deployment , * telemetry.Snapshot ) {
457
+ t .Helper ()
458
+
459
+ serverURL , deployment , snapshot := setupTelemetryServer (t )
460
+
389
461
options := telemetry.Options {
390
462
Database : db ,
391
463
Logger : testutil .Logger (t ),
0 commit comments