22import os
33import sys
44import tempfile
5+ import threading
56import unittest
7+ from test import support
8+ from test .support import threading_helper
69from test .support .import_helper import import_module
710
811termios = import_module ('termios' )
1215class TestFunctions (unittest .TestCase ):
1316
1417 def setUp (self ):
15- master_fd , self .fd = os .openpty ()
16- self .addCleanup (os .close , master_fd )
18+ self . master_fd , self .fd = os .openpty ()
19+ self .addCleanup (os .close , self . master_fd )
1720 self .stream = self .enterContext (open (self .fd , 'wb' , buffering = 0 ))
1821 tmp = self .enterContext (tempfile .TemporaryFile (mode = 'wb' , buffering = 0 ))
1922 self .bad_fd = tmp .fileno ()
@@ -136,6 +139,29 @@ def test_tcflush_errors(self):
136139 self .assertRaises (TypeError , termios .tcflush , object (), termios .TCIFLUSH )
137140 self .assertRaises (TypeError , termios .tcflush , self .fd )
138141
142+ def test_tcflush_clear_input_or_output (self ):
143+ wfd = self .fd
144+ rfd = self .master_fd
145+ inbuf = sys .platform == 'linux'
146+
147+ os .write (wfd , b'abcdef' )
148+ self .assertEqual (os .read (rfd , 2 ), b'ab' )
149+ if inbuf :
150+ # don't flush input
151+ termios .tcflush (rfd , termios .TCOFLUSH )
152+ else :
153+ # don't flush output
154+ termios .tcflush (wfd , termios .TCIFLUSH )
155+ self .assertEqual (os .read (rfd , 2 ), b'cd' )
156+ if inbuf :
157+ # flush input
158+ termios .tcflush (rfd , termios .TCIFLUSH )
159+ else :
160+ # flush output
161+ termios .tcflush (wfd , termios .TCOFLUSH )
162+ os .write (wfd , b'ABCDEF' )
163+ self .assertEqual (os .read (rfd , 1024 ), b'ABCDEF' )
164+
139165 def test_tcflow (self ):
140166 termios .tcflow (self .fd , termios .TCOOFF )
141167 termios .tcflow (self .fd , termios .TCOON )
@@ -152,6 +178,32 @@ def test_tcflow_errors(self):
152178 self .assertRaises (TypeError , termios .tcflow , object (), termios .TCOON )
153179 self .assertRaises (TypeError , termios .tcflow , self .fd )
154180
181+ @unittest .skipUnless (sys .platform == 'linux' , 'only works on Linux' )
182+ def test_tcflow_suspend_and_resume_output (self ):
183+ wfd = self .fd
184+ rfd = self .master_fd
185+ write_suspended = threading .Event ()
186+ write_finished = threading .Event ()
187+
188+ def writer ():
189+ os .write (wfd , b'abc' )
190+ write_suspended .wait ()
191+ os .write (wfd , b'def' )
192+ write_finished .set ()
193+
194+ with threading_helper .start_threads ([threading .Thread (target = writer )]):
195+ self .assertEqual (os .read (rfd , 3 ), b'abc' )
196+ try :
197+ termios .tcflow (wfd , termios .TCOOFF )
198+ write_suspended .set ()
199+ self .assertFalse (write_finished .wait (0.5 ),
200+ 'output was not suspended' )
201+ finally :
202+ termios .tcflow (wfd , termios .TCOON )
203+ self .assertTrue (write_finished .wait (0.5 ),
204+ 'output was not resumed' )
205+ self .assertEqual (os .read (rfd , 1024 ), b'def' )
206+
155207 def test_tcgetwinsize (self ):
156208 size = termios .tcgetwinsize (self .fd )
157209 self .assertIsInstance (size , tuple )
0 commit comments