From 546443a798278a07c9bff3d849e872e4263456b6 Mon Sep 17 00:00:00 2001
From: Cian Johnston <cian@coder.com>
Date: Mon, 11 Mar 2024 12:37:11 +0000
Subject: [PATCH 1/2] chore(coderd/database/dbpurge): fix failing test

---
 coderd/database/dbpurge/dbpurge_test.go | 28 ++++++++++++++++---------
 1 file changed, 18 insertions(+), 10 deletions(-)

diff --git a/coderd/database/dbpurge/dbpurge_test.go b/coderd/database/dbpurge/dbpurge_test.go
index da718527866c0..3f40eba4c1d57 100644
--- a/coderd/database/dbpurge/dbpurge_test.go
+++ b/coderd/database/dbpurge/dbpurge_test.go
@@ -202,7 +202,7 @@ func containsAgentLog(daemons []database.WorkspaceAgentLog, output string) bool
 func TestDeleteOldProvisionerDaemons(t *testing.T) {
 	t.Parallel()
 
-	db, _ := dbtestutil.NewDB(t)
+	db, _ := dbtestutil.NewDB(t, dbtestutil.WithDumpOnFailure())
 	defaultOrg := dbgen.Organization(t, db, database.Organization{})
 	logger := slogtest.Make(t, &slogtest.Options{IgnoreErrors: true})
 
@@ -214,11 +214,12 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
 	// given
 	_, err := db.UpsertProvisionerDaemon(ctx, database.UpsertProvisionerDaemonParams{
 		// Provisioner daemon created 14 days ago, and checked in just before 7 days deadline.
-		Name:           "external-0",
-		Provisioners:   []database.ProvisionerType{"echo"},
-		Tags:           database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
-		CreatedAt:      now.Add(-14 * 24 * time.Hour),
-		LastSeenAt:     sql.NullTime{Valid: true, Time: now.Add(-7 * 24 * time.Hour).Add(time.Minute)},
+		Name:         "external-0",
+		Provisioners: []database.ProvisionerType{"echo"},
+		Tags:         database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
+		CreatedAt:    now.Add(-14 * 24 * time.Hour),
+		// Note: adding an hour and a minute to account for DST variations
+		LastSeenAt:     sql.NullTime{Valid: true, Time: now.AddDate(0, 0, -7).Add(61 * time.Minute)},
 		Version:        "1.0.0",
 		APIVersion:     proto.CurrentVersion.String(),
 		OrganizationID: defaultOrg.ID,
@@ -230,7 +231,7 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
 		Provisioners:   []database.ProvisionerType{"echo"},
 		Tags:           database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
 		CreatedAt:      now.Add(-8 * 24 * time.Hour),
-		LastSeenAt:     sql.NullTime{Valid: true, Time: now.Add(-8 * 24 * time.Hour).Add(time.Hour)},
+		LastSeenAt:     sql.NullTime{Valid: true, Time: now.AddDate(0, 0, -8).Add(time.Hour)},
 		Version:        "1.0.0",
 		APIVersion:     proto.CurrentVersion.String(),
 		OrganizationID: defaultOrg.ID,
@@ -244,7 +245,7 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
 			provisionersdk.TagScope: provisionersdk.ScopeUser,
 			provisionersdk.TagOwner: uuid.NewString(),
 		},
-		CreatedAt:      now.Add(-9 * 24 * time.Hour),
+		CreatedAt:      now.AddDate(0, 0, -9),
 		Version:        "1.0.0",
 		APIVersion:     proto.CurrentVersion.String(),
 		OrganizationID: defaultOrg.ID,
@@ -258,7 +259,7 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
 			provisionersdk.TagScope: provisionersdk.ScopeUser,
 			provisionersdk.TagOwner: uuid.NewString(),
 		},
-		CreatedAt:      now.Add(-6 * 24 * time.Hour),
+		CreatedAt:      now.AddDate(0, 0, -6),
 		LastSeenAt:     sql.NullTime{Valid: true, Time: now.Add(-6 * 24 * time.Hour)},
 		Version:        "1.0.0",
 		APIVersion:     proto.CurrentVersion.String(),
@@ -276,11 +277,18 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
 		if err != nil {
 			return false
 		}
+
+		daemonNames := make([]string, 0, len(daemons))
+		for _, d := range daemons {
+			daemonNames = append(daemonNames, d.Name)
+		}
+		t.Logf("found %d daemons: %v", len(daemons), daemonNames)
+
 		return containsProvisionerDaemon(daemons, "external-0") &&
 			!containsProvisionerDaemon(daemons, "external-1") &&
 			!containsProvisionerDaemon(daemons, "alice-provisioner") &&
 			containsProvisionerDaemon(daemons, "bob-provisioner")
-	}, testutil.WaitShort, testutil.IntervalFast)
+	}, testutil.WaitShort, testutil.IntervalSlow)
 }
 
 func containsProvisionerDaemon(daemons []database.ProvisionerDaemon, name string) bool {

From 90bdb96faf947e1ab38c76838b62c3d2fa2cd057 Mon Sep 17 00:00:00 2001
From: Cian Johnston <cian@coder.com>
Date: Mon, 11 Mar 2024 12:42:54 +0000
Subject: [PATCH 2/2] fixup! chore(coderd/database/dbpurge): fix failing test

---
 coderd/database/dbpurge/dbpurge_test.go | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/coderd/database/dbpurge/dbpurge_test.go b/coderd/database/dbpurge/dbpurge_test.go
index 3f40eba4c1d57..9e949f270d2ca 100644
--- a/coderd/database/dbpurge/dbpurge_test.go
+++ b/coderd/database/dbpurge/dbpurge_test.go
@@ -217,7 +217,7 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
 		Name:         "external-0",
 		Provisioners: []database.ProvisionerType{"echo"},
 		Tags:         database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
-		CreatedAt:    now.Add(-14 * 24 * time.Hour),
+		CreatedAt:    now.AddDate(0, 0, -14),
 		// Note: adding an hour and a minute to account for DST variations
 		LastSeenAt:     sql.NullTime{Valid: true, Time: now.AddDate(0, 0, -7).Add(61 * time.Minute)},
 		Version:        "1.0.0",
@@ -230,7 +230,7 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
 		Name:           "external-1",
 		Provisioners:   []database.ProvisionerType{"echo"},
 		Tags:           database.StringMap{provisionersdk.TagScope: provisionersdk.ScopeOrganization},
-		CreatedAt:      now.Add(-8 * 24 * time.Hour),
+		CreatedAt:      now.AddDate(0, 0, -8),
 		LastSeenAt:     sql.NullTime{Valid: true, Time: now.AddDate(0, 0, -8).Add(time.Hour)},
 		Version:        "1.0.0",
 		APIVersion:     proto.CurrentVersion.String(),
@@ -260,7 +260,7 @@ func TestDeleteOldProvisionerDaemons(t *testing.T) {
 			provisionersdk.TagOwner: uuid.NewString(),
 		},
 		CreatedAt:      now.AddDate(0, 0, -6),
-		LastSeenAt:     sql.NullTime{Valid: true, Time: now.Add(-6 * 24 * time.Hour)},
+		LastSeenAt:     sql.NullTime{Valid: true, Time: now.AddDate(0, 0, -6)},
 		Version:        "1.0.0",
 		APIVersion:     proto.CurrentVersion.String(),
 		OrganizationID: defaultOrg.ID,