Skip to content

Commit 9625637

Browse files
committed
add unit test to ensure deadline is never nil if maxdeadline is set
1 parent e2058d1 commit 9625637

File tree

1 file changed

+45
-14
lines changed

1 file changed

+45
-14
lines changed

enterprise/coderd/schedule/template_test.go

+45-14
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"github.com/coder/coder/v2/coderd/database/dbgen"
1717
"github.com/coder/coder/v2/coderd/database/dbtestutil"
1818
agplschedule "github.com/coder/coder/v2/coderd/schedule"
19+
"github.com/coder/coder/v2/coderd/util/ptr"
1920
"github.com/coder/coder/v2/cryptorand"
2021
"github.com/coder/coder/v2/enterprise/coderd/schedule"
2122
"github.com/coder/coder/v2/testutil"
@@ -67,11 +68,12 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
6768

6869
// Workspace old max_deadline too soon
6970
cases := []struct {
70-
name string
71-
now time.Time
72-
deadline time.Time
73-
maxDeadline time.Time
74-
newDeadline time.Time // 0 for no change
71+
name string
72+
now time.Time
73+
deadline time.Time
74+
maxDeadline time.Time
75+
// Set to nil for no change.
76+
newDeadline *time.Time
7577
newMaxDeadline time.Time
7678
noQuietHours bool
7779
autostopReq *agplschedule.TemplateAutostopRequirement
@@ -82,7 +84,7 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
8284
deadline: buildTime,
8385
maxDeadline: buildTime.Add(1 * time.Hour),
8486
// Unchanged since the max deadline is too soon.
85-
newDeadline: time.Time{},
87+
newDeadline: nil,
8688
newMaxDeadline: buildTime.Add(1 * time.Hour),
8789
},
8890
{
@@ -92,7 +94,7 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
9294
deadline: buildTime,
9395
// Far into the future...
9496
maxDeadline: nextQuietHours.Add(24 * time.Hour),
95-
newDeadline: time.Time{},
97+
newDeadline: nil,
9698
// We will use now() + 2 hours if the newly calculated max deadline
9799
// from the workspace build time is before now.
98100
newMaxDeadline: nextQuietHours.Add(8 * time.Hour),
@@ -104,7 +106,7 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
104106
deadline: buildTime,
105107
// Far into the future...
106108
maxDeadline: nextQuietHours.Add(24 * time.Hour),
107-
newDeadline: time.Time{},
109+
newDeadline: nil,
108110
// We will use now() + 2 hours if the newly calculated max deadline
109111
// from the workspace build time is within the next 2 hours.
110112
newMaxDeadline: nextQuietHours.Add(1 * time.Hour),
@@ -116,7 +118,7 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
116118
deadline: buildTime,
117119
// Far into the future...
118120
maxDeadline: nextQuietHours.Add(24 * time.Hour),
119-
newDeadline: time.Time{},
121+
newDeadline: nil,
120122
newMaxDeadline: nextQuietHours,
121123
},
122124
{
@@ -127,7 +129,7 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
127129
deadline: nextQuietHours.Add(24 * time.Hour),
128130
maxDeadline: nextQuietHours.Add(24 * time.Hour),
129131
// The deadline should match since it is after the new max deadline.
130-
newDeadline: nextQuietHours,
132+
newDeadline: ptr.Ref(nextQuietHours),
131133
newMaxDeadline: nextQuietHours,
132134
},
133135
{
@@ -142,14 +144,43 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
142144
deadline: buildTime.Add(time.Hour * 8),
143145
maxDeadline: time.Time{}, // No max set
144146
// Should be unchanged
145-
newDeadline: buildTime.Add(time.Hour * 8),
147+
newDeadline: ptr.Ref(buildTime.Add(time.Hour * 8)),
146148
newMaxDeadline: time.Time{},
147149
noQuietHours: true,
148150
autostopReq: &agplschedule.TemplateAutostopRequirement{
149151
DaysOfWeek: 0,
150152
Weeks: 0,
151153
},
152154
},
155+
{
156+
// A bug existed where MaxDeadline could be set, but deadline was
157+
// `time.Time{}`. This is a logical inconsistency because the "max"
158+
// deadline was ignored.
159+
name: "NoDeadline",
160+
now: buildTime,
161+
deadline: time.Time{},
162+
maxDeadline: time.Time{}, // No max set
163+
// Should be unchanged
164+
newDeadline: ptr.Ref(time.Time{}),
165+
newMaxDeadline: time.Time{},
166+
noQuietHours: true,
167+
autostopReq: &agplschedule.TemplateAutostopRequirement{
168+
DaysOfWeek: 0,
169+
Weeks: 0,
170+
},
171+
},
172+
173+
{
174+
// Similar to 'NoDeadline' test. This has a MaxDeadline set, so
175+
// the deadline of the workspace should now be set.
176+
name: "WorkspaceDeadlineNowSet",
177+
now: nextQuietHours.Add(-6 * time.Hour),
178+
// Start with unset times
179+
deadline: time.Time{},
180+
maxDeadline: time.Time{},
181+
newDeadline: ptr.Ref(nextQuietHours),
182+
newMaxDeadline: nextQuietHours,
183+
},
153184
}
154185

155186
for _, c := range cases {
@@ -275,10 +306,10 @@ func TestTemplateUpdateBuildDeadlines(t *testing.T) {
275306
newBuild, err := db.GetWorkspaceBuildByID(ctx, wsBuild.ID)
276307
require.NoError(t, err)
277308

278-
if c.newDeadline.IsZero() {
279-
c.newDeadline = wsBuild.Deadline
309+
if c.newDeadline == nil {
310+
c.newDeadline = &wsBuild.Deadline
280311
}
281-
require.WithinDuration(t, c.newDeadline, newBuild.Deadline, time.Second)
312+
require.WithinDuration(t, *c.newDeadline, newBuild.Deadline, time.Second)
282313
require.WithinDuration(t, c.newMaxDeadline, newBuild.MaxDeadline, time.Second)
283314

284315
// Check that the new build has the same state as before.

0 commit comments

Comments
 (0)