Files
scylladb/test/cluster/dtest/tools/context.py
Evgeniy Naydanov ac1551892b test.py: initial implementation of dtest/ccm shim
Use universalasync library to make test.py async code compatible
with synchronous code of dtest/ccm

Also, copied unmodified error_example_test.py from dtest as an example.

Run the test in `dev` mode only.
2025-05-19 12:27:31 +00:00

71 lines
1.9 KiB
Python

#
# Copyright (C) 2025-present ScyllaDB
#
# SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
#
"""
Home for functionality that provides context managers, and anything related to
making those context managers function.
"""
import logging
from contextlib import contextmanager
from test.cluster.dtest.tools.env import ALLOW_NOISY_LOGGING
@contextmanager
def log_filter(log_id, expected_strings=None):
"""
Context manager which allows silencing logs until exit.
Log records matching expected_strings will be filtered out of logging.
If expected_strings is not provided, everything is filtered for that log.
"""
logger = logging.getLogger(log_id)
log_filter = _make_filter_class(expected_strings)
logger.addFilter(log_filter)
yield
if log_filter.records_silenced > 0:
print("Logs were filtered to remove messages deemed unimportant, total count: %d" % log_filter.records_silenced)
logger.removeFilter(log_filter)
def _make_filter_class(expected_strings):
"""
Builds an anon-ish filtering class and returns it.
Returns a logfilter if filtering should take place, otherwise a nooplogfilter.
We're just using a class here as a one-off object with a filter method, for
use as a filter object on the desired log.
"""
class NoopLogFilter:
records_silenced = 0
@classmethod
def filter(cls, record):
return True
class LogFilter:
records_silenced = 0
@classmethod
def filter(cls, record):
if expected_strings is None:
cls.records_silenced += 1
return False
for s in expected_strings:
if s in record.msg or s in record.name:
cls.records_silenced += 1
return False
return True
if ALLOW_NOISY_LOGGING:
return NoopLogFilter
else:
return LogFilter