Skip to content

Commit 55ddd77

Browse files
committed
better test
1 parent acbf5d9 commit 55ddd77

File tree

1 file changed

+31
-25
lines changed

1 file changed

+31
-25
lines changed

dbos/workflows_test.go

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3158,36 +3158,42 @@ func TestGarbageCollect(t *testing.T) {
31583158
gcTestEvent.Clear()
31593159
numWorkflows := 10
31603160

3161-
// Execute first batch of workflows
3161+
// Start blocked workflow BEFORE cutoff to verify pending workflows are preserved
3162+
blockedHandle, err := RunAsWorkflow(dbosCtx, gcBlockedWorkflow, gcTestEvent)
3163+
require.NoError(t, err, "failed to start blocked workflow")
3164+
3165+
// Execute first batch of workflows (before cutoff)
3166+
var beforeCutoffHandles []WorkflowHandle[int]
31623167
for i := range numWorkflows {
31633168
handle, err := RunAsWorkflow(dbosCtx, gcTestWorkflow, i)
31643169
require.NoError(t, err, "failed to start test workflow %d", i)
31653170
result, err := handle.GetResult()
31663171
require.NoError(t, err, "failed to get result from test workflow %d", i)
31673172
require.Equal(t, i, result, "expected result %d, got %d", i, result)
3173+
beforeCutoffHandles = append(beforeCutoffHandles, handle)
31683174
}
31693175

3170-
// Wait a second to ensure time separation
3171-
time.Sleep(1 * time.Second)
3176+
// Wait to ensure clear time separation between batches
3177+
time.Sleep(500 * time.Millisecond)
31723178
cutoffTime := time.Now()
3173-
3174-
// Start blocked workflow after cutoff
3175-
blockedHandle, err := RunAsWorkflow(dbosCtx, gcBlockedWorkflow, gcTestEvent)
3176-
require.NoError(t, err, "failed to start blocked workflow")
3179+
// Additional small delay to ensure cutoff is after all first batch workflows
3180+
time.Sleep(100 * time.Millisecond)
31773181

31783182
// Execute second batch of workflows after cutoff
3183+
var afterCutoffHandles []WorkflowHandle[int]
31793184
for i := numWorkflows; i < numWorkflows*2; i++ {
31803185
handle, err := RunAsWorkflow(dbosCtx, gcTestWorkflow, i)
31813186
require.NoError(t, err, "failed to start test workflow %d", i)
31823187
result, err := handle.GetResult()
31833188
require.NoError(t, err, "failed to get result from test workflow %d", i)
31843189
require.Equal(t, i, result, "expected result %d, got %d", i, result)
3190+
afterCutoffHandles = append(afterCutoffHandles, handle)
31853191
}
31863192

3187-
// Verify exactly 21 workflows exist before GC (10 + 1 blocked + 10)
3193+
// Verify exactly 21 workflows exist before GC (1 blocked + 10 old + 10 new)
31883194
workflows, err := ListWorkflows(dbosCtx)
31893195
require.NoError(t, err, "failed to list workflows")
3190-
require.Equal(t, 21, len(workflows), "expected exactly 21 workflows before GC (10 old + 1 blocked + 10 new)")
3196+
require.Equal(t, 21, len(workflows), "expected exactly 21 workflows before GC (1 blocked + 10 old + 10 new)")
31913197

31923198
// Garbage collect workflows completed before cutoff time
31933199
cutoffTimestamp := cutoffTime.UnixMilli()
@@ -3201,26 +3207,26 @@ func TestGarbageCollect(t *testing.T) {
32013207
require.NoError(t, err, "failed to list workflows after time-based GC")
32023208
require.Equal(t, 11, len(workflows), "expected exactly 11 workflows after time-based GC (1 blocked + 10 new)")
32033209

3204-
// Verify blocked workflow still exists
3205-
found := false
3210+
// Create a map of remaining workflow IDs for easy lookup
3211+
remainingIDs := make(map[string]bool)
32063212
for _, wf := range workflows {
3207-
if wf.ID == blockedHandle.GetWorkflowID() {
3208-
found = true
3209-
require.Equal(t, WorkflowStatusPending, wf.Status, "blocked workflow should still be pending")
3210-
break
3211-
}
3213+
remainingIDs[wf.ID] = true
32123214
}
3213-
require.True(t, found, "blocked workflow should still exist after time-based GC")
32143215

3215-
// Verify all remaining completed workflows were created after cutoff (excluding blocked)
3216-
completedAfterCutoff := 0
3217-
for _, wf := range workflows {
3218-
if wf.ID != blockedHandle.GetWorkflowID() && wf.Status == WorkflowStatusSuccess {
3219-
require.True(t, wf.CreatedAt.After(cutoffTime), "completed workflow should be from after the cutoff time")
3220-
completedAfterCutoff++
3221-
}
3216+
// Verify blocked workflow still exists (even though it was created before cutoff)
3217+
require.True(t, remainingIDs[blockedHandle.GetWorkflowID()], "blocked workflow should still exist after GC")
3218+
3219+
// Verify that all workflows created before cutoff were deleted (except the blocked one)
3220+
for _, handle := range beforeCutoffHandles {
3221+
wfID := handle.GetWorkflowID()
3222+
require.False(t, remainingIDs[wfID], "workflow created before cutoff (ID: %s) should have been deleted", wfID)
3223+
}
3224+
3225+
// Verify that all workflows created after cutoff were preserved
3226+
for _, handle := range afterCutoffHandles {
3227+
wfID := handle.GetWorkflowID()
3228+
require.True(t, remainingIDs[wfID], "workflow created after cutoff (ID: %s) should have been preserved", wfID)
32223229
}
3223-
require.Equal(t, 10, completedAfterCutoff, "expected exactly 10 completed workflows after cutoff")
32243230

32253231
// Complete the blocked workflow
32263232
gcTestEvent.Set()

0 commit comments

Comments
 (0)