Source code for SCAutolib.models.log

"""
This module provides a context manager, ``assert_log``, designed for verifying
the presence of specific log entries in a file during test execution.

It allows for asserting that a given regular expression matches a newly
generated log line within a specified log file.
"""


from SCAutolib import logger
from contextlib import contextmanager
import re


[docs]@contextmanager def assert_log(path: str, expected_log: str): """ A context manager that asserts the creation of a new log line in a specified file that matches a given regular expression. When entering the context, the log file's pointer is moved to its end to ignore any existing logs. The code block within the ``with`` statement is then executed. Upon exiting the context (either normally or due to an exception), the function reads new log entries and attempts to find a match for the ``expected_log`` regular expression. If no matching log is found among the newly generated entries, an exception is raised. :param path: The string path to the log file that will be monitored for new log entries. :type path: str :param expected_log: The regular expression string that is expected to match one of the new log lines generated within the context. :type expected_log: str :yield: None. This is a context manager, so it yields control to the ``with`` block. :raises Exception: If no new log line matches the ``expected_log`` regular expression by the time the context is exited. """ logger.info(f'Opening log file {path}') with open(path) as f: # Move file pointer to the end of file f.seek(0, 2) p = re.compile(expected_log) # Run the actual actions try: yield finally: logger.info(f'Asserting regex `{expected_log}` in {path}') log = '' # Only for debugging purposes for line in f: log += line m = p.match(line) if m: # found the log text = m.group() logger.info(f'Found matching line: {text}') return logger.debug(log) raise Exception('The log was not found.')