@@ -95,34 +95,38 @@ def tearDown(self):
9595 self .logcat_thread = None
9696
9797 @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 )
100101 try :
101102 yield
102103 finally :
103- stream .reconfigure (write_through = False )
104+ stream .reconfigure (** original_settings )
104105
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.
108106 def stream_context (self , stream_name , level ):
109- # https://developer.android.com/ndk/reference/group/logging
110- prio = {"I" : 4 , "W" : 5 }[level ]
111-
112107 stack = ExitStack ()
113108 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.
114113 stream = getattr (sys , stream_name )
115114 native_stream = getattr (sys , f"__{ stream_name } __" )
116115 if isinstance (stream , io .StringIO ):
116+ # https://developer.android.com/ndk/reference/group/logging
117+ prio = {"I" : 4 , "W" : 5 }[level ]
117118 stack .enter_context (
118119 patch (
119120 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 ,
123123 ),
124124 )
125125 )
126+
127+ # The tests assume the stream is initially buffered.
128+ stack .enter_context (self .reconfigure (stream , write_through = False ))
129+
126130 return stack
127131
128132 def test_str (self ):
@@ -149,7 +153,7 @@ def write(s, lines=None, *, write_len=None):
149153 self .assert_logs (level , tag , lines )
150154
151155 # Single-line messages,
152- with self .unbuffered (stream ):
156+ with self .reconfigure (stream , write_through = True ):
153157 write ("" , [])
154158
155159 write ("a" )
@@ -196,7 +200,7 @@ def write(s, lines=None, *, write_len=None):
196200
197201 # However, buffering can be turned off completely if you want a
198202 # flush after every write.
199- with self .unbuffered (stream ):
203+ with self .reconfigure (stream , write_through = True ):
200204 write ("\n x" , ["" , "x" ])
201205 write ("\n a\n " , ["" , "a" ])
202206 write ("\n " , ["" ])
0 commit comments