You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Use the 'with' statement in conjunction with 'open' throughout test modules #52192
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
assignee='https://github.com/ezio-melotti'closed_at=<Date2016-01-13.20:23:00.745>created_at=<Date2010-02-16.17:43:50.012>labels= ['easy', 'type-feature', 'tests']
title="Use the 'with' statement in conjunction with 'open' throughout test modules"updated_at=<Date2016-01-13.20:23:00.744>user='https://bugs.python.org/midnightdf'
Sprinkled throughout CPython's test modules are snippets of code such as the following taken from 2.7A3's test_old_mailbox.py (line 141):
box = mailbox.UnixMailbox(open(self._path, 'r'))
The key thing to observe here is the file being opened yet never has it's 'close' method explicitly called. While this is fine for CPython's rather predictable garbage collections, it's quite possible that in alternate implementations of Python this file object won't be destroyed until well after line 141. This can result in seemingly random failures of CPython's tests under alternate implementations of Python.
The solution to this problem would be to consistently use the 'with' statement (or alternatively close all open file objects) throughout all CPython test modules.
I've gone ahead and submitted an updated (2.7A3) version of test_old_mailbox.py which addresses this. We can find other places where this is going on as well, but for the most part the tests already seem to be doing the right thing.
Please use patches to show where the code changed.
(I generated one; it looks good to me)
I would like this kind of patches applied to CPython.
Looking at the Pypy test suite, the following test files seem easy to update:
test_bz2
test_dumbdbm
test_mailbox
test_marshal
test_mmap
test_pkgimport
test_tarfile
test_tempfile
test_traceback
There are several standard library modules that deliberately maintain compatibility with earlier versions of Python. The 'with' statement shouldn't be used for tests of any modules that still need compatibility with Python 2.4.
I'm not sure that this is a worthwhile exercise unless it can be shown for certain that alternate implementations need this. Otherwise, it just changes tests in a way that isn't backwards compatible, makes it more difficult to apply patches cleanly, and risks damaging an otherwise good test.
midnightdf commented on Oct 13, 2010
midnightdfmannequin
MannequinAuthor
More actions
I guarantee you that IronPython needs this. I was a tester on IronPython for four years, and saw hundreds of random failures due to this specific issue.
Backported test_gzip to to release27-maint in r85446.
Backported test_mailbox to to release27-maint in r85447.
Backported test_bz2 to to release27-maint in r85448.
Fixed test_old_mailbox, the original problem file, in release27-maint in r85449.
BreamoreBoy commented on Apr 1, 2013
BreamoreBoymannequin
Mannequin
More actions
bpo-7232 has been closed so test_tarfile can presumably now be committed, also test_os.
FWIW test_tarfile seems to use the "with" statement on 3.3+ already.
On 2.7 is not always used, but I'm not sure it's worth backporting/fixing the remaining occurrences there.
Most of the fixes in the test_os patch have already being applied too.
Either someone updates the current patch and/or proposes new ones, or this can probably be closed.
Activity
midnightdf commentedon Feb 16, 2010
Sprinkled throughout CPython's test modules are snippets of code such as the following taken from 2.7A3's test_old_mailbox.py (line 141):
box = mailbox.UnixMailbox(open(self._path, 'r'))
The key thing to observe here is the file being opened yet never has it's 'close' method explicitly called. While this is fine for CPython's rather predictable garbage collections, it's quite possible that in alternate implementations of Python this file object won't be destroyed until well after line 141. This can result in seemingly random failures of CPython's tests under alternate implementations of Python.
The solution to this problem would be to consistently use the 'with' statement (or alternatively close all open file objects) throughout all CPython test modules.
I've gone ahead and submitted an updated (2.7A3) version of test_old_mailbox.py which addresses this. We can find other places where this is going on as well, but for the most part the tests already seem to be doing the right thing.
amauryfa commentedon Feb 16, 2010
Please use patches to show where the code changed.
(I generated one; it looks good to me)
I would like this kind of patches applied to CPython.
Looking at the Pypy test suite, the following test files seem easy to update:
test_bz2
test_dumbdbm
test_mailbox
test_marshal
test_mmap
test_pkgimport
test_tarfile
test_tempfile
test_traceback
briancurtin commentedon Feb 20, 2010
Does anyone prefer if this should be done on a patch-per-module basis, or just throw together one huge change?
Also, I've found a few places where context managers aren't supported where they probably should be, so I'll spin off separate issues for those.
voidspace commentedon Feb 20, 2010
There are several standard library modules that deliberately maintain compatibility with earlier versions of Python. The 'with' statement shouldn't be used for tests of any modules that still need compatibility with Python 2.4.
ezio-melotti commentedon Feb 20, 2010
Some are listed in the PEP-291 (http://www.python.org/dev/peps/pep-0291/) but I don't know if that list is really updated.
briancurtin commentedon Feb 22, 2010
I'm going to go ahead with the patch-per-module approach, but anyone feel free to stop me from doing that.
Here's a patch for test_gzip on trunk.
briancurtin commentedon Feb 22, 2010
Here's a patch for test_marshal on trunk.
briancurtin commentedon Feb 22, 2010
Here's a patch for test_tempfile on trunk. The rest will just be silently added since this is already annoying.
briancurtin commentedon Feb 22, 2010
Patch for test_tarfile. However, bpo-7232 needs to go in first.
briancurtin commentedon Oct 13, 2010
Fixed test_gzip in r85400.
briancurtin commentedon Oct 13, 2010
Fixed test_mailbox in r85401.
Fixed test_marshal in r85402.
Fixed test_bz2 in r85403.
giampaolo commentedon Oct 13, 2010
Here is a patch for test_os.py.
rhettinger commentedon Oct 13, 2010
I'm not sure that this is a worthwhile exercise unless it can be shown for certain that alternate implementations need this. Otherwise, it just changes tests in a way that isn't backwards compatible, makes it more difficult to apply patches cleanly, and risks damaging an otherwise good test.
midnightdf commentedon Oct 13, 2010
I guarantee you that IronPython needs this. I was a tester on IronPython for four years, and saw hundreds of random failures due to this specific issue.
My best,
Dave
rhettinger commentedon Oct 13, 2010
If you're sure that is still the case, this can proceed.
briancurtin commentedon Oct 14, 2010
Backported test_gzip to to release27-maint in r85446.
Backported test_mailbox to to release27-maint in r85447.
Backported test_bz2 to to release27-maint in r85448.
Fixed test_old_mailbox, the original problem file, in release27-maint in r85449.
BreamoreBoy commentedon Apr 1, 2013
bpo-7232 has been closed so test_tarfile can presumably now be committed, also test_os.
ezio-melotti commentedon Apr 2, 2013
FWIW test_tarfile seems to use the "with" statement on 3.3+ already.
On 2.7 is not always used, but I'm not sure it's worth backporting/fixing the remaining occurrences there.
Most of the fixes in the test_os patch have already being applied too.
Either someone updates the current patch and/or proposes new ones, or this can probably be closed.
BreamoreBoy commentedon Jul 31, 2014
Following on from msg185817 I'd suggest this is closed.
evansmungai commentedon Aug 2, 2014
Backport for test_tarfile.py
python-dev commentedon Jan 13, 2016
New changeset e3763d98c46e by Ezio Melotti in branch '2.7':
bpo-7944: close files explicitly in test_tarfile (backport d560eece0857).
https://hg.python.org/cpython/rev/e3763d98c46e
ezio-melotti commentedon Jan 13, 2016
Thanks for the patch, however I got several errors while trying to apply it, so I ended up backporting d560eece0857 instead.
This can be closed now.