From d4f63662c1103202aa9d307027f08318402afee7 Mon Sep 17 00:00:00 2001 From: Elle Mouton Date: Mon, 6 May 2024 19:01:25 +0200 Subject: [PATCH] invoices: ensure synchronous access to NewTestSqliteDB Add a temporary mutex around the calls to sqldb.NewTestSqliteDB to ensure that only a single thread can access it at a time. This is a temporary work around that can be removed once this race condition in the sqlite repo has been resolved: https://gitlab.com/cznic/sqlite/-/issues/180 --- invoices/invoiceregistry_test.go | 9 +++++++++ invoices/invoices_test.go | 2 ++ 2 files changed, 11 insertions(+) diff --git a/invoices/invoiceregistry_test.go b/invoices/invoiceregistry_test.go index b0c019522..4a76d58aa 100644 --- a/invoices/invoiceregistry_test.go +++ b/invoices/invoiceregistry_test.go @@ -6,6 +6,7 @@ import ( "database/sql" "fmt" "math" + "sync" "testing" "testing/quick" "time" @@ -23,6 +24,12 @@ import ( "github.com/stretchr/testify/require" ) +// sqliteConstructorMu is used to ensure that only one thread can call the +// sqldb.NewTestSqliteDB constructor at a time. This is a temporary workaround +// that can be removed once this race condition in the sqlite repo is resolved: +// https://gitlab.com/cznic/sqlite/-/issues/180 +var sqliteConstructorMu sync.Mutex + // TestInvoiceRegistry is a master test which encompasses all tests using an // InvoiceDB instance. The purpose of this test is to be able to run all tests // with a custom DB instance, so that we can test the same logic with different @@ -130,7 +137,9 @@ func TestInvoiceRegistry(t *testing.T) { var db *sqldb.BaseDB if sqlite { + sqliteConstructorMu.Lock() db = sqldb.NewTestSqliteDB(t).BaseDB + sqliteConstructorMu.Unlock() } else { db = sqldb.NewTestPostgresDB(t, pgFixture).BaseDB } diff --git a/invoices/invoices_test.go b/invoices/invoices_test.go index c9e204571..71da38571 100644 --- a/invoices/invoices_test.go +++ b/invoices/invoices_test.go @@ -234,7 +234,9 @@ func TestInvoices(t *testing.T) { makeSQLDB := func(t *testing.T, sqlite bool) invpkg.InvoiceDB { var db *sqldb.BaseDB if sqlite { + sqliteConstructorMu.Lock() db = sqldb.NewTestSqliteDB(t).BaseDB + sqliteConstructorMu.Unlock() } else { db = sqldb.NewTestPostgresDB(t, pgFixture).BaseDB }