2
2
import os
3
3
import sys
4
4
import tempfile
5
+ import threading
5
6
import unittest
7
+ from test import support
8
+ from test .support import threading_helper
6
9
from test .support .import_helper import import_module
7
10
8
11
termios = import_module ('termios' )
12
15
class TestFunctions (unittest .TestCase ):
13
16
14
17
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 )
17
20
self .stream = self .enterContext (open (self .fd , 'wb' , buffering = 0 ))
18
21
tmp = self .enterContext (tempfile .TemporaryFile (mode = 'wb' , buffering = 0 ))
19
22
self .bad_fd = tmp .fileno ()
@@ -136,6 +139,29 @@ def test_tcflush_errors(self):
136
139
self .assertRaises (TypeError , termios .tcflush , object (), termios .TCIFLUSH )
137
140
self .assertRaises (TypeError , termios .tcflush , self .fd )
138
141
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
+
139
165
def test_tcflow (self ):
140
166
termios .tcflow (self .fd , termios .TCOOFF )
141
167
termios .tcflow (self .fd , termios .TCOON )
@@ -152,6 +178,32 @@ def test_tcflow_errors(self):
152
178
self .assertRaises (TypeError , termios .tcflow , object (), termios .TCOON )
153
179
self .assertRaises (TypeError , termios .tcflow , self .fd )
154
180
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
+
155
207
def test_tcgetwinsize (self ):
156
208
size = termios .tcgetwinsize (self .fd )
157
209
self .assertIsInstance (size , tuple )
0 commit comments