|
15 | 15 | # pylint: skip-file |
16 | 16 | from __future__ import annotations |
17 | 17 |
|
18 | | -from logging import WARNING, getLogger |
| 18 | +import logging |
| 19 | +from logging import getLogger, WARNING |
19 | 20 | from os import environ |
20 | 21 | from typing import Iterable, Optional, Sequence |
21 | | -from unittest import TestCase, mock |
| 22 | +from unittest import mock, TestCase |
22 | 23 | from unittest.mock import Mock, patch |
23 | 24 |
|
24 | 25 | from pytest import raises |
|
58 | 59 | MetricReader, |
59 | 60 | ) |
60 | 61 | from opentelemetry.sdk.metrics.view import Aggregation |
61 | | -from opentelemetry.sdk.resources import SERVICE_NAME, Resource |
| 62 | +from opentelemetry.sdk.resources import Resource, SERVICE_NAME |
62 | 63 | from opentelemetry.sdk.trace.export import ConsoleSpanExporter |
63 | 64 | from opentelemetry.sdk.trace.id_generator import IdGenerator, RandomIdGenerator |
64 | 65 | from opentelemetry.sdk.trace.sampling import ( |
@@ -1076,3 +1077,51 @@ def test_custom_configurator(self, mock_init_comp): |
1076 | 1077 | "sampler": "TEST_SAMPLER", |
1077 | 1078 | } |
1078 | 1079 | mock_init_comp.assert_called_once_with(**kwargs) |
| 1080 | + |
| 1081 | + |
| 1082 | +class ClearLoggingHandlers: |
| 1083 | + def __init__(self): |
| 1084 | + self.root_logger = getLogger() |
| 1085 | + self.original_handlers = None |
| 1086 | + |
| 1087 | + def __enter__(self): |
| 1088 | + # Save original state |
| 1089 | + self.original_handlers = self.root_logger.handlers[:] |
| 1090 | + # Remove all handlers |
| 1091 | + self.root_logger.handlers = [] |
| 1092 | + return self |
| 1093 | + |
| 1094 | + def __exit__(self, exc_type, exc_val, exc_tb): |
| 1095 | + # Restore original state |
| 1096 | + self.root_logger.handlers = [] |
| 1097 | + for handler in self.original_handlers: |
| 1098 | + self.root_logger.addHandler(handler) |
| 1099 | + |
| 1100 | + |
| 1101 | +class TestClearLoggingHandlers(TestCase): |
| 1102 | + def test_preserves_handlers(self): |
| 1103 | + root_logger = getLogger() # Get the root logger |
| 1104 | + initial_handlers = root_logger.handlers[ |
| 1105 | + : |
| 1106 | + ] # Save initial test environment handlers |
| 1107 | + |
| 1108 | + # Add our test handler |
| 1109 | + test_handler = logging.StreamHandler() |
| 1110 | + root_logger.addHandler(test_handler) |
| 1111 | + expected_handlers = initial_handlers + [test_handler] |
| 1112 | + |
| 1113 | + with ClearLoggingHandlers(): |
| 1114 | + # Should have no handlers during the test |
| 1115 | + self.assertEqual(len(root_logger.handlers), 0) |
| 1116 | + |
| 1117 | + # Add a temporary handler that should get cleaned up |
| 1118 | + temp_handler = logging.StreamHandler() |
| 1119 | + root_logger.addHandler(temp_handler) |
| 1120 | + |
| 1121 | + # After the test, should be back to initial handlers plus our test handler |
| 1122 | + self.assertEqual(len(root_logger.handlers), len(expected_handlers)) |
| 1123 | + for h1, h2 in zip(root_logger.handlers, expected_handlers): |
| 1124 | + self.assertIs(h1, h2) |
| 1125 | + |
| 1126 | + # Cleanup our test handler |
| 1127 | + root_logger.removeHandler(test_handler) |
0 commit comments