diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2011-03-17 01:26:40 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2011-03-17 01:26:40 (GMT) |
commit | b3c728fd8924f271c708ea8ae6692ae5cb484a34 (patch) | |
tree | 43510de40448eaa4a21bba4d455368ebaefbb2b4 | |
parent | 4e4326829f2997624261628081110bb87c090711 (diff) | |
download | cpython-b3c728fd8924f271c708ea8ae6692ae5cb484a34.zip cpython-b3c728fd8924f271c708ea8ae6692ae5cb484a34.tar.gz cpython-b3c728fd8924f271c708ea8ae6692ae5cb484a34.tar.bz2 |
Close #11577: Improve binhex test coverage and fix ResourceWarning
-rw-r--r-- | Lib/binhex.py | 42 | ||||
-rwxr-xr-x | Lib/test/test_binhex.py | 11 | ||||
-rw-r--r-- | Misc/ACKS | 1 | ||||
-rw-r--r-- | Misc/NEWS | 4 |
4 files changed, 40 insertions, 18 deletions
diff --git a/Lib/binhex.py b/Lib/binhex.py index 4b7997a..999a675 100644 --- a/Lib/binhex.py +++ b/Lib/binhex.py @@ -52,14 +52,13 @@ class FInfo: def getfileinfo(name): finfo = FInfo() - fp = io.open(name, 'rb') - # Quick check for textfile - data = fp.read(512) - if 0 not in data: - finfo.Type = 'TEXT' - fp.seek(0, 2) - dsize = fp.tell() - fp.close() + with io.open(name, 'rb') as fp: + # Quick check for textfile + data = fp.read(512) + if 0 not in data: + finfo.Type = 'TEXT' + fp.seek(0, 2) + dsize = fp.tell() dir, file = os.path.split(name) file = file.replace(':', '-', 1) return file, finfo, dsize, 0 @@ -140,19 +139,26 @@ class _Rlecoderengine: class BinHex: def __init__(self, name_finfo_dlen_rlen, ofp): name, finfo, dlen, rlen = name_finfo_dlen_rlen + close_on_error = False if isinstance(ofp, str): ofname = ofp ofp = io.open(ofname, 'wb') - ofp.write(b'(This file must be converted with BinHex 4.0)\r\r:') - hqxer = _Hqxcoderengine(ofp) - self.ofp = _Rlecoderengine(hqxer) - self.crc = 0 - if finfo is None: - finfo = FInfo() - self.dlen = dlen - self.rlen = rlen - self._writeinfo(name, finfo) - self.state = _DID_HEADER + close_on_error = True + try: + ofp.write(b'(This file must be converted with BinHex 4.0)\r\r:') + hqxer = _Hqxcoderengine(ofp) + self.ofp = _Rlecoderengine(hqxer) + self.crc = 0 + if finfo is None: + finfo = FInfo() + self.dlen = dlen + self.rlen = rlen + self._writeinfo(name, finfo) + self.state = _DID_HEADER + except: + if close_on_error: + ofp.close() + raise def _writeinfo(self, name, finfo): nl = len(name) diff --git a/Lib/test/test_binhex.py b/Lib/test/test_binhex.py index d6ef84a..a807bca 100755 --- a/Lib/test/test_binhex.py +++ b/Lib/test/test_binhex.py @@ -15,10 +15,12 @@ class BinHexTestCase(unittest.TestCase): def setUp(self): self.fname1 = support.TESTFN + "1" self.fname2 = support.TESTFN + "2" + self.fname3 = support.TESTFN + "very_long_filename__very_long_filename__very_long_filename__very_long_filename__" def tearDown(self): support.unlink(self.fname1) support.unlink(self.fname2) + support.unlink(self.fname3) DATA = b'Jack is my hero' @@ -37,6 +39,15 @@ class BinHexTestCase(unittest.TestCase): self.assertEqual(self.DATA, finish) + def test_binhex_error_on_long_filename(self): + """ + The testcase fails if no exception is raised when a filename parameter provided to binhex.binhex() + is too long, or if the exception raised in binhex.binhex() is not an instance of binhex.Error. + """ + f3 = open(self.fname3, 'wb') + f3.close() + + self.assertRaises(binhex.Error, binhex.binhex, self.fname3, self.fname2) def test_main(): support.run_unittest(BinHexTestCase) @@ -447,6 +447,7 @@ Tamito Kajiyama Peter van Kampen Rafe Kaplan Jacob Kaplan-Moss +Arkady Koplyarov Lou Kates Hiroaki Kawai Sebastien Keim @@ -40,6 +40,8 @@ Core and Builtins Library ------- +- Issue #11577: fix ResourceWarning triggered by improved binhex test coverage + - Issue #11401: fix handling of headers with no value; this fixes a regression relative to Python2 and the result is now the same as it was in Python2. @@ -129,6 +131,8 @@ Tools/Demos Tests ----- +- Issue #11577: improve test coverage of binhex.py. Patch by Arkady Koplyarov. + - Issue #11578: added test for the timeit module. Patch Michael Henry. - Issue #11503: improve test coverage of posixpath.py. Patch by Evan Dandrea. |