@@ -91,34 +91,38 @@ def tearDown(self):
91
91
self .logcat_thread = None
92
92
93
93
@contextmanager
94
- def unbuffered (self , stream ):
95
- stream .reconfigure (write_through = True )
94
+ def reconfigure (self , stream , ** settings ):
95
+ original_settings = {key : getattr (stream , key , None ) for key in settings .keys ()}
96
+ stream .reconfigure (** settings )
96
97
try :
97
98
yield
98
99
finally :
99
- stream .reconfigure (write_through = False )
100
+ stream .reconfigure (** original_settings )
100
101
101
- # In --verbose3 mode, sys.stdout and sys.stderr are captured, so we can't
102
- # test them directly. Detect this mode and use some temporary streams with
103
- # the same properties.
104
102
def stream_context (self , stream_name , level ):
105
- # https://developer.android.com/ndk/reference/group/logging
106
- prio = {"I" : 4 , "W" : 5 }[level ]
107
-
108
103
stack = ExitStack ()
109
104
stack .enter_context (self .subTest (stream_name ))
105
+
106
+ # In --verbose3 mode, sys.stdout and sys.stderr are captured, so we can't
107
+ # test them directly. Detect this mode and use some temporary streams with
108
+ # the same properties.
110
109
stream = getattr (sys , stream_name )
111
110
native_stream = getattr (sys , f"__{ stream_name } __" )
112
111
if isinstance (stream , io .StringIO ):
112
+ # https://developer.android.com/ndk/reference/group/logging
113
+ prio = {"I" : 4 , "W" : 5 }[level ]
113
114
stack .enter_context (
114
115
patch (
115
116
f"sys.{ stream_name } " ,
116
- TextLogStream (
117
- prio , f"python.{ stream_name } " , native_stream .fileno (),
118
- errors = "backslashreplace"
117
+ stream := TextLogStream (
118
+ prio , f"python.{ stream_name } " , native_stream ,
119
119
),
120
120
)
121
121
)
122
+
123
+ # The tests assume the stream is initially buffered.
124
+ stack .enter_context (self .reconfigure (stream , write_through = False ))
125
+
122
126
return stack
123
127
124
128
def test_str (self ):
@@ -145,7 +149,7 @@ def write(s, lines=None, *, write_len=None):
145
149
self .assert_logs (level , tag , lines )
146
150
147
151
# Single-line messages,
148
- with self .unbuffered (stream ):
152
+ with self .reconfigure (stream , write_through = True ):
149
153
write ("" , [])
150
154
151
155
write ("a" )
@@ -192,7 +196,7 @@ def write(s, lines=None, *, write_len=None):
192
196
193
197
# However, buffering can be turned off completely if you want a
194
198
# flush after every write.
195
- with self .unbuffered (stream ):
199
+ with self .reconfigure (stream , write_through = True ):
196
200
write ("\n x" , ["" , "x" ])
197
201
write ("\n a\n " , ["" , "a" ])
198
202
write ("\n " , ["" ])
0 commit comments