Files
mongo/buildscripts/resmokelib/testing/testcases/dbtest.py
Steve McClure b4b23946cd SERVER-90570: Enable formatting checks for buildscripts directory, excluding idl (#22254)
GitOrigin-RevId: 9d997a9f44cd43a8dec7c2a17fa2dbcd875e92f6
2024-05-16 22:07:36 +00:00

87 lines
2.8 KiB
Python

"""The unittest.TestCase for dbtests."""
import os
import os.path
import shutil
from typing import Optional
from buildscripts.resmokelib import config, core, logging, utils
from buildscripts.resmokelib.testing.testcases import interface
class DBTestCase(interface.ProcessTestCase):
"""A dbtest to execute."""
REGISTERED_NAME = "db_test"
def __init__(
self,
logger: logging.Logger,
dbtest_suites: list[str],
dbtest_executable: Optional[str] = None,
dbtest_options: Optional[dict] = None,
):
"""Initialize the DBTestCase with the dbtest suite to run."""
assert len(dbtest_suites) == 1
interface.ProcessTestCase.__init__(self, logger, "dbtest suite", dbtest_suites[0])
# Command line options override the YAML configuration.
self.dbtest_executable = utils.default_if_none(config.DBTEST_EXECUTABLE, dbtest_executable)
self.dbtest_suite = dbtest_suites[0]
self.dbtest_options = utils.default_if_none(dbtest_options, {}).copy()
def configure(self, fixture, *args, **kwargs):
"""Configure DBTestCase."""
interface.ProcessTestCase.configure(self, fixture, *args, **kwargs)
# If a dbpath was specified, then use it as a container for all other dbpaths.
dbpath_prefix = self.dbtest_options.pop("dbpath", DBTestCase._get_dbpath_prefix())
dbpath = os.path.join(dbpath_prefix, "job%d" % self.fixture.job_num, "unittest")
self.dbtest_options["dbpath"] = dbpath
self._clear_dbpath()
try:
os.makedirs(dbpath)
except os.error:
# Directory already exists.
pass
def _execute(self, process):
interface.ProcessTestCase._execute(self, process)
self._clear_dbpath()
def _clear_dbpath(self):
shutil.rmtree(self.dbtest_options["dbpath"], ignore_errors=True)
def _make_process(self):
return core.programs.dbtest_program(
self.logger,
executable=self.dbtest_executable,
suites=[self.dbtest_suite],
**self.dbtest_options,
)
@staticmethod
def _get_dbpath_prefix():
"""
Return the prefix of the dbpath to use for the dbtest executable.
Order of preference:
1. The --dbpathPrefix specified at the command line.
2. Value of the TMPDIR environment variable.
3. Value of the TEMP environment variable.
4. Value of the TMP environment variable.
5. The /tmp directory.
"""
if config.DBPATH_PREFIX is not None:
return config.DBPATH_PREFIX
for env_var in ("TMPDIR", "TEMP", "TMP"):
if env_var in os.environ:
return os.environ[env_var]
return os.path.normpath("/tmp")