mongo/buildscripts/resmokelib/testing/fixtures/yesfixture.py
Joshua Siegel 53ab565f24 SERVER-110918 Add resmoke flag to generate extension .conf files (#41495)
GitOrigin-RevId: 1932b7b526836469902c703c0ae4e5d5d4740488
2025-09-22 15:27:46 +00:00

75 lines
2.7 KiB
Python

"""Fixture for generating lots of log messages."""
import signal
from buildscripts.resmokelib.testing.fixtures import interface
class YesFixture(interface.Fixture):
"""Fixture which spawns several 'yes' executables to generate lots of log messages."""
def __init__(self, logger, job_num, fixturelib, num_instances=1, message_length=100):
"""Initialize YesFixture."""
interface.Fixture.__init__(self, logger, job_num, fixturelib)
self.__processes = [None] * num_instances
self.__message = "y" * message_length
def pids(self):
""":return: pids owned by this fixture if any."""
return [x.pid for x in self.__processes if x is not None]
def setup(self):
"""Start the yes processes."""
for i, process in enumerate(self.__processes):
process = self._make_process(i)
self.logger.info("Starting yes process...\n%s", process.as_command())
process.start()
self.logger.info("yes process started with pid %d.", process.pid)
self.__processes[i] = process
def _make_process(self, index):
logger = self.fixturelib.new_fixture_node_logger(
self.__class__.__name__, self.job_num, "yes{:d}".format(index)
)
return self.fixturelib.generic_program(logger, ["yes", self.__message])
def _do_teardown(self, finished=False, mode=None):
running_at_start = self.is_running()
success = True # Still a success even if nothing is running.
if not running_at_start:
self.logger.info(
"yes processes were expected to be running in _do_teardown(), but weren't."
)
else:
self.logger.info("Stopping all yes processes...")
for process in reversed(self.__processes):
if process is not None:
if running_at_start:
self.logger.info("Stopping yes process with pid %d...", process.pid)
process.stop(mode)
exit_code = process.wait()
success = (exit_code == -signal.SIGTERM) and success
if running_at_start:
self.logger.info(
"Successfully terminated the yes process with pid %d, exited with code"
" %d.",
process.pid,
exit_code,
)
if running_at_start:
self.logger.info("Successfully stopped all yes processes.")
return success
def is_running(self):
"""Return true if the yes processes are running."""
return all(process is not None and process.poll() is None for process in self.__processes)