11import logging
2+ import threading
23
34import pytest
45
@@ -23,7 +24,7 @@ def test_add_global_context_ok(caplog: pytest.LogCaptureFixture):
2324
2425def test_add_global_context_without_init_ignored_ok (caplog : pytest .LogCaptureFixture ):
2526 logger = logging .getLogger (__name__ )
26- with add_global_context ({"key" : "value" }):
27+ with add_global_context ({"key" : "value" }, auto_init = False ):
2728 with caplog .at_level (logging .INFO ):
2829 logger .info ("Test message" )
2930 assert len (caplog .records ) == 1
@@ -35,8 +36,53 @@ def test_add_global_context_after_shutdown_ignored_ok(caplog: pytest.LogCaptureF
3536 logger = logging .getLogger (__name__ )
3637 with global_context_initialized ():
3738 pass
38- with add_global_context ({"key" : "value" }), caplog .at_level (logging .INFO ):
39+ with (
40+ add_global_context ({"key" : "value" }, auto_init = False ),
41+ caplog .at_level (logging .INFO ),
42+ ):
3943 logger .info ("Test message" )
4044 assert len (caplog .records ) == 1
4145 result = caplog .records [0 ]
4246 assert not hasattr (result , "key" )
47+
48+
49+ def test_add_global_context_auto_init_ok (caplog : pytest .LogCaptureFixture ):
50+ logger = logging .getLogger (__name__ )
51+ with add_global_context ({"key" : "value" }), caplog .at_level (logging .INFO ):
52+ logger .info ("Test message" )
53+ assert len (caplog .records ) == 1
54+ result = caplog .records [0 ]
55+ assert result .key == "value" # type: ignore
56+
57+
58+ def test_add_global_context_multithread (caplog : pytest .LogCaptureFixture ):
59+ def worker (value : int ) -> None :
60+ with add_global_context ({"value" : value }):
61+ logger .info ("Message 1 from thread %s" , value )
62+ with add_global_context ({"value" : value * 10 }):
63+ logger .info ("Message 2 from thread %s" , value )
64+ with add_global_context ({"value" : value * 100 }):
65+ logger .info ("Message 3 from thread %s" , value )
66+
67+ logger = logging .getLogger (__name__ )
68+ with global_context_initialized (), caplog .at_level (logging .INFO ):
69+ worker_1 = threading .Thread (target = worker , args = (1 ,))
70+ worker_2 = threading .Thread (target = worker , args = (2 ,))
71+ worker_1 .start ()
72+ worker_2 .start ()
73+ worker_1 .join ()
74+ worker_2 .join ()
75+ assert len (caplog .records ) == 6
76+ result = [
77+ {"message" : record .message , "value" : record .value } # type: ignore
78+ for record in sorted (caplog .records , key = lambda r : r .value ) # type: ignore
79+ ]
80+ expected = [
81+ {"message" : "Message 1 from thread 1" , "value" : 1 },
82+ {"message" : "Message 1 from thread 2" , "value" : 2 },
83+ {"message" : "Message 2 from thread 1" , "value" : 10 },
84+ {"message" : "Message 2 from thread 2" , "value" : 20 },
85+ {"message" : "Message 3 from thread 1" , "value" : 100 },
86+ {"message" : "Message 3 from thread 2" , "value" : 200 },
87+ ]
88+ assert result == expected
0 commit comments