From 58c898c2c14c27ae5f8ecbf6b3269c563535f16e Mon Sep 17 00:00:00 2001 From: Alexey Palazhchenko Date: Fri, 18 Aug 2023 00:24:41 +0400 Subject: [PATCH] Fix concurrent SQLite tests (#3222) Closes #3172. --- integration/setup/listener.go | 31 ++++++++++++++++++++++++++++++- integration/setup/startup.go | 17 ----------------- internal/util/testutil/db.go | 4 ---- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/integration/setup/listener.go b/integration/setup/listener.go index f361848d53eb..13bcf3305e4b 100644 --- a/integration/setup/listener.go +++ b/integration/setup/listener.go @@ -19,6 +19,7 @@ import ( "errors" "net/url" "os" + "path" "path/filepath" "github.com/stretchr/testify/require" @@ -29,6 +30,7 @@ import ( "github.com/FerretDB/FerretDB/internal/handlers/registry" "github.com/FerretDB/FerretDB/internal/util/observability" "github.com/FerretDB/FerretDB/internal/util/state" + "github.com/FerretDB/FerretDB/internal/util/testutil" "github.com/FerretDB/FerretDB/internal/util/testutil/testtb" ) @@ -131,6 +133,33 @@ func setupListener(tb testtb.TB, ctx context.Context, logger *zap.Logger) string panic("not reached") } + // use per-test directory to prevent handler's/backend's metadata registry + // read databases owned by concurrent tests + sqliteURL := *sqliteURLF + if sqliteURL != "" { + u, err := url.Parse(sqliteURL) + require.NoError(tb, err) + + require.True(tb, u.Path == "") + require.True(tb, u.Opaque != "") + + u.Opaque = path.Join(u.Opaque, testutil.DatabaseName(tb)) + "/" + sqliteURL = u.String() + + dir, err := filepath.Abs(u.Opaque) + require.NoError(tb, err) + require.NoError(tb, os.MkdirAll(dir, 0o777)) + + tb.Cleanup(func() { + if tb.Failed() { + tb.Logf("Keeping %s (%s) for debugging.", dir, sqliteURL) + return + } + + require.NoError(tb, os.RemoveAll(dir)) + }) + } + p, err := state.NewProvider("") require.NoError(tb, err) @@ -140,7 +169,7 @@ func setupListener(tb testtb.TB, ctx context.Context, logger *zap.Logger) string StateProvider: p, PostgreSQLURL: *postgreSQLURLF, - SQLiteURL: *sqliteURLF, + SQLiteURL: sqliteURL, HANAURL: *hanaURLF, TestOpts: registry.TestOpts{ diff --git a/integration/setup/startup.go b/integration/setup/startup.go index 8804b454f4da..05c8b05d66a9 100644 --- a/integration/setup/startup.go +++ b/integration/setup/startup.go @@ -17,9 +17,7 @@ package setup import ( "context" "net/http" - "net/url" "os" - "path/filepath" "runtime" "time" @@ -79,21 +77,6 @@ func Startup() { zap.S().Fatalf("Unknown target backend %q.", *targetBackendF) } - if *sqliteURLF != "" { - u, err := url.Parse(*sqliteURLF) - if err != nil { - zap.S().Fatalf("Failed to parse -sqlite-url %s: %s", u, err) - } - - must.BeTrue(u.Path == "") - must.BeTrue(u.Opaque != "") - - dir := must.NotFail(filepath.Abs(u.Opaque)) - zap.S().Infof("Recreating %s", dir) - _ = os.Remove(dir) - must.NoError(os.MkdirAll(dir, 0o777)) - } - if u := *targetURLF; u != "" { client, err := makeClient(ctx, u) if err != nil { diff --git a/internal/util/testutil/db.go b/internal/util/testutil/db.go index 371004362263..2b04e3648df1 100644 --- a/internal/util/testutil/db.go +++ b/internal/util/testutil/db.go @@ -33,8 +33,6 @@ var ( ) // DatabaseName returns a stable FerretDB database name for that test. -// -// It should be called only once per test. func DatabaseName(tb testtb.TB) string { tb.Helper() @@ -61,8 +59,6 @@ func DatabaseName(tb testtb.TB) string { } // CollectionName returns a stable FerretDB collection name for that test. -// -// It should be called only once per test. func CollectionName(tb testtb.TB) string { tb.Helper()