diff -r bbfc65d05588 Lib/mailbox.py --- a/Lib/mailbox.py Thu Apr 07 10:48:29 2011 -0400 +++ b/Lib/mailbox.py Thu Apr 07 22:00:52 2011 +0200 @@ -76,7 +76,8 @@ if not self._factory: return self.get_message(key) else: - return self._factory(self.get_file(key)) + with self.get_file(key) as file: + return self._factory(file) def get_message(self, key): """Return a Message representation or raise a KeyError.""" diff -r bbfc65d05588 Lib/test/test_mailbox.py --- a/Lib/test/test_mailbox.py Thu Apr 07 10:48:29 2011 -0400 +++ b/Lib/test/test_mailbox.py Thu Apr 07 22:00:52 2011 +0200 @@ -540,8 +540,7 @@ def _get_lock_path(self): # Return the path of the dot lock file. May be overridden. return self._path + '.lock' - - + class TestMailboxSuperclass(TestBase): def test_notimplemented(self): @@ -1204,6 +1203,40 @@ self.assertEqual(set(self._box.get_labels()), set(['blah'])) +class FakeFileLikeObject: + + def __init__(self): + self.closed = False + + def __enter__(self): + return self + + def __exit__(self, *args): + self.closed = True + + +class FakeMailBox(mailbox.Mailbox): + + def __init__(self): + mailbox.Mailbox.__init__(self, '', lambda file: None) + self.files = [FakeFileLikeObject() for i in range(10)] + + def get_file(self, key): + return self.files[key] + + +class TestFakeMailBox(unittest.TestCase): + + def test_closing_fd(self): + box = FakeMailBox() + for i in range(10): + self.assertFalse(box.files[i].closed) + for i in range(10): + box[i] + for i in range(10): + self.assertTrue(box.files[i].closed) + + class TestMessage(TestBase): _factory = mailbox.Message # Overridden by subclasses to reuse tests @@ -2116,7 +2149,7 @@ TestBabyl, TestMessage, TestMaildirMessage, TestMboxMessage, TestMHMessage, TestBabylMessage, TestMMDFMessage, TestMessageConversion, TestProxyFile, TestPartialFile, - MaildirTestCase) + MaildirTestCase, TestFakeMailBox) support.run_unittest(*tests) support.reap_children()