@@ -36,7 +36,29 @@ class TestRaceConditions:
3636 @pytest .mark .resilience
3737 @pytest .mark .critical
3838 async def test_toctou_event_loop_check (self ):
39- """Test Time-of-Check-Time-of-Use race in event loop handling."""
39+ """
40+ Test Time-of-Check-Time-of-Use race in event loop handling.
41+
42+ What this tests:
43+ ---------------
44+ 1. Thread-safe event loop access from multiple threads
45+ 2. Race conditions in get_or_create_event_loop utility
46+ 3. Concurrent thread access to event loop creation
47+ 4. Proper synchronization in event loop management
48+
49+ Why this matters:
50+ ----------------
51+ - Production systems often have multiple threads accessing async code
52+ - TOCTOU bugs can cause crashes or incorrect behavior
53+ - Event loop corruption can break entire applications
54+ - Critical for mixed sync/async codebases
55+
56+ Additional context:
57+ ---------------------------------
58+ - Simulates 20 concurrent threads accessing event loop
59+ - Common pattern in web servers with thread pools
60+ - Tests defensive programming in utils module
61+ """
4062 from async_cassandra .utils import get_or_create_event_loop
4163
4264 # Simulate rapid concurrent access from multiple threads
@@ -72,7 +94,29 @@ def worker():
7294
7395 @pytest .mark .resilience
7496 async def test_callback_registration_race (self ):
75- """Test race condition in callback registration."""
97+ """
98+ Test race condition in callback registration.
99+
100+ What this tests:
101+ ---------------
102+ 1. Thread-safe callback registration in AsyncResultHandler
103+ 2. Race between success and error callbacks
104+ 3. Proper result state management
105+ 4. Only one callback should win in a race
106+
107+ Why this matters:
108+ ----------------
109+ - Callbacks from driver happen on different threads
110+ - Race conditions can cause undefined behavior
111+ - Result state must be consistent
112+ - Prevents duplicate result processing
113+
114+ Additional context:
115+ ---------------------------------
116+ - Driver callbacks are inherently multi-threaded
117+ - Tests internal synchronization mechanisms
118+ - Simulates real driver callback patterns
119+ """
76120 # Create a mock ResponseFuture
77121 mock_future = Mock ()
78122 mock_future .has_more_pages = False
@@ -114,7 +158,29 @@ def register_error():
114158 @pytest .mark .critical
115159 @pytest .mark .timeout (10 ) # Add timeout to prevent hanging
116160 async def test_concurrent_session_operations (self ):
117- """Test concurrent operations on same session."""
161+ """
162+ Test concurrent operations on same session.
163+
164+ What this tests:
165+ ---------------
166+ 1. Thread-safe session operations under high concurrency
167+ 2. No lost updates or race conditions in query execution
168+ 3. Proper result isolation between concurrent queries
169+ 4. Sequential counter integrity across 50 concurrent operations
170+
171+ Why this matters:
172+ ----------------
173+ - Production apps execute many queries concurrently
174+ - Session must handle concurrent access safely
175+ - Lost queries can cause data inconsistency
176+ - Common pattern in web applications
177+
178+ Additional context:
179+ ---------------------------------
180+ - Simulates 50 concurrent SELECT queries
181+ - Verifies each query gets unique result
182+ - Tests thread pool handling under load
183+ """
118184 mock_session = Mock ()
119185 call_count = 0
120186
@@ -151,7 +217,29 @@ def thread_safe_execute(*args, **kwargs):
151217 @pytest .mark .resilience
152218 @pytest .mark .timeout (10 ) # Add timeout to prevent hanging
153219 async def test_page_callback_deadlock_prevention (self ):
154- """Test prevention of deadlock in paging callbacks."""
220+ """
221+ Test prevention of deadlock in paging callbacks.
222+
223+ What this tests:
224+ ---------------
225+ 1. Independent iteration state for concurrent AsyncResultSet usage
226+ 2. No deadlock when multiple coroutines iterate same result
227+ 3. Sequential iteration works correctly
228+ 4. Each iterator maintains its own position
229+
230+ Why this matters:
231+ ----------------
232+ - Paging through large results is common
233+ - Deadlocks can hang entire applications
234+ - Multiple consumers may process same result set
235+ - Critical for streaming large datasets
236+
237+ Additional context:
238+ ---------------------------------
239+ - Tests both concurrent and sequential iteration
240+ - Each AsyncResultSet has independent state
241+ - Simulates real paging scenarios
242+ """
155243 from async_cassandra .result import AsyncResultSet
156244
157245 # Test that each AsyncResultSet has its own iteration state
@@ -194,7 +282,29 @@ async def collect_results():
194282 @pytest .mark .resilience
195283 @pytest .mark .timeout (15 ) # Increase timeout to account for 5s shutdown delay
196284 async def test_session_close_during_query (self ):
197- """Test closing session while queries are in flight."""
285+ """
286+ Test closing session while queries are in flight.
287+
288+ What this tests:
289+ ---------------
290+ 1. Graceful session closure with active queries
291+ 2. Proper cleanup during 5-second shutdown delay
292+ 3. In-flight queries complete before final closure
293+ 4. No resource leaks or hanging queries
294+
295+ Why this matters:
296+ ----------------
297+ - Applications need graceful shutdown
298+ - In-flight queries shouldn't be lost
299+ - Resource cleanup is critical
300+ - Prevents connection leaks in production
301+
302+ Additional context:
303+ ---------------------------------
304+ - Tests 5-second graceful shutdown period
305+ - Simulates real shutdown scenarios
306+ - Critical for container deployments
307+ """
198308 mock_session = Mock ()
199309 query_started = asyncio .Event ()
200310 query_can_proceed = asyncio .Event ()
@@ -254,7 +364,29 @@ def mock_shutdown():
254364 @pytest .mark .critical
255365 @pytest .mark .timeout (10 ) # Add timeout to prevent hanging
256366 async def test_thread_pool_saturation (self ):
257- """Test behavior when thread pool is saturated."""
367+ """
368+ Test behavior when thread pool is saturated.
369+
370+ What this tests:
371+ ---------------
372+ 1. Behavior with more queries than thread pool size
373+ 2. No deadlock when thread pool is exhausted
374+ 3. All queries eventually complete
375+ 4. Async execution handles thread pool limits gracefully
376+
377+ Why this matters:
378+ ----------------
379+ - Production loads can exceed thread pool capacity
380+ - Deadlocks under load are catastrophic
381+ - Must handle burst traffic gracefully
382+ - Common issue in high-traffic applications
383+
384+ Additional context:
385+ ---------------------------------
386+ - Uses 2-thread pool with 6 concurrent queries
387+ - Tests 3x oversubscription scenario
388+ - Verifies async model prevents blocking
389+ """
258390 from async_cassandra .cluster import AsyncCluster
259391
260392 # Create cluster with small thread pool
@@ -305,7 +437,29 @@ def handle_callbacks(callback=None, errback=None):
305437 @pytest .mark .resilience
306438 @pytest .mark .timeout (5 ) # Add timeout to prevent hanging
307439 async def test_event_loop_callback_ordering (self ):
308- """Test that callbacks maintain order when scheduled."""
440+ """
441+ Test that callbacks maintain order when scheduled.
442+
443+ What this tests:
444+ ---------------
445+ 1. Thread-safe callback scheduling to event loop
446+ 2. All callbacks execute despite concurrent scheduling
447+ 3. No lost callbacks under concurrent access
448+ 4. safe_call_soon_threadsafe utility correctness
449+
450+ Why this matters:
451+ ----------------
452+ - Driver callbacks come from multiple threads
453+ - Lost callbacks mean lost query results
454+ - Order preservation prevents race conditions
455+ - Foundation of async-to-sync bridge
456+
457+ Additional context:
458+ ---------------------------------
459+ - Tests 10 concurrent threads scheduling callbacks
460+ - Verifies thread-safe event loop integration
461+ - Core to driver callback handling
462+ """
309463 from async_cassandra .utils import safe_call_soon_threadsafe
310464
311465 results = []
@@ -335,7 +489,29 @@ def schedule_callback(value):
335489 @pytest .mark .resilience
336490 @pytest .mark .timeout (10 ) # Add timeout to prevent hanging
337491 async def test_prepared_statement_concurrent_access (self ):
338- """Test concurrent access to prepared statements."""
492+ """
493+ Test concurrent access to prepared statements.
494+
495+ What this tests:
496+ ---------------
497+ 1. Thread-safe prepared statement creation
498+ 2. Multiple coroutines preparing same statement
499+ 3. No corruption during concurrent preparation
500+ 4. All coroutines receive valid prepared statement
501+
502+ Why this matters:
503+ ----------------
504+ - Prepared statements are performance critical
505+ - Concurrent preparation is common at startup
506+ - Statement corruption causes query failures
507+ - Caching optimization opportunity identified
508+
509+ Additional context:
510+ ---------------------------------
511+ - Currently allows duplicate preparation
512+ - Future optimization: statement caching
513+ - Tests current thread-safe behavior
514+ """
339515 mock_session = Mock ()
340516 mock_prepared = Mock ()
341517
0 commit comments