mongo/buildscripts/resmokelib/testing/testcases/dbtest.py

92 lines
3.0 KiB
Python

"""The unittest.TestCase for dbtests."""
import copy
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
process_kwargs = copy.deepcopy(self.dbtest_options.get("process_kwargs", {}))
interface.append_process_tracking_options(process_kwargs, self._id)
self.dbtest_options["process_kwargs"] = process_kwargs
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")