@@ -22,6 +22,11 @@ def cleanup_async_logging():
2222 yield
2323 from kakashi import shutdown_async_logging
2424 shutdown_async_logging ()
25+ try :
26+ from kakashi .core .async_interface import shutdown_async_backend
27+ shutdown_async_backend (timeout = 2.0 )
28+ except ImportError :
29+ pass
2530
2631@pytest .fixture (scope = "session" )
2732def temp_test_dir () -> Generator [Path , None , None ]:
@@ -137,3 +142,53 @@ def kakashi_structured_logger():
137142 """Create a fresh Kakashi structured logger for each test."""
138143 from kakashi .core import create_structured_logger
139144 return create_structured_logger ("test_structured_logger" )
145+
146+
147+ # =============================================================================
148+ # Async logger test utilities
149+ # =============================================================================
150+
151+ def wait_for_async_queue_drain (
152+ timeout : float = 5.0 ,
153+ poll_interval : float = 0.05 ,
154+ ) -> bool :
155+ """
156+ Wait until the functional async backend queue is empty or timeout.
157+
158+ Use before asserting on log output when using async loggers.
159+
160+ Returns:
161+ True if queue drained, False if timeout reached.
162+ """
163+ import time
164+ try :
165+ from kakashi .core .async_interface import get_async_stats
166+ except ImportError :
167+ return False
168+ start = time .time ()
169+ while time .time () - start < timeout :
170+ stats = get_async_stats ()
171+ if stats .get ("queue_size" , 0 ) == 0 :
172+ return True
173+ time .sleep (poll_interval )
174+ return False
175+
176+
177+ @pytest .fixture
178+ def async_logger_with_teardown ():
179+ """
180+ Functional async logger that shuts down cleanly after each test.
181+
182+ Use for tests that need async logging and must drain the queue
183+ before asserting on output.
184+ """
185+ try :
186+ from kakashi .core .async_interface import (
187+ get_async_logger ,
188+ shutdown_async_backend ,
189+ )
190+ except ImportError :
191+ pytest .skip ("kakashi.core.async_interface not available" )
192+ logger = get_async_logger ("test.async_teardown" )
193+ yield logger
194+ shutdown_async_backend (timeout = 2.0 )
0 commit comments