Skip to content

Commit 162abf9

Browse files
committed
add a test for TestReportDisabledIfNeeded
1 parent 325314b commit 162abf9

File tree

2 files changed

+77
-5
lines changed

2 files changed

+77
-5
lines changed

coderd/telemetry/telemetry.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -347,11 +347,11 @@ func checkIDPOrgSync(ctx context.Context, db database.Store, values *codersdk.De
347347
func (r *remoteReporter) ReportDisabledIfNeeded() error {
348348
db := r.options.Database
349349
lastTelemetryUpdate, telemetryUpdateErr := db.GetTelemetryItem(r.ctx, string(TelemetryItemKeyLastTelemetryUpdate))
350-
if telemetryUpdateErr != nil {
350+
if telemetryUpdateErr != nil && !errors.Is(telemetryUpdateErr, sql.ErrNoRows) {
351351
r.options.Logger.Debug(r.ctx, "get last telemetry update at", slog.Error(telemetryUpdateErr))
352352
}
353353
telemetryDisabled, telemetryDisabledErr := db.GetTelemetryItem(r.ctx, string(TelemetryItemKeyTelemetryDisabled))
354-
if telemetryDisabledErr != nil {
354+
if telemetryDisabledErr != nil && !errors.Is(telemetryDisabledErr, sql.ErrNoRows) {
355355
r.options.Logger.Debug(r.ctx, "get telemetry disabled", slog.Error(telemetryDisabledErr))
356356
}
357357
shouldReportDisabledTelemetry :=

coderd/telemetry/telemetry_test.go

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,31 +361,103 @@ func TestTelemetryItem(t *testing.T) {
361361
require.Equal(t, item.Value, "new_value")
362362
}
363363

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) {
365426
t.Helper()
366427
deployment := make(chan *telemetry.Deployment, 64)
367428
snapshot := make(chan *telemetry.Snapshot, 64)
368429
r := chi.NewRouter()
369430
r.Post("/deployment", func(w http.ResponseWriter, r *http.Request) {
370431
require.Equal(t, buildinfo.Version(), r.Header.Get(telemetry.VersionHeader))
371-
w.WriteHeader(http.StatusAccepted)
372432
dd := &telemetry.Deployment{}
373433
err := json.NewDecoder(r.Body).Decode(dd)
374434
require.NoError(t, err)
375435
deployment <- dd
436+
// Ensure the header is sent only after deployment is sent
437+
w.WriteHeader(http.StatusAccepted)
376438
})
377439
r.Post("/snapshot", func(w http.ResponseWriter, r *http.Request) {
378440
require.Equal(t, buildinfo.Version(), r.Header.Get(telemetry.VersionHeader))
379-
w.WriteHeader(http.StatusAccepted)
380441
ss := &telemetry.Snapshot{}
381442
err := json.NewDecoder(r.Body).Decode(ss)
382443
require.NoError(t, err)
383444
snapshot <- ss
445+
// Ensure the header is sent only after snapshot is sent
446+
w.WriteHeader(http.StatusAccepted)
384447
})
385448
server := httptest.NewServer(r)
386449
t.Cleanup(server.Close)
387450
serverURL, err := url.Parse(server.URL)
388451
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+
389461
options := telemetry.Options{
390462
Database: db,
391463
Logger: testutil.Logger(t),

0 commit comments

Comments
 (0)