@@ -91,7 +91,7 @@ class OSEINTRTest(EINTRBaseTest):
9191 """ EINTR tests for the os module. """
9292
9393 def new_sleep_process (self ):
94- code = 'import time; time.sleep(%r)' % self .sleep_time
94+ code = f 'import time; time.sleep({ self .sleep_time !r } )'
9595 return self .subprocess (code )
9696
9797 def _test_wait_multiple (self , wait_func ):
@@ -123,36 +123,47 @@ def test_waitpid(self):
123123 def test_wait4 (self ):
124124 self ._test_wait_single (lambda pid : os .wait4 (pid , 0 ))
125125
126- def test_read (self ):
126+ def _interrupted_reads (self ):
127+ """Make a fd which will force block on read of expected bytes."""
127128 rd , wr = os .pipe ()
128129 self .addCleanup (os .close , rd )
129130 # wr closed explicitly by parent
130131
131132 # the payload below are smaller than PIPE_BUF, hence the writes will be
132133 # atomic
133- datas = [b"hello" , b"world" , b"spam" ]
134+ data = [b"hello" , b"world" , b"spam" ]
134135
135136 code = '\n ' .join ((
136137 'import os, sys, time' ,
137138 '' ,
138139 'wr = int(sys.argv[1])' ,
139- 'datas = %r' % datas ,
140- 'sleep_time = %r' % self .sleep_time ,
140+ f'data = { data !r } ' ,
141+ f 'sleep_time = { self .sleep_time !r } ' ,
141142 '' ,
142- 'for data in datas :' ,
143+ 'for item in data :' ,
143144 ' # let the parent block on read()' ,
144145 ' time.sleep(sleep_time)' ,
145- ' os.write(wr, data )' ,
146+ ' os.write(wr, item )' ,
146147 ))
147148
148149 proc = self .subprocess (code , str (wr ), pass_fds = [wr ])
149150 with kill_on_error (proc ):
150151 os .close (wr )
151- for data in datas :
152- self . assertEqual ( data , os . read ( rd , len ( data )))
152+ for datum in data :
153+ yield rd , datum
153154 self .assertEqual (proc .wait (), 0 )
154155
155- @unittest .expectedFailure # TODO: RUSTPYTHON InterruptedError: [Errno 4] Interrupted system call
156+ def test_read (self ):
157+ for fd , expected in self ._interrupted_reads ():
158+ self .assertEqual (expected , os .read (fd , len (expected )))
159+
160+ def test_readinto (self ):
161+ for fd , expected in self ._interrupted_reads ():
162+ buffer = bytearray (len (expected ))
163+ self .assertEqual (os .readinto (fd , buffer ), len (expected ))
164+ self .assertEqual (buffer , expected )
165+
166+ @unittest .expectedFailure # TODO: RUSTPYTHON; InterruptedError: [Errno 4] Interrupted system call
156167 def test_write (self ):
157168 rd , wr = os .pipe ()
158169 self .addCleanup (os .close , wr )
@@ -165,8 +176,8 @@ def test_write(self):
165176 'import io, os, sys, time' ,
166177 '' ,
167178 'rd = int(sys.argv[1])' ,
168- 'sleep_time = %r' % self .sleep_time ,
169- 'data = b"x" * %s' % support .PIPE_MAX_SIZE ,
179+ f 'sleep_time = { self .sleep_time !r } ' ,
180+ f 'data = b"x" * { support .PIPE_MAX_SIZE } ' ,
170181 'data_len = len(data)' ,
171182 '' ,
172183 '# let the parent block on write()' ,
@@ -179,8 +190,8 @@ def test_write(self):
179190 '' ,
180191 'value = read_data.getvalue()' ,
181192 'if value != data:' ,
182- ' raise Exception("read error: %s vs %s bytes"' ,
183- ' % (len(value), data_len) )' ,
193+ ' raise Exception(f "read error: {len(value)}'
194+ ' vs { data_len} bytes" )' ,
184195 ))
185196
186197 proc = self .subprocess (code , str (rd ), pass_fds = [rd ])
@@ -203,33 +214,33 @@ def _test_recv(self, recv_func):
203214 # wr closed explicitly by parent
204215
205216 # single-byte payload guard us against partial recv
206- datas = [b"x" , b"y" , b"z" ]
217+ data = [b"x" , b"y" , b"z" ]
207218
208219 code = '\n ' .join ((
209220 'import os, socket, sys, time' ,
210221 '' ,
211222 'fd = int(sys.argv[1])' ,
212- 'family = %s' % int (wr .family ),
213- 'sock_type = %s' % int (wr .type ),
214- 'datas = %r' % datas ,
215- 'sleep_time = %r' % self .sleep_time ,
223+ f 'family = { int (wr .family )} ' ,
224+ f 'sock_type = { int (wr .type )} ' ,
225+ f'data = { data !r } ' ,
226+ f 'sleep_time = { self .sleep_time !r } ' ,
216227 '' ,
217228 'wr = socket.fromfd(fd, family, sock_type)' ,
218229 'os.close(fd)' ,
219230 '' ,
220231 'with wr:' ,
221- ' for data in datas :' ,
232+ ' for item in data :' ,
222233 ' # let the parent block on recv()' ,
223234 ' time.sleep(sleep_time)' ,
224- ' wr.sendall(data )' ,
235+ ' wr.sendall(item )' ,
225236 ))
226237
227238 fd = wr .fileno ()
228239 proc = self .subprocess (code , str (fd ), pass_fds = [fd ])
229240 with kill_on_error (proc ):
230241 wr .close ()
231- for data in datas :
232- self .assertEqual (data , recv_func (rd , len (data )))
242+ for item in data :
243+ self .assertEqual (item , recv_func (rd , len (item )))
233244 self .assertEqual (proc .wait (), 0 )
234245
235246 def test_recv (self ):
@@ -251,10 +262,10 @@ def _test_send(self, send_func):
251262 'import os, socket, sys, time' ,
252263 '' ,
253264 'fd = int(sys.argv[1])' ,
254- 'family = %s' % int (rd .family ),
255- 'sock_type = %s' % int (rd .type ),
256- 'sleep_time = %r' % self .sleep_time ,
257- 'data = b"xyz" * %s' % ( support .SOCK_MAX_SIZE // 3 ) ,
265+ f 'family = { int (rd .family )} ' ,
266+ f 'sock_type = { int (rd .type )} ' ,
267+ f 'sleep_time = { self .sleep_time !r } ' ,
268+ f 'data = b"xyz" * { support .SOCK_MAX_SIZE // 3 } ' ,
258269 'data_len = len(data)' ,
259270 '' ,
260271 'rd = socket.fromfd(fd, family, sock_type)' ,
@@ -270,8 +281,8 @@ def _test_send(self, send_func):
270281 ' n += rd.recv_into(memoryview(received_data)[n:])' ,
271282 '' ,
272283 'if received_data != data:' ,
273- ' raise Exception("recv error: %s vs %s bytes"' ,
274- ' % (len(received_data), data_len) )' ,
284+ ' raise Exception(f "recv error: {len(received_data)}'
285+ ' vs { data_len} bytes" )' ,
275286 ))
276287
277288 fd = rd .fileno ()
@@ -303,9 +314,9 @@ def test_accept(self):
303314 code = '\n ' .join ((
304315 'import socket, time' ,
305316 '' ,
306- 'host = %r' % socket_helper .HOST ,
307- 'port = %s' % port ,
308- 'sleep_time = %r' % self .sleep_time ,
317+ f 'host = { socket_helper .HOST !r } ' ,
318+ f 'port = { port } ' ,
319+ f 'sleep_time = { self .sleep_time !r } ' ,
309320 '' ,
310321 '# let parent block on accept()' ,
311322 'time.sleep(sleep_time)' ,
@@ -333,15 +344,15 @@ def _test_open(self, do_open_close_reader, do_open_close_writer):
333344 os_helper .unlink (filename )
334345 try :
335346 os .mkfifo (filename )
336- except PermissionError as e :
337- self .skipTest ('os.mkfifo(): %s' % e )
347+ except PermissionError as exc :
348+ self .skipTest (f 'os.mkfifo(): { exc !r } ' )
338349 self .addCleanup (os_helper .unlink , filename )
339350
340351 code = '\n ' .join ((
341352 'import os, time' ,
342353 '' ,
343- 'path = %a' % filename ,
344- 'sleep_time = %r' % self .sleep_time ,
354+ f 'path = { filename !a } ' ,
355+ f 'sleep_time = { self .sleep_time !r } ' ,
345356 '' ,
346357 '# let the parent block' ,
347358 'time.sleep(sleep_time)' ,
@@ -400,21 +411,20 @@ class SignalEINTRTest(EINTRBaseTest):
400411
401412 def check_sigwait (self , wait_func ):
402413 signum = signal .SIGUSR1
403- pid = os .getpid ()
404414
405415 old_handler = signal .signal (signum , lambda * args : None )
406416 self .addCleanup (signal .signal , signum , old_handler )
407417
408418 code = '\n ' .join ((
409419 'import os, time' ,
410- 'pid = %s' % os .getpid (),
411- 'signum = %s' % int (signum ),
412- 'sleep_time = %r' % self .sleep_time ,
420+ f 'pid = { os .getpid ()} ' ,
421+ f 'signum = { int (signum )} ' ,
422+ f 'sleep_time = { self .sleep_time !r } ' ,
413423 'time.sleep(sleep_time)' ,
414424 'os.kill(pid, signum)' ,
415425 ))
416426
417- old_mask = signal .pthread_sigmask (signal .SIG_BLOCK , [signum ])
427+ signal .pthread_sigmask (signal .SIG_BLOCK , [signum ])
418428 self .addCleanup (signal .pthread_sigmask , signal .SIG_UNBLOCK , [signum ])
419429
420430 proc = self .subprocess (code )
@@ -452,7 +462,7 @@ def test_select(self):
452462 self .stop_alarm ()
453463 self .check_elapsed_time (dt )
454464
455- @unittest .skip (' TODO: RUSTPYTHON timed out at the 10 minute mark' )
465+ @unittest .skip (" TODO: RUSTPYTHON; timed out at the 10 minute mark" )
456466 @unittest .skipIf (sys .platform == "darwin" ,
457467 "poll may fail on macOS; see issue #28087" )
458468 @unittest .skipUnless (hasattr (select , 'poll' ), 'need select.poll' )
@@ -534,14 +544,14 @@ def _lock(self, lock_func, lock_name):
534544 self .check_elapsed_time (dt )
535545 proc .wait ()
536546
537- @unittest .expectedFailure # TODO: RUSTPYTHON InterruptedError: [Errno 4] Interrupted system call
538547 # Issue 35633: See https://bugs.python.org/issue35633#msg333662
539548 # skip test rather than accept PermissionError from all platforms
549+ @unittest .expectedFailure # TODO: RUSTPYTHON; InterruptedError: [Errno 4] Interrupted system call
540550 @unittest .skipIf (platform .system () == "AIX" , "AIX returns PermissionError" )
541551 def test_lockf (self ):
542552 self ._lock (fcntl .lockf , "lockf" )
543553
544- @unittest .expectedFailure # TODO: RUSTPYTHON InterruptedError: [Errno 4] Interrupted system call
554+ @unittest .expectedFailure # TODO: RUSTPYTHON; InterruptedError: [Errno 4] Interrupted system call
545555 def test_flock (self ):
546556 self ._lock (fcntl .flock , "flock" )
547557
0 commit comments