Files
mongo/buildscripts/tests/resmokelib/run/test_auto_kill_rogue_process.py
2022-09-02 22:55:09 +00:00

125 lines
4.1 KiB
Python

"""Unit tests for buildscripts/resmokelib/run/list_tags.py."""
# pylint: disable=protected-access
import unittest
import logging
import os
import sys
import psutil
from buildscripts.resmokelib.run import TestRunner
from buildscripts.resmokelib import errors
from buildscripts.resmokelib.core import process
from buildscripts.resmokelib.testing.fixtures import interface as fixture_interface
import buildscripts.resmokelib.config
class MockTestRunner(TestRunner):
def _setup_logging(self):
self._exec_logger = logging.getLogger()
self._exec_logger.addHandler(logging.NullHandler())
self._resmoke_logger = self._exec_logger
class TestDetectRogueProcess(unittest.TestCase):
def setUp(self) -> None:
self.command = [sys.executable, '-c', "import time; time.sleep(5)"]
if sys.platform.lower() == 'win32':
self.sigkill_return = fixture_interface.TeardownMode.TERMINATE.value
else:
self.sigkill_return = -fixture_interface.TeardownMode.KILL.value
if not os.environ.get('RESMOKE_PARENT_PROCESS'):
os.environ['RESMOKE_PARENT_PROCESS'] = str(os.getpid())
os.environ['RESMOKE_PARENT_CTIME'] = str(psutil.Process().create_time())
def test_warn(self):
buildscripts.resmokelib.config.AUTO_KILL = 'warn'
buildscripts.resmokelib.config.SHELL_CONN_STRING = None
test_runner = MockTestRunner("test")
test_runner._setup_logging()
try:
test_runner._check_for_mongo_processes()
except errors.ResmokeError:
self.fail("Detected processes when there should be none.")
tmp_ctime = os.environ['RESMOKE_PARENT_CTIME']
os.environ['RESMOKE_PARENT_CTIME'] = str("rogue_process")
proc = process.Process(logging.getLogger(), self.command)
proc.start()
os.environ['RESMOKE_PARENT_CTIME'] = tmp_ctime
with self.assertRaises(errors.ResmokeError):
test_runner._check_for_mongo_processes()
proc.stop(mode=fixture_interface.TeardownMode.KILL)
proc.wait()
def test_on(self):
buildscripts.resmokelib.config.AUTO_KILL = 'on'
buildscripts.resmokelib.config.SHELL_CONN_STRING = None
test_runner = MockTestRunner("test")
test_runner._setup_logging()
test_runner._check_for_mongo_processes()
tmp_ctime = os.environ['RESMOKE_PARENT_CTIME']
os.environ['RESMOKE_PARENT_CTIME'] = str("rogue_process")
proc = process.Process(logging.getLogger(), self.command)
proc.start()
os.environ['RESMOKE_PARENT_CTIME'] = tmp_ctime
test_runner._check_for_mongo_processes()
proc.wait()
if proc._process.returncode != self.sigkill_return:
self.fail(
f"Detected processes was not killed by resmoke, exit code was {proc._process.returncode}, expected {self.sigkill_return}"
)
def test_off(self):
buildscripts.resmokelib.config.AUTO_KILL = 'off'
buildscripts.resmokelib.config.SHELL_CONN_STRING = None
test_runner = MockTestRunner("test")
test_runner._setup_logging()
test_runner._check_for_mongo_processes()
proc = process.Process(logging.getLogger(), self.command)
proc.start()
test_runner._check_for_mongo_processes()
proc.stop(mode=fixture_interface.TeardownMode.ABORT)
if proc._process.returncode == self.sigkill_return:
self.fail("Process was killed when it should not have been.")
proc.wait()
def test_shell_constring(self):
buildscripts.resmokelib.config.AUTO_KILL = 'warn'
buildscripts.resmokelib.config.SHELL_CONN_STRING = '127.0.0.1:27000'
test_runner = MockTestRunner("test")
test_runner._setup_logging()
test_runner._check_for_mongo_processes()
proc = process.Process(logging.getLogger(), self.command)
proc.start()
test_runner._check_for_mongo_processes()
proc.stop(mode=fixture_interface.TeardownMode.ABORT)
if proc._process.returncode == self.sigkill_return:
self.fail("Process was killed when it should not have been.")
proc.wait()