Skip to content

Commit 8a5a18a

Browse files
vstinnercmaloney
andauthored
gh-129205: Modernize test_eintr (#129316)
* Use f-string. * Fix grammar: replace 'datas' with 'data' (and replace 'data' with 'item'). * Remove unused variables: 'pid' and 'old_mask'. * Factorize test_read() and test_readinto() code. Co-authored-by: Cody Maloney <cmaloney@users.noreply.github.com>
1 parent 75b4962 commit 8a5a18a

File tree

1 file changed

+48
-69
lines changed

1 file changed

+48
-69
lines changed

Diff for: Lib/test/_test_eintr.py

+48-69
Original file line numberDiff line numberDiff line change
@@ -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,65 +123,45 @@ 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-
def test_readinto(self):
156-
rd, wr = os.pipe()
157-
self.addCleanup(os.close, rd)
158-
# wr closed explicitly by parent
159-
160-
# the payload below are smaller than PIPE_BUF, hence the writes will be
161-
# atomic
162-
datas = [b"hello", b"world", b"spam"]
163-
164-
code = '\n'.join((
165-
'import os, sys, time',
166-
'',
167-
'wr = int(sys.argv[1])',
168-
'datas = %r' % datas,
169-
'sleep_time = %r' % self.sleep_time,
170-
'',
171-
'for data in datas:',
172-
' # let the parent block on read()',
173-
' time.sleep(sleep_time)',
174-
' os.write(wr, data)',
175-
))
156+
def test_read(self):
157+
for fd, expected in self._interrupted_reads():
158+
self.assertEqual(expected, os.read(fd, len(expected)))
176159

177-
proc = self.subprocess(code, str(wr), pass_fds=[wr])
178-
with kill_on_error(proc):
179-
os.close(wr)
180-
for data in datas:
181-
buffer = bytearray(len(data))
182-
self.assertEqual(os.readinto(rd, buffer), len(data))
183-
self.assertEqual(buffer, data)
184-
self.assertEqual(proc.wait(), 0)
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)
185165

186166
def test_write(self):
187167
rd, wr = os.pipe()
@@ -195,8 +175,8 @@ def test_write(self):
195175
'import io, os, sys, time',
196176
'',
197177
'rd = int(sys.argv[1])',
198-
'sleep_time = %r' % self.sleep_time,
199-
'data = b"x" * %s' % support.PIPE_MAX_SIZE,
178+
f'sleep_time = {self.sleep_time!r}',
179+
f'data = b"x" * {support.PIPE_MAX_SIZE}',
200180
'data_len = len(data)',
201181
'',
202182
'# let the parent block on write()',
@@ -209,8 +189,8 @@ def test_write(self):
209189
'',
210190
'value = read_data.getvalue()',
211191
'if value != data:',
212-
' raise Exception("read error: %s vs %s bytes"',
213-
' % (len(value), data_len))',
192+
' raise Exception(f"read error: {len(value)}'
193+
' vs {data_len} bytes")',
214194
))
215195

216196
proc = self.subprocess(code, str(rd), pass_fds=[rd])
@@ -233,33 +213,33 @@ def _test_recv(self, recv_func):
233213
# wr closed explicitly by parent
234214

235215
# single-byte payload guard us against partial recv
236-
datas = [b"x", b"y", b"z"]
216+
data = [b"x", b"y", b"z"]
237217

238218
code = '\n'.join((
239219
'import os, socket, sys, time',
240220
'',
241221
'fd = int(sys.argv[1])',
242-
'family = %s' % int(wr.family),
243-
'sock_type = %s' % int(wr.type),
244-
'datas = %r' % datas,
245-
'sleep_time = %r' % self.sleep_time,
222+
f'family = {int(wr.family)}',
223+
f'sock_type = {int(wr.type)}',
224+
f'data = {data!r}',
225+
f'sleep_time = {self.sleep_time!r}',
246226
'',
247227
'wr = socket.fromfd(fd, family, sock_type)',
248228
'os.close(fd)',
249229
'',
250230
'with wr:',
251-
' for data in datas:',
231+
' for item in data:',
252232
' # let the parent block on recv()',
253233
' time.sleep(sleep_time)',
254-
' wr.sendall(data)',
234+
' wr.sendall(item)',
255235
))
256236

257237
fd = wr.fileno()
258238
proc = self.subprocess(code, str(fd), pass_fds=[fd])
259239
with kill_on_error(proc):
260240
wr.close()
261-
for data in datas:
262-
self.assertEqual(data, recv_func(rd, len(data)))
241+
for item in data:
242+
self.assertEqual(item, recv_func(rd, len(item)))
263243
self.assertEqual(proc.wait(), 0)
264244

265245
def test_recv(self):
@@ -281,10 +261,10 @@ def _test_send(self, send_func):
281261
'import os, socket, sys, time',
282262
'',
283263
'fd = int(sys.argv[1])',
284-
'family = %s' % int(rd.family),
285-
'sock_type = %s' % int(rd.type),
286-
'sleep_time = %r' % self.sleep_time,
287-
'data = b"xyz" * %s' % (support.SOCK_MAX_SIZE // 3),
264+
f'family = {int(rd.family)}',
265+
f'sock_type = {int(rd.type)}',
266+
f'sleep_time = {self.sleep_time!r}',
267+
f'data = b"xyz" * {support.SOCK_MAX_SIZE // 3}',
288268
'data_len = len(data)',
289269
'',
290270
'rd = socket.fromfd(fd, family, sock_type)',
@@ -300,8 +280,8 @@ def _test_send(self, send_func):
300280
' n += rd.recv_into(memoryview(received_data)[n:])',
301281
'',
302282
'if received_data != data:',
303-
' raise Exception("recv error: %s vs %s bytes"',
304-
' % (len(received_data), data_len))',
283+
' raise Exception(f"recv error: {len(received_data)}'
284+
' vs {data_len} bytes")',
305285
))
306286

307287
fd = rd.fileno()
@@ -333,9 +313,9 @@ def test_accept(self):
333313
code = '\n'.join((
334314
'import socket, time',
335315
'',
336-
'host = %r' % socket_helper.HOST,
337-
'port = %s' % port,
338-
'sleep_time = %r' % self.sleep_time,
316+
f'host = {socket_helper.HOST!r}',
317+
f'port = {port}',
318+
f'sleep_time = {self.sleep_time!r}',
339319
'',
340320
'# let parent block on accept()',
341321
'time.sleep(sleep_time)',
@@ -363,15 +343,15 @@ def _test_open(self, do_open_close_reader, do_open_close_writer):
363343
os_helper.unlink(filename)
364344
try:
365345
os.mkfifo(filename)
366-
except PermissionError as e:
367-
self.skipTest('os.mkfifo(): %s' % e)
346+
except PermissionError as exc:
347+
self.skipTest(f'os.mkfifo(): {exc!r}')
368348
self.addCleanup(os_helper.unlink, filename)
369349

370350
code = '\n'.join((
371351
'import os, time',
372352
'',
373-
'path = %a' % filename,
374-
'sleep_time = %r' % self.sleep_time,
353+
f'path = {filename!a}',
354+
f'sleep_time = {self.sleep_time!r}',
375355
'',
376356
'# let the parent block',
377357
'time.sleep(sleep_time)',
@@ -427,21 +407,20 @@ class SignalEINTRTest(EINTRBaseTest):
427407

428408
def check_sigwait(self, wait_func):
429409
signum = signal.SIGUSR1
430-
pid = os.getpid()
431410

432411
old_handler = signal.signal(signum, lambda *args: None)
433412
self.addCleanup(signal.signal, signum, old_handler)
434413

435414
code = '\n'.join((
436415
'import os, time',
437-
'pid = %s' % os.getpid(),
438-
'signum = %s' % int(signum),
439-
'sleep_time = %r' % self.sleep_time,
416+
f'pid = {os.getpid()}',
417+
f'signum = {int(signum)}',
418+
f'sleep_time = {self.sleep_time!r}',
440419
'time.sleep(sleep_time)',
441420
'os.kill(pid, signum)',
442421
))
443422

444-
old_mask = signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
423+
signal.pthread_sigmask(signal.SIG_BLOCK, [signum])
445424
self.addCleanup(signal.pthread_sigmask, signal.SIG_UNBLOCK, [signum])
446425

447426
proc = self.subprocess(code)

0 commit comments

Comments
 (0)