Flamenco/internal/manager/persistence/timeout_test.go
Sybren A. Stüvel 3f4a9025fe Manager tests: replace assert.NoError() with require.NoError()
Back in the days when I wrote the code, I didn't know about the
`require` package yet. Using `require.NoError()` makes the test code
more straight-forward.

No functional changes, except that when tests fail, they now fail
without panicking.
2024-03-16 11:09:18 +01:00

104 lines
3.2 KiB
Go

package persistence
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"projects.blender.org/studio/flamenco/pkg/api"
)
// SPDX-License-Identifier: GPL-3.0-or-later
func TestFetchTimedOutTasks(t *testing.T) {
ctx, close, db, job, _ := jobTasksTestFixtures(t)
defer close()
tasks, err := db.FetchTasksOfJob(ctx, job)
require.NoError(t, err)
now := db.gormDB.NowFunc()
deadline := now.Add(-5 * time.Minute)
// Mark the task as last touched before the deadline, i.e. old enough for a timeout.
task := tasks[0]
task.LastTouchedAt = deadline.Add(-1 * time.Minute)
require.NoError(t, db.SaveTask(ctx, task))
w := createWorker(ctx, t, db)
require.NoError(t, db.TaskAssignToWorker(ctx, task, w))
// The task should still not be returned, as it's not in 'active' state.
timedout, err := db.FetchTimedOutTasks(ctx, deadline)
require.NoError(t, err)
assert.Empty(t, timedout)
// Mark as Active:
task.Status = api.TaskStatusActive
require.NoError(t, db.SaveTask(ctx, task))
// Now it should time out:
timedout, err = db.FetchTimedOutTasks(ctx, deadline)
require.NoError(t, err)
if assert.Len(t, timedout, 1) {
// Other fields will be different, like the 'UpdatedAt' field -- this just
// tests that the expected task is returned.
assert.Equal(t, task.UUID, timedout[0].UUID)
assert.Equal(t, job, timedout[0].Job, "the job should be included in the result as well")
assert.Equal(t, w.UUID, timedout[0].Worker.UUID, "the worker should be included in the result as well")
}
}
func TestFetchTimedOutWorkers(t *testing.T) {
ctx, cancel, db := persistenceTestFixtures(t, 1*time.Second)
defer cancel()
timeoutDeadline := mustParseTime("2022-06-07T11:14:47+02:00")
beforeDeadline := timeoutDeadline.Add(-10 * time.Second)
afterDeadline := timeoutDeadline.Add(10 * time.Second)
worker0 := Worker{ // Offline, so should not time out.
UUID: "c7b4d1d5-0a96-4e19-993f-028786d3d2c1",
Name: "дрон 0",
Status: api.WorkerStatusOffline,
LastSeenAt: beforeDeadline,
}
worker1 := Worker{ // Awake and timed out.
UUID: "bafc098f-2760-40c6-9a45-a4f980389a9a",
Name: "дрон 1",
Status: api.WorkerStatusAwake,
LastSeenAt: beforeDeadline,
}
worker2 := Worker{ // Starting and timed out.
UUID: "67afa6e6-406d-4224-87d9-82abde7f9d6a",
Name: "дрон 2",
Status: api.WorkerStatusStarting,
LastSeenAt: beforeDeadline,
}
worker3 := Worker{ // Asleep and timed out.
UUID: "12a0bb9a-515b-440a-922a-fd6765fd89a4",
Name: "дрон 3",
Status: api.WorkerStatusAsleep,
LastSeenAt: beforeDeadline,
}
worker4 := Worker{ // Awake and not timed out.
UUID: "aecfc9c8-ebf5-4be3-9091-99b6961a8b6e",
Name: "дрон 4",
Status: api.WorkerStatusAwake,
LastSeenAt: afterDeadline,
}
workers := []*Worker{&worker0, &worker1, &worker2, &worker3, &worker4}
for _, worker := range workers {
err := db.CreateWorker(ctx, worker)
require.NoError(t, err)
}
timedout, err := db.FetchTimedOutWorkers(ctx, timeoutDeadline)
require.NoError(t, err)
require.Len(t, timedout, 3)
assert.Equal(t, worker1.UUID, timedout[0].UUID)
assert.Equal(t, worker2.UUID, timedout[1].UUID)
assert.Equal(t, worker3.UUID, timedout[2].UUID)
}