]> granicus.if.org Git - python/commitdiff
Close #11577: Improve binhex test coverage and fix ResourceWarning
authorNick Coghlan <ncoghlan@gmail.com>
Thu, 17 Mar 2011 01:26:40 +0000 (21:26 -0400)
committerNick Coghlan <ncoghlan@gmail.com>
Thu, 17 Mar 2011 01:26:40 +0000 (21:26 -0400)
Lib/binhex.py
Lib/test/test_binhex.py
Misc/ACKS
Misc/NEWS

index 4b7997a7102ef64c1fa137cc7001acc7747cdf5b..999a675513347e2c87e9d507cb31ef3b2477dacd 100644 (file)
@@ -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)
index d6ef84a5e0edd77f8a6adf392436fa58294ee60a..a807bca6393da4df7c658d858e5f41fa03985655 100755 (executable)
@@ -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)
index 0cbc6703d27e057595e7e1f1b6a406199971d20f..f2bf3cdc479eed79e7080e858cce7f31880ccf3c 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -447,6 +447,7 @@ Tamito Kajiyama
 Peter van Kampen
 Rafe Kaplan
 Jacob Kaplan-Moss
+Arkady Koplyarov
 Lou Kates
 Hiroaki Kawai
 Sebastien Keim
index c787ece2a8febba33e0928144e07f55a021a4ff1..f2d0d7658911f5ff752c075ca5d965143dde7527 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.