Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5b10b98

Browse files
bpo-22831: Use "with" to avoid possible fd leaks in tests (part 2). (GH-10929)
1 parent 9e4861f commit 5b10b98

25 files changed

Lines changed: 264 additions & 323 deletions

Lib/test/support/__init__.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -706,9 +706,8 @@ def find_unused_port(family=socket.AF_INET, socktype=socket.SOCK_STREAM):
706706
issue if/when we come across it.
707707
"""
708708

709-
tempsock = socket.socket(family, socktype)
710-
port = bind_port(tempsock)
711-
tempsock.close()
709+
with socket.socket(family, socktype) as tempsock:
710+
port = bind_port(tempsock)
712711
del tempsock
713712
return port
714713

@@ -1785,10 +1784,11 @@ def start(self):
17851784
sys.stderr.flush()
17861785
return
17871786

1788-
watchdog_script = findfile("memory_watchdog.py")
1789-
self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script],
1790-
stdin=f, stderr=subprocess.DEVNULL)
1791-
f.close()
1787+
with f:
1788+
watchdog_script = findfile("memory_watchdog.py")
1789+
self.mem_watchdog = subprocess.Popen([sys.executable, watchdog_script],
1790+
stdin=f,
1791+
stderr=subprocess.DEVNULL)
17921792
self.started = True
17931793

17941794
def stop(self):

Lib/test/support/script_helper.py

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -205,31 +205,28 @@ def make_script(script_dir, script_basename, source, omit_suffix=False):
205205
script_filename += os.extsep + 'py'
206206
script_name = os.path.join(script_dir, script_filename)
207207
# The script should be encoded to UTF-8, the default string encoding
208-
script_file = open(script_name, 'w', encoding='utf-8')
209-
script_file.write(source)
210-
script_file.close()
208+
with open(script_name, 'w', encoding='utf-8') as script_file:
209+
script_file.write(source)
211210
importlib.invalidate_caches()
212211
return script_name
213212

214213
def make_zip_script(zip_dir, zip_basename, script_name, name_in_zip=None):
215214
zip_filename = zip_basename+os.extsep+'zip'
216215
zip_name = os.path.join(zip_dir, zip_filename)
217-
zip_file = zipfile.ZipFile(zip_name, 'w')
218-
if name_in_zip is None:
219-
parts = script_name.split(os.sep)
220-
if len(parts) >= 2 and parts[-2] == '__pycache__':
221-
legacy_pyc = make_legacy_pyc(source_from_cache(script_name))
222-
name_in_zip = os.path.basename(legacy_pyc)
223-
script_name = legacy_pyc
224-
else:
225-
name_in_zip = os.path.basename(script_name)
226-
zip_file.write(script_name, name_in_zip)
227-
zip_file.close()
216+
with zipfile.ZipFile(zip_name, 'w') as zip_file:
217+
if name_in_zip is None:
218+
parts = script_name.split(os.sep)
219+
if len(parts) >= 2 and parts[-2] == '__pycache__':
220+
legacy_pyc = make_legacy_pyc(source_from_cache(script_name))
221+
name_in_zip = os.path.basename(legacy_pyc)
222+
script_name = legacy_pyc
223+
else:
224+
name_in_zip = os.path.basename(script_name)
225+
zip_file.write(script_name, name_in_zip)
228226
#if test.support.verbose:
229-
# zip_file = zipfile.ZipFile(zip_name, 'r')
230-
# print 'Contents of %r:' % zip_name
231-
# zip_file.printdir()
232-
# zip_file.close()
227+
# with zipfile.ZipFile(zip_name, 'r') as zip_file:
228+
# print 'Contents of %r:' % zip_name
229+
# zip_file.printdir()
233230
return zip_name, os.path.join(zip_name, name_in_zip)
234231

235232
def make_pkg(pkg_dir, init_source=''):
@@ -252,17 +249,15 @@ def make_zip_pkg(zip_dir, zip_basename, pkg_name, script_basename,
252249
script_name_in_zip = os.path.join(pkg_names[-1], os.path.basename(script_name))
253250
zip_filename = zip_basename+os.extsep+'zip'
254251
zip_name = os.path.join(zip_dir, zip_filename)
255-
zip_file = zipfile.ZipFile(zip_name, 'w')
256-
for name in pkg_names:
257-
init_name_in_zip = os.path.join(name, init_basename)
258-
zip_file.write(init_name, init_name_in_zip)
259-
zip_file.write(script_name, script_name_in_zip)
260-
zip_file.close()
252+
with zipfile.ZipFile(zip_name, 'w') as zip_file:
253+
for name in pkg_names:
254+
init_name_in_zip = os.path.join(name, init_basename)
255+
zip_file.write(init_name, init_name_in_zip)
256+
zip_file.write(script_name, script_name_in_zip)
261257
for name in unlink:
262258
os.unlink(name)
263259
#if test.support.verbose:
264-
# zip_file = zipfile.ZipFile(zip_name, 'r')
265-
# print 'Contents of %r:' % zip_name
266-
# zip_file.printdir()
267-
# zip_file.close()
260+
# with zipfile.ZipFile(zip_name, 'r') as zip_file:
261+
# print 'Contents of %r:' % zip_name
262+
# zip_file.printdir()
268263
return zip_name, os.path.join(zip_name, script_name_in_zip)

Lib/test/test_argparse.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1379,9 +1379,8 @@ def setUp(self):
13791379
('invalid', '@no-such-path\n'),
13801380
]
13811381
for path, text in file_texts:
1382-
file = open(path, 'w')
1383-
file.write(text)
1384-
file.close()
1382+
with open(path, 'w') as file:
1383+
file.write(text)
13851384

13861385
parser_signature = Sig(fromfile_prefix_chars='@')
13871386
argument_signatures = [
@@ -1410,9 +1409,8 @@ def setUp(self):
14101409
('hello', 'hello world!\n'),
14111410
]
14121411
for path, text in file_texts:
1413-
file = open(path, 'w')
1414-
file.write(text)
1415-
file.close()
1412+
with open(path, 'w') as file:
1413+
file.write(text)
14161414

14171415
class FromFileConverterArgumentParser(ErrorRaisingArgumentParser):
14181416

@@ -1493,9 +1491,8 @@ class TestFileTypeR(TempDirMixin, ParserTestCase):
14931491
def setUp(self):
14941492
super(TestFileTypeR, self).setUp()
14951493
for file_name in ['foo', 'bar']:
1496-
file = open(os.path.join(self.temp_dir, file_name), 'w')
1497-
file.write(file_name)
1498-
file.close()
1494+
with open(os.path.join(self.temp_dir, file_name), 'w') as file:
1495+
file.write(file_name)
14991496
self.create_readonly_file('readonly')
15001497

15011498
argument_signatures = [
@@ -1534,9 +1531,8 @@ class TestFileTypeRB(TempDirMixin, ParserTestCase):
15341531
def setUp(self):
15351532
super(TestFileTypeRB, self).setUp()
15361533
for file_name in ['foo', 'bar']:
1537-
file = open(os.path.join(self.temp_dir, file_name), 'w')
1538-
file.write(file_name)
1539-
file.close()
1534+
with open(os.path.join(self.temp_dir, file_name), 'w') as file:
1535+
file.write(file_name)
15401536

15411537
argument_signatures = [
15421538
Sig('-x', type=argparse.FileType('rb')),

Lib/test/test_binhex.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,17 +23,15 @@ def tearDown(self):
2323
DATA = b'Jack is my hero'
2424

2525
def test_binhex(self):
26-
f = open(self.fname1, 'wb')
27-
f.write(self.DATA)
28-
f.close()
26+
with open(self.fname1, 'wb') as f:
27+
f.write(self.DATA)
2928

3029
binhex.binhex(self.fname1, self.fname2)
3130

3231
binhex.hexbin(self.fname2, self.fname1)
3332

34-
f = open(self.fname1, 'rb')
35-
finish = f.readline()
36-
f.close()
33+
with open(self.fname1, 'rb') as f:
34+
finish = f.readline()
3735

3836
self.assertEqual(self.DATA, finish)
3937

Lib/test/test_bool.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,11 @@ class C(bool):
2020

2121
def test_print(self):
2222
try:
23-
fo = open(support.TESTFN, "w")
24-
print(False, True, file=fo)
25-
fo.close()
26-
fo = open(support.TESTFN, "r")
27-
self.assertEqual(fo.read(), 'False True\n')
23+
with open(support.TESTFN, "w") as fo:
24+
print(False, True, file=fo)
25+
with open(support.TESTFN, "r") as fi:
26+
self.assertEqual(fi.read(), 'False True\n')
2827
finally:
29-
fo.close()
3028
os.remove(support.TESTFN)
3129

3230
def test_repr(self):
@@ -245,9 +243,8 @@ def test_boolean(self):
245243

246244
def test_fileclosed(self):
247245
try:
248-
f = open(support.TESTFN, "w")
249-
self.assertIs(f.closed, False)
250-
f.close()
246+
with open(support.TESTFN, "w") as f:
247+
self.assertIs(f.closed, False)
251248
self.assertIs(f.closed, True)
252249
finally:
253250
os.remove(support.TESTFN)

Lib/test/test_codecs.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1242,9 +1242,8 @@ def test_errors(self):
12421242
class RecodingTest(unittest.TestCase):
12431243
def test_recoding(self):
12441244
f = io.BytesIO()
1245-
f2 = codecs.EncodedFile(f, "unicode_internal", "utf-8")
1246-
f2.write("a")
1247-
f2.close()
1245+
with codecs.EncodedFile(f, "unicode_internal", "utf-8") as f2:
1246+
f2.write("a")
12481247
# Python used to crash on this at exit because of a refcount
12491248
# bug in _codecsmodule.c
12501249

Lib/test/test_epoll.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -143,18 +143,17 @@ def test_add(self):
143143
def test_fromfd(self):
144144
server, client = self._connected_pair()
145145

146-
ep = select.epoll(2)
147-
ep2 = select.epoll.fromfd(ep.fileno())
146+
with select.epoll(2) as ep:
147+
ep2 = select.epoll.fromfd(ep.fileno())
148148

149-
ep2.register(server.fileno(), select.EPOLLIN | select.EPOLLOUT)
150-
ep2.register(client.fileno(), select.EPOLLIN | select.EPOLLOUT)
149+
ep2.register(server.fileno(), select.EPOLLIN | select.EPOLLOUT)
150+
ep2.register(client.fileno(), select.EPOLLIN | select.EPOLLOUT)
151151

152-
events = ep.poll(1, 4)
153-
events2 = ep2.poll(0.9, 4)
154-
self.assertEqual(len(events), 2)
155-
self.assertEqual(len(events2), 2)
152+
events = ep.poll(1, 4)
153+
events2 = ep2.poll(0.9, 4)
154+
self.assertEqual(len(events), 2)
155+
self.assertEqual(len(events2), 2)
156156

157-
ep.close()
158157
try:
159158
ep2.poll(1, 4)
160159
except OSError as e:

Lib/test/test_float.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -722,15 +722,14 @@ def test_issue35560(self):
722722

723723
class ReprTestCase(unittest.TestCase):
724724
def test_repr(self):
725-
floats_file = open(os.path.join(os.path.split(__file__)[0],
726-
'floating_points.txt'))
727-
for line in floats_file:
728-
line = line.strip()
729-
if not line or line.startswith('#'):
730-
continue
731-
v = eval(line)
732-
self.assertEqual(v, eval(repr(v)))
733-
floats_file.close()
725+
with open(os.path.join(os.path.split(__file__)[0],
726+
'floating_points.txt')) as floats_file:
727+
for line in floats_file:
728+
line = line.strip()
729+
if not line or line.startswith('#'):
730+
continue
731+
v = eval(line)
732+
self.assertEqual(v, eval(repr(v)))
734733

735734
@unittest.skipUnless(getattr(sys, 'float_repr_style', '') == 'short',
736735
"applies only when using short float repr style")

Lib/test/test_ioctl.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@
1111
except OSError:
1212
raise unittest.SkipTest("Unable to open /dev/tty")
1313
else:
14-
# Skip if another process is in foreground
15-
r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ")
16-
tty.close()
14+
with tty:
15+
# Skip if another process is in foreground
16+
r = fcntl.ioctl(tty, termios.TIOCGPGRP, " ")
1717
rpgrp = struct.unpack("i", r)[0]
1818
if rpgrp not in (os.getpgrp(), os.getsid(0)):
1919
raise unittest.SkipTest("Neither the process group nor the session "

Lib/test/test_os.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1200,9 +1200,8 @@ def test_exist_ok_s_isgid_directory(self):
12001200
def test_exist_ok_existing_regular_file(self):
12011201
base = support.TESTFN
12021202
path = os.path.join(support.TESTFN, 'dir1')
1203-
f = open(path, 'w')
1204-
f.write('abc')
1205-
f.close()
1203+
with open(path, 'w') as f:
1204+
f.write('abc')
12061205
self.assertRaises(OSError, os.makedirs, path)
12071206
self.assertRaises(OSError, os.makedirs, path, exist_ok=False)
12081207
self.assertRaises(OSError, os.makedirs, path, exist_ok=True)

0 commit comments

Comments
 (0)