From bc6318e80e0082f0c983cefdc48997935bcdfaf9 Mon Sep 17 00:00:00 2001 From: Brandur Date: Sat, 26 Apr 2025 14:12:49 -0700 Subject: [PATCH] Fix more intermittent tests in `Test_Client_JobCompletion` Fix a series of tests in `Test_Client_JobCompletion` that may fail [1] intermittently due to their use of a real world clock that may be off as test goroutines are paused in GitHub Actions for more extended periods of time. --- FAIL: Test_Client_JobCompletion (0.00s) --- FAIL: Test_Client_JobCompletion/JobThatReturnsJobCancelErrorIsImmediatelyCancelled (4.81s) client_test.go:5586: Generated schema "river_2025_04_26t20_41_17_schema_18" with migrations [1 2 3 4 5 6] on line "main" in 2.546342002s [18 generated] [14 reused] logger.go:256: time=2025-04-26T20:41:23.623Z level=INFO msg="River client started" client_id=fv-az1370-305_2025_04_26T20_41_23_606599 client_test.go:5600: Error Trace: /home/runner/work/river/river/client_test.go:5600 Error: Max difference between 2025-04-26 20:41:25.839484186 +0000 UTC m=+8.375195240 and 2025-04-26 20:41:23.819235 +0000 UTC allowed is 2s, but difference was 2.020249186s Test: Test_Client_JobCompletion/JobThatReturnsJobCancelErrorIsImmediatelyCancelled logger.go:256: time=2025-04-26T20:41:25.862Z level=INFO msg="River client stopped" client_id=fv-az1370-305_2025_04_26T20_41_23_606599 riverdbtest.go:277: Checked in schema "river_2025_04_26t20_41_17_schema_18"; 1 idle schema(s) [18 generated] [15 reused] FAIL FAIL github.com/riverqueue/river 32.869s Fix these by injecting a test clock and asserting time based on that instead of the real wall clock. [1] https://github.com/riverqueue/river/actions/runs/14684878766/job/41212306331 --- client_test.go | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/client_test.go b/client_test.go index 6cc6a838..ace406df 100644 --- a/client_test.go +++ b/client_test.go @@ -5498,6 +5498,8 @@ func Test_Client_JobCompletion(t *testing.T) { client, bundle := setup(t, config) + now := client.baseService.Time.StubNowUTC(time.Now().UTC()) + insertRes, err := client.Insert(ctx, callbackArgs{}, nil) require.NoError(err) @@ -5509,7 +5511,7 @@ func Test_Client_JobCompletion(t *testing.T) { require.NoError(err) require.Equal(rivertype.JobStateCompleted, reloadedJob.State) - require.WithinDuration(time.Now(), *reloadedJob.FinalizedAt, 2*time.Second) + require.WithinDuration(now, *reloadedJob.FinalizedAt, 2*time.Second) }) t.Run("JobThatIsAlreadyCompletedIsNotAlteredByCompleter", func(t *testing.T) { @@ -5557,9 +5559,12 @@ func Test_Client_JobCompletion(t *testing.T) { config := newTestConfig(t, func(ctx context.Context, job *Job[callbackArgs]) error { return errors.New("oops") }) + config.RetryPolicy = &retrypolicytest.RetryPolicyNoJitter{} client, bundle := setup(t, config) + now := client.baseService.Time.StubNowUTC(time.Now().UTC()) + insertRes, err := client.Insert(ctx, callbackArgs{}, nil) require.NoError(err) @@ -5571,7 +5576,7 @@ func Test_Client_JobCompletion(t *testing.T) { require.NoError(err) require.Equal(rivertype.JobStateRetryable, reloadedJob.State) - require.WithinDuration(time.Now(), reloadedJob.ScheduledAt, 2*time.Second) + require.WithinDuration(now.Add(1*time.Second), reloadedJob.ScheduledAt, time.Microsecond) require.Nil(reloadedJob.FinalizedAt) }) @@ -5585,6 +5590,8 @@ func Test_Client_JobCompletion(t *testing.T) { client, bundle := setup(t, config) + now := client.baseService.Time.StubNowUTC(time.Now().UTC()) + insertRes, err := client.Insert(ctx, callbackArgs{}, nil) require.NoError(err) @@ -5597,7 +5604,7 @@ func Test_Client_JobCompletion(t *testing.T) { require.Equal(rivertype.JobStateCancelled, reloadedJob.State) require.NotNil(reloadedJob.FinalizedAt) - require.WithinDuration(time.Now(), *reloadedJob.FinalizedAt, 2*time.Second) + require.WithinDuration(now, *reloadedJob.FinalizedAt, time.Microsecond) }) t.Run("JobThatIsAlreadyDiscardedIsNotAlteredByCompleter", func(t *testing.T) {