106 lines
3.6 KiB
Python
106 lines
3.6 KiB
Python
import logging
|
|
import os
|
|
import tempfile
|
|
import unittest
|
|
|
|
from core.log_system.logger import (
|
|
ANSI_RESET,
|
|
ColoredFormatter,
|
|
SafeRotatingFileHandler,
|
|
parse_rotated_log_filename,
|
|
rotated_log_filename,
|
|
)
|
|
|
|
|
|
class ColoredFormatterTests(unittest.TestCase):
|
|
def test_colors_timestamp_and_root_label_with_the_context_badge(self):
|
|
formatter = ColoredFormatter(
|
|
use_colors=True,
|
|
include_milliseconds=False,
|
|
include_brackets=True,
|
|
)
|
|
record = logging.LogRecord(
|
|
'azlogs.module',
|
|
logging.INFO,
|
|
'test_file.py',
|
|
12,
|
|
'message',
|
|
(),
|
|
None,
|
|
)
|
|
|
|
formatted = formatter.format(record)
|
|
badge_prefix = '\033[97;48;2;38;63;76m '
|
|
timestamp = formatter._format_time(record)
|
|
|
|
self.assertIn(f'{badge_prefix}[{timestamp}] {ANSI_RESET}', formatted)
|
|
self.assertIn(f'{badge_prefix}[module] {ANSI_RESET}', formatted)
|
|
self.assertEqual(formatted.count(badge_prefix), 2)
|
|
|
|
|
|
class RotatedLogFilenameTests(unittest.TestCase):
|
|
def test_places_rotation_before_log_extension(self):
|
|
path = os.path.join("logs", "azlogs_MResolver.log.3")
|
|
self.assertEqual(
|
|
rotated_log_filename(path),
|
|
os.path.join("logs", "azlogs_MResolver.3.log"),
|
|
)
|
|
|
|
def test_leaves_unrelated_filename_unchanged(self):
|
|
path = os.path.join("logs", "azlogs_MResolver.log")
|
|
self.assertEqual(rotated_log_filename(path), path)
|
|
|
|
def test_parser_accepts_current_style(self):
|
|
expected = ("azlogs_MResolver", 2)
|
|
self.assertEqual(
|
|
parse_rotated_log_filename("azlogs_MResolver.2.log"),
|
|
expected,
|
|
)
|
|
self.assertEqual(
|
|
parse_rotated_log_filename("azlogs_MResolver.log"),
|
|
("azlogs_MResolver", 0),
|
|
)
|
|
|
|
def test_parser_rejects_non_log_and_legacy_files(self):
|
|
self.assertIsNone(parse_rotated_log_filename("other.txt"))
|
|
self.assertIsNone(parse_rotated_log_filename("azlogs_MResolver.log.2"))
|
|
self.assertIsNone(parse_rotated_log_filename("azlogs_MResolver.log2"))
|
|
|
|
|
|
class SafeRotatingFileHandlerTests(unittest.TestCase):
|
|
def test_rollover_keeps_log_as_the_final_extension(self):
|
|
with tempfile.TemporaryDirectory() as temp_dir:
|
|
log_path = os.path.join(temp_dir, "azlogs_MResolver.log")
|
|
logger = logging.getLogger(f"test-log-rotation-{id(self)}")
|
|
logger.handlers.clear()
|
|
logger.propagate = False
|
|
logger.setLevel(logging.INFO)
|
|
handler = SafeRotatingFileHandler(
|
|
log_path,
|
|
maxBytes=32,
|
|
backupCount=2,
|
|
encoding="utf-8",
|
|
)
|
|
handler.setFormatter(logging.Formatter("%(message)s"))
|
|
logger.addHandler(handler)
|
|
|
|
try:
|
|
logger.info("first message large enough to rotate")
|
|
logger.info("second message large enough to rotate")
|
|
logger.info("third message large enough to rotate")
|
|
handler.flush()
|
|
finally:
|
|
logger.removeHandler(handler)
|
|
handler.close()
|
|
|
|
files = set(os.listdir(temp_dir))
|
|
self.assertIn("azlogs_MResolver.log", files)
|
|
self.assertIn("azlogs_MResolver.1.log", files)
|
|
self.assertIn("azlogs_MResolver.2.log", files)
|
|
self.assertNotIn("azlogs_MResolver.3.log", files)
|
|
self.assertNotIn("azlogs_MResolver.log.1", files)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|