Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Optionally use an on-disk sqlite db in tests #11702

Merged
merged 7 commits into from
Jan 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog.d/11702.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add the option to write sqlite test dbs to disk when running tests.
19 changes: 18 additions & 1 deletion tests/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
import hashlib
import json
import logging
import os
import os.path
import time
import uuid
import warnings
Expand Down Expand Up @@ -71,6 +73,7 @@
POSTGRES_HOST,
POSTGRES_PASSWORD,
POSTGRES_USER,
SQLITE_PERSIST_DB,
USE_POSTGRES_FOR_TESTS,
MockClock,
default_config,
Expand Down Expand Up @@ -739,9 +742,23 @@ def setup_test_homeserver(
},
}
else:
if SQLITE_PERSIST_DB:
# The current working directory is in _trial_temp, so this gets created within that directory.
test_db_location = os.path.abspath("test.db")
DMRobertson marked this conversation as resolved.
Show resolved Hide resolved
logger.debug("Will persist db to %s", test_db_location)
# Ensure each test gets a clean database.
try:
os.remove(test_db_location)
except FileNotFoundError:
pass
else:
logger.debug("Removed existing DB at %s", test_db_location)
else:
test_db_location = ":memory:"

database_config = {
"name": "sqlite3",
"args": {"database": ":memory:", "cp_min": 1, "cp_max": 1},
"args": {"database": test_db_location, "cp_min": 1, "cp_max": 1},
}

if "db_txn_limit" in kwargs:
Expand Down
4 changes: 4 additions & 0 deletions tests/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@
POSTGRES_PASSWORD = os.environ.get("SYNAPSE_POSTGRES_PASSWORD", None)
POSTGRES_BASE_DB = "_synapse_unit_tests_base_%s" % (os.getpid(),)

# When debugging a specific test, it's occasionally useful to write the
# DB to disk and query it with the sqlite CLI.
SQLITE_PERSIST_DB = os.environ.get("SYNAPSE_TEST_PERSIST_SQLITE_DB") is not None
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I usually do str(os.environ.get(...)).lower() == "true" to make it a bit tighter... 🤷 but who knows what the right value is here.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why str(...) --- are the values bytes by default?

Come to think of it, maybe I could do "VARNAME" in os.environ, since I'm only interested in if it's set or not. I'll probably leave it be for now though.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why str(...) --- are the values bytes by default?

It makes None -> "None" 😄

This is only really useful if you want to ensure that true-ish string values are used.


# the dbname we will connect to in order to create the base database.
POSTGRES_DBNAME_FOR_INITIAL_CREATE = "postgres"

Expand Down