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