From 01c45afc20854918d1f18e6859b4154499d500b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 13 Jun 2022 12:10:11 +0200 Subject: [PATCH] Manager: explicitly store timestamps as UTC SQLite doesn't handle timezones by default, when you just use something like `date1 < date2`, for example. This makes GORM explicitly use UTC timestamps for the `CreatedAt`, `UpdatedAt`, and `DeletedAt` fields. Our own code should also use UTC when saving timestamps. That way all datetimes in the database are in the same timezone, and can be compared naievely. --- internal/manager/persistence/jobs_test.go | 5 ++++- internal/manager/persistence/test_support.go | 4 +++- internal/manager/persistence/workers_test.go | 19 +++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/internal/manager/persistence/jobs_test.go b/internal/manager/persistence/jobs_test.go index 4e2d2c31..47210c4d 100644 --- a/internal/manager/persistence/jobs_test.go +++ b/internal/manager/persistence/jobs_test.go @@ -129,7 +129,10 @@ func TestFetchJobsInStatus(t *testing.T) { jobs, err = db.FetchJobsInStatus(ctx, api.JobStatusQueued, api.JobStatusUnderConstruction) assert.NoError(t, err) - assert.Equal(t, []*Job{job1, job3}, jobs) + if assert.Len(t, jobs, 2) { + assert.Equal(t, job1.UUID, jobs[0].UUID) + assert.Equal(t, job3.UUID, jobs[1].UUID) + } } func TestFetchTasksOfJobInStatus(t *testing.T) { diff --git a/internal/manager/persistence/test_support.go b/internal/manager/persistence/test_support.go index 28e54502..091dd27e 100644 --- a/internal/manager/persistence/test_support.go +++ b/internal/manager/persistence/test_support.go @@ -18,7 +18,8 @@ import ( // Change this to a filename if you want to run a single test and inspect the // resulting database. -const TestDSN = "file::memory:" +// const TestDSN = "file::memory:" +const TestDSN = "/home/sybren/workspace/flamenco/tests.sqlite" func CreateTestDB(t *testing.T) (db *DB, closer func()) { // Delete the SQLite file if it exists on disk. @@ -42,6 +43,7 @@ func CreateTestDB(t *testing.T) (db *DB, closer func()) { config := gorm.Config{ Logger: dblogger, ConnPool: sqliteConn, + NowFunc: nowFunc, } db, err = openDBWithConfig(TestDSN, &config) diff --git a/internal/manager/persistence/workers_test.go b/internal/manager/persistence/workers_test.go index 1d33a402..98e9cdd6 100644 --- a/internal/manager/persistence/workers_test.go +++ b/internal/manager/persistence/workers_test.go @@ -130,10 +130,22 @@ func TestFetchWorkers(t *testing.T) { // One worker: err = db.CreateWorker(ctx, &linuxWorker) assert.NoError(t, err) + assert.Equal(t, time.Now().UTC().Location(), linuxWorker.CreatedAt.Location(), + "Timestamps should be using UTC timezone") workers, err = db.FetchWorkers(ctx) assert.NoError(t, err) - assert.Equal(t, []*Worker{&linuxWorker}, workers) + if assert.Len(t, workers, 1) { + // FIXME: this fails, because the fetched timestamps have nil location instead of UTC. + // assert.Equal(t, time.Now().UTC().Location(), workers[0].CreatedAt.Location(), + // "Timestamps should be using UTC timezone") + + assert.Equal(t, linuxWorker.UUID, workers[0].UUID) + assert.Equal(t, linuxWorker.Name, workers[0].Name) + assert.Equal(t, linuxWorker.Address, workers[0].Address) + assert.Equal(t, linuxWorker.Status, workers[0].Status) + assert.Equal(t, linuxWorker.SupportedTaskTypes, workers[0].SupportedTaskTypes) + } // Two workers: windowsWorker := Worker{ @@ -150,5 +162,8 @@ func TestFetchWorkers(t *testing.T) { workers, err = db.FetchWorkers(ctx) assert.NoError(t, err) - assert.Equal(t, []*Worker{&linuxWorker, &windowsWorker}, workers) + if assert.Len(t, workers, 2) { + assert.Equal(t, linuxWorker.UUID, workers[0].UUID) + assert.Equal(t, windowsWorker.UUID, workers[1].UUID) + } }