1edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport os 2edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport sys 3edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport time 4edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport stat 5edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport socket 6edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport email 7edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport email.message 8edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport re 9edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport shutil 10edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport StringIO 11edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport tempfile 12edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepfrom test import test_support 13edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport unittest 14edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport mailbox 15edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepimport glob 16edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoeptry: 17edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep import fcntl 18edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepexcept ImportError: 19edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pass 20edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 21edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep# Silence Py3k warning 22edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoeprfc822 = test_support.import_module('rfc822', deprecated=True) 23edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 24edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestBase: 25edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 26edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _check_sample(self, msg): 27edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Inspect a mailbox.Message representation of the sample message 28edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(msg, email.message.Message) 29edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(msg, mailbox.Message) 30edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for key, value in _sample_headers.iteritems(): 31edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(value, msg.get_all(key)) 32edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(msg.is_multipart()) 33edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(msg.get_payload()), len(_sample_payloads)) 34edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i, payload in enumerate(_sample_payloads): 35edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep part = msg.get_payload(i) 36edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(part, email.message.Message) 37edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertNotIsInstance(part, mailbox.Message) 38edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(part.get_payload(), payload) 39edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 40edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _delete_recursively(self, target): 41edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Delete a file or delete a directory recursively 42edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if os.path.isdir(target): 43edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.rmtree(target) 44edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep elif os.path.exists(target): 45edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.unlink(target) 46edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 47edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 48edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMailbox(TestBase): 49edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 50edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = None # Overridden by subclasses to reuse tests 51edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _template = 'From: foo\n\n%s\n' 52edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 53edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def setUp(self): 54edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._path = test_support.TESTFN 55edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._delete_recursively(self._path) 56edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path) 57edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 58edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def tearDown(self): 59edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 60edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._delete_recursively(self._path) 61edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 62edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add(self): 63edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Add copies of a sample message 64edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys = [] 65edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys.append(self._box.add(self._template % 0)) 66edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 1) 67edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys.append(self._box.add(mailbox.Message(_sample_message))) 68edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 2) 69edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys.append(self._box.add(email.message_from_string(_sample_message))) 70edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 3) 71edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys.append(self._box.add(StringIO.StringIO(_sample_message))) 72edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 4) 73edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys.append(self._box.add(_sample_message)) 74edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 5) 75edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(keys[0]), self._template % 0) 76edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in (1, 2, 3, 4): 77edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(self._box[keys[i]]) 78edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 79edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_file(self): 80edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with tempfile.TemporaryFile('w+') as f: 81edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.write(_sample_message) 82edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.seek(0) 83edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(f) 84edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key).split('\n'), 85edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _sample_message.split('\n')) 86edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 87edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_StringIO(self): 88edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(StringIO.StringIO(self._template % "0")) 89edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key), self._template % "0") 90edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 91edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_remove(self): 92edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Remove messages using remove() 93edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_remove_or_delitem(self._box.remove) 94edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 95edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_delitem(self): 96edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Remove messages using __delitem__() 97edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_remove_or_delitem(self._box.__delitem__) 98edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 99edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_remove_or_delitem(self, method): 100edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # (Used by test_remove() and test_delitem().) 101edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 102edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 1) 103edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 2) 104edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep method(key0) 105edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep l = len(self._box) 106edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(l, 1) 107edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box[key0]) 108edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: method(key0)) 109edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key1), self._template % 1) 110edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2 = self._box.add(self._template % 2) 111edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 2) 112edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep method(key2) 113edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep l = len(self._box) 114edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(l, 1) 115edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box[key2]) 116edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: method(key2)) 117edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key1), self._template % 1) 118edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep method(key1) 119edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 0) 120edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box[key1]) 121edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: method(key1)) 122edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 123edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_discard(self, repetitions=10): 124edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Discard messages 125edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 126edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 1) 127edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 2) 128edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.discard(key0) 129edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 1) 130edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box[key0]) 131edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.discard(key0) 132edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 1) 133edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box[key0]) 134edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 135edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_get(self): 136edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Retrieve messages using get() 137edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 138edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._box.get(key0) 139edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg['from'], 'foo') 140edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_payload(), '0\n') 141edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self._box.get('foo'), None) 142edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(self._box.get('foo', False)) 143edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 144edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path, factory=rfc822.Message) 145edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 1) 146edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._box.get(key1) 147edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg['from'], 'foo') 148edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.fp.read(), '1' + os.linesep) 149edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.fp.close() 150edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 151edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_getitem(self): 152edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Retrieve message using __getitem__() 153edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 154edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._box[key0] 155edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg['from'], 'foo') 156edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_payload(), '0\n') 157edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box['foo']) 158edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.discard(key0) 159edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box[key0]) 160edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 161edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_get_message(self): 162edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get Message representations of messages 163edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 164edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(_sample_message) 165edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0 = self._box.get_message(key0) 166edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(msg0, mailbox.Message) 167edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg0['from'], 'foo') 168edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg0.get_payload(), '0\n') 169edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(self._box.get_message(key1)) 170edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 171edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_get_string(self): 172edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get string representations of messages 173edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 174edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(_sample_message) 175edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key0), self._template % 0) 176edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key1), _sample_message) 177edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 178edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_get_file(self): 179edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get file representations of messages 180edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 181edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(_sample_message) 182edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0 = self._box.get_file(key0) 183edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg0.read().replace(os.linesep, '\n'), 184edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 0) 185edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1 = self._box.get_file(key1) 186edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg1.read().replace(os.linesep, '\n'), 187edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _sample_message) 188edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0.close() 189edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1.close() 190edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 191edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_get_file_can_be_closed_twice(self): 192edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Issue 11700 193edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(_sample_message) 194edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f = self._box.get_file(key) 195edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.close() 196edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.close() 197edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 198edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_iterkeys(self): 199edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get keys using iterkeys() 200edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_iteration(self._box.iterkeys, do_keys=True, do_values=False) 201edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 202edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_keys(self): 203edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get keys using keys() 204edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_iteration(self._box.keys, do_keys=True, do_values=False) 205edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 206edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_itervalues(self): 207edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get values using itervalues() 208edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_iteration(self._box.itervalues, do_keys=False, 209edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep do_values=True) 210edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 211edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_iter(self): 212edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get values using __iter__() 213edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_iteration(self._box.__iter__, do_keys=False, 214edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep do_values=True) 215edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 216edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_values(self): 217edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get values using values() 218edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_iteration(self._box.values, do_keys=False, do_values=True) 219edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 220edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_iteritems(self): 221edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get keys and values using iteritems() 222edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_iteration(self._box.iteritems, do_keys=True, 223edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep do_values=True) 224edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 225edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_items(self): 226edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get keys and values using items() 227edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_iteration(self._box.items, do_keys=True, do_values=True) 228edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 229edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _check_iteration(self, method, do_keys, do_values, repetitions=10): 230edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for value in method(): 231edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.fail("Not empty") 232edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys, values = [], [] 233edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in xrange(repetitions): 234edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys.append(self._box.add(self._template % i)) 235edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep values.append(self._template % i) 236edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if do_keys and not do_values: 237edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep returned_keys = list(method()) 238edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep elif do_values and not do_keys: 239edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep returned_values = list(method()) 240edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep else: 241edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep returned_keys, returned_values = [], [] 242edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for key, value in method(): 243edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep returned_keys.append(key) 244edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep returned_values.append(value) 245edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if do_keys: 246edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(keys), len(returned_keys)) 247edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(keys), set(returned_keys)) 248edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if do_values: 249edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep count = 0 250edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for value in returned_values: 251edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(value['from'], 'foo') 252edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(int(value.get_payload()) < repetitions, 253edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (value.get_payload(), repetitions)) 254edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep count += 1 255edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(values), count) 256edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 257edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_has_key(self): 258edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Check existence of keys using has_key() 259edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_has_key_or_contains(self._box.has_key) 260edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 261edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_contains(self): 262edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Check existence of keys using __contains__() 263edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_has_key_or_contains(self._box.__contains__) 264edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 265edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_has_key_or_contains(self, method): 266edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # (Used by test_has_key() and test_contains().) 267edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(method('foo')) 268edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 269edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(method(key0)) 270edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(method('foo')) 271edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 1) 272edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(method(key1)) 273edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(method(key0)) 274edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(method('foo')) 275edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(key0) 276edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(method(key0)) 277edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(method(key1)) 278edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(method('foo')) 279edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(key1) 280edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(method(key1)) 281edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(method(key0)) 282edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(method('foo')) 283edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 284edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_len(self, repetitions=10): 285edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get message count 286edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys = [] 287edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in xrange(repetitions): 288edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), i) 289edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys.append(self._box.add(self._template % i)) 290edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), i + 1) 291edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in xrange(repetitions): 292edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), repetitions - i) 293edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(keys[i]) 294edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), repetitions - i - 1) 295edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 296edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_set_item(self): 297edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Modify messages using __setitem__() 298edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 'original 0') 299edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key0), 300edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'original 0') 301edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 'original 1') 302edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key1), 303edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'original 1') 304edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key0] = self._template % 'changed 0' 305edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key0), 306edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'changed 0') 307edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key1] = self._template % 'changed 1' 308edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key1), 309edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'changed 1') 310edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key0] = _sample_message 311edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(self._box[key0]) 312edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key1] = self._box[key0] 313edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(self._box[key1]) 314edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key0] = self._template % 'original 0' 315edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key0), 316edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'original 0') 317edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(self._box[key1]) 318edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, 319edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep lambda: self._box.__setitem__('foo', 'bar')) 320edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box['foo']) 321edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 2) 322edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 323edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_clear(self, iterations=10): 324edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Remove all messages using clear() 325edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys = [] 326edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in xrange(iterations): 327edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(self._template % i) 328edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i, key in enumerate(keys): 329edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key), self._template % i) 330edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.clear() 331edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 0) 332edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i, key in enumerate(keys): 333edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box.get_string(key)) 334edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 335edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_pop(self): 336edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get and remove a message using pop() 337edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 338edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(key0, self._box) 339edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 1) 340edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(key1, self._box) 341edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.pop(key0).get_payload(), '0\n') 342edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertNotIn(key0, self._box) 343edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(key1, self._box) 344edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2 = self._box.add(self._template % 2) 345edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(key2, self._box) 346edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.pop(key2).get_payload(), '2\n') 347edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertNotIn(key2, self._box) 348edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(key1, self._box) 349edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.pop(key1).get_payload(), '1\n') 350edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertNotIn(key1, self._box) 351edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 0) 352edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 353edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_popitem(self, iterations=10): 354edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get and remove an arbitrary (key, message) using popitem() 355edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys = [] 356edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in xrange(10): 357edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys.append(self._box.add(self._template % i)) 358edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep seen = [] 359edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in xrange(10): 360edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key, msg = self._box.popitem() 361edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(key, keys) 362edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertNotIn(key, seen) 363edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep seen.append(key) 364edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(int(msg.get_payload()), keys.index(key)) 365edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 0) 366edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for key in keys: 367edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box[key]) 368edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 369edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_update(self): 370edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Modify multiple messages using update() 371edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 'original 0') 372edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 'original 1') 373edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2 = self._box.add(self._template % 'original 2') 374edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.update({key0: self._template % 'changed 0', 375edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2: _sample_message}) 376edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 3) 377edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key0), 378edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'changed 0') 379edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key1), 380edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'original 1') 381edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(self._box[key2]) 382edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.update([(key2, self._template % 'changed 2'), 383edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (key1, self._template % 'changed 1'), 384edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (key0, self._template % 'original 0')]) 385edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 3) 386edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key0), 387edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'original 0') 388edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key1), 389edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'changed 1') 390edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key2), 391edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'changed 2') 392edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, 393edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep lambda: self._box.update({'foo': 'bar', 394edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0: self._template % "changed 0"})) 395edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 3) 396edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key0), 397edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % "changed 0") 398edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key1), 399edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % "changed 1") 400edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_string(key2), 401edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % "changed 2") 402edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 403edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_flush(self): 404edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Write changes to disk 405edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_flush_or_close(self._box.flush, True) 406edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 407edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_popitem_and_flush_twice(self): 408edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # See #15036. 409edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(self._template % 0) 410edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(self._template % 1) 411edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.flush() 412edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 413edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.popitem() 414edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.flush() 415edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.popitem() 416edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.flush() 417edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 418edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_lock_unlock(self): 419edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Lock and unlock the mailbox 420edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(os.path.exists(self._get_lock_path())) 421edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.lock() 422edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(os.path.exists(self._get_lock_path())) 423edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.unlock() 424edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(os.path.exists(self._get_lock_path())) 425edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 426edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_close(self): 427edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Close mailbox and flush changes to disk 428edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_flush_or_close(self._box.close, False) 429edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 430edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_flush_or_close(self, method, should_call_close): 431edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep contents = [self._template % i for i in xrange(3)] 432edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(contents[0]) 433edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(contents[1]) 434edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(contents[2]) 435edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep oldbox = self._box 436edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep method() 437edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if should_call_close: 438edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 439edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path) 440edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep keys = self._box.keys() 441edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(keys), 3) 442edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for key in keys: 443edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(self._box.get_string(key), contents) 444edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep oldbox.close() 445edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 446edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_dump_message(self): 447edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Write message representations to disk 448edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for input in (email.message_from_string(_sample_message), 449edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _sample_message, StringIO.StringIO(_sample_message)): 450edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep output = StringIO.StringIO() 451edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._dump_message(input, output) 452edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(output.getvalue(), 453edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _sample_message.replace('\n', os.linesep)) 454edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep output = StringIO.StringIO() 455edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(TypeError, 456edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep lambda: self._box._dump_message(None, output)) 457edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 458edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _get_lock_path(self): 459edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Return the path of the dot lock file. May be overridden. 460edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return self._path + '.lock' 461edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 462edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 463edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMailboxSuperclass(TestBase, unittest.TestCase): 464edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 465edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_notimplemented(self): 466edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Test that all Mailbox methods raise NotImplementedException. 467edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep box = mailbox.Mailbox('path') 468edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.add('')) 469edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.remove('')) 470edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.__delitem__('')) 471edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.discard('')) 472edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.__setitem__('', '')) 473edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.iterkeys()) 474edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.keys()) 475edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.itervalues().next()) 476edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.__iter__().next()) 477edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.values()) 478edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.iteritems().next()) 479edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.items()) 480edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.get('')) 481edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.__getitem__('')) 482edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.get_message('')) 483edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.get_string('')) 484edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.get_file('')) 485edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.has_key('')) 486edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.__contains__('')) 487edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.__len__()) 488edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.clear()) 489edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.pop('')) 490edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.popitem()) 491edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.update((('', ''),))) 492edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.flush()) 493edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.lock()) 494edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.unlock()) 495edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(NotImplementedError, lambda: box.close()) 496edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 497edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 498edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMaildir(TestMailbox, unittest.TestCase): 499edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 500edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = lambda self, path, factory=None: mailbox.Maildir(path, factory) 501edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 502edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def setUp(self): 503edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep TestMailbox.setUp(self) 504edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if os.name in ('nt', 'os2') or sys.platform == 'cygwin': 505edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.colon = '!' 506edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 507edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_MM(self): 508edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Add a MaildirMessage instance 509edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(self._template % 0) 510edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_subdir('cur') 511edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_info('foo') 512edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(msg) 513edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(os.path.exists(os.path.join(self._path, 'cur', '%s%sfoo' % 514edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (key, self._box.colon)))) 515edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 516edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_get_MM(self): 517edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get a MaildirMessage instance 518edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(self._template % 0) 519edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_subdir('cur') 520edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_flags('RF') 521edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(msg) 522edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_returned = self._box.get_message(key) 523edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(msg_returned, mailbox.MaildirMessage) 524edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_subdir(), 'cur') 525edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_flags(), 'FR') 526edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 527edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_set_MM(self): 528edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Set with a MaildirMessage instance 529edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0 = mailbox.MaildirMessage(self._template % 0) 530edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0.set_flags('TP') 531edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(msg0) 532edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_returned = self._box.get_message(key) 533edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_subdir(), 'new') 534edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_flags(), 'PT') 535edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1 = mailbox.MaildirMessage(self._template % 1) 536edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key] = msg1 537edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_returned = self._box.get_message(key) 538edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_subdir(), 'new') 539edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_flags(), '') 540edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_payload(), '1\n') 541edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg2 = mailbox.MaildirMessage(self._template % 2) 542edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg2.set_info('2,S') 543edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key] = msg2 544edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key] = self._template % 3 545edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_returned = self._box.get_message(key) 546edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_subdir(), 'new') 547edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_flags(), 'S') 548edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg_returned.get_payload(), '3\n') 549edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 550edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_consistent_factory(self): 551edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Add a message. 552edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(self._template % 0) 553edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_subdir('cur') 554edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_flags('RF') 555edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(msg) 556edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 557edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Create new mailbox with 558edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep class FakeMessage(mailbox.MaildirMessage): 559edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pass 560edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep box = mailbox.Maildir(self._path, factory=FakeMessage) 561edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep box.colon = self._box.colon 562edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg2 = box.get_message(key) 563edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(msg2, FakeMessage) 564edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 565edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize_new(self): 566edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize a non-existent mailbox 567edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.tearDown() 568edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = mailbox.Maildir(self._path) 569edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_basics(factory=rfc822.Message) 570edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._delete_recursively(self._path) 571edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path, factory=None) 572edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_basics() 573edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 574edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize_existing(self): 575edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize an existing mailbox 576edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.tearDown() 577edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for subdir in '', 'tmp', 'new', 'cur': 578edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.mkdir(os.path.normpath(os.path.join(self._path, subdir))) 579edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = mailbox.Maildir(self._path) 580edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_basics(factory=rfc822.Message) 581edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = mailbox.Maildir(self._path, factory=None) 582edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_basics() 583edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 584edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _check_basics(self, factory=None): 585edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # (Used by test_open_new() and test_open_existing().) 586edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._path, os.path.abspath(self._path)) 587edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._factory, factory) 588edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for subdir in '', 'tmp', 'new', 'cur': 589edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep path = os.path.join(self._path, subdir) 590edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mode = os.stat(path)[stat.ST_MODE] 591edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(stat.S_ISDIR(mode), "Not a directory: '%s'" % path) 592edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 593edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_list_folders(self): 594edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # List folders 595edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('one') 596edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('two') 597edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('three') 598edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 3) 599edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), 600edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep set(('one', 'two', 'three'))) 601edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 602edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_get_folder(self): 603edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Open folders 604edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('foo.bar') 605edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep folder0 = self._box.get_folder('foo.bar') 606edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep folder0.add(self._template % 'bar') 607edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(os.path.isdir(os.path.join(self._path, '.foo.bar'))) 608edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep folder1 = self._box.get_folder('foo.bar') 609edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(folder1.get_string(folder1.keys()[0]), 610edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'bar') 611edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 612edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_and_remove_folders(self): 613edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Delete folders 614edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('one') 615edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('two') 616edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 2) 617edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), set(('one', 'two'))) 618edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove_folder('one') 619edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 1) 620edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), set(('two',))) 621edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('three') 622edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 2) 623edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), set(('two', 'three'))) 624edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove_folder('three') 625edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 1) 626edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), set(('two',))) 627edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove_folder('two') 628edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 0) 629edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.list_folders(), []) 630edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 631edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_clean(self): 632edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Remove old files from 'tmp' 633edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep foo_path = os.path.join(self._path, 'tmp', 'foo') 634edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep bar_path = os.path.join(self._path, 'tmp', 'bar') 635edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with open(foo_path, 'w') as f: 636edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.write("@") 637edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with open(bar_path, 'w') as f: 638edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.write("@") 639edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.clean() 640edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(os.path.exists(foo_path)) 641edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(os.path.exists(bar_path)) 642edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep foo_stat = os.stat(foo_path) 643edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.utime(foo_path, (time.time() - 129600 - 2, 644edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep foo_stat.st_mtime)) 645edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.clean() 646edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(os.path.exists(foo_path)) 647edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(os.path.exists(bar_path)) 648edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 649edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_create_tmp(self, repetitions=10): 650edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Create files in tmp directory 651edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep hostname = socket.gethostname() 652edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if '/' in hostname: 653edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep hostname = hostname.replace('/', r'\057') 654edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if ':' in hostname: 655edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep hostname = hostname.replace(':', r'\072') 656edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pid = os.getpid() 657edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pattern = re.compile(r"(?P<time>\d+)\.M(?P<M>\d{1,6})P(?P<P>\d+)" 658edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep r"Q(?P<Q>\d+)\.(?P<host>[^:/]+)") 659edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep previous_groups = None 660edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for x in xrange(repetitions): 661edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep tmp_file = self._box._create_tmp() 662edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep head, tail = os.path.split(tmp_file.name) 663edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(head, os.path.abspath(os.path.join(self._path, 664edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "tmp")), 665edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "File in wrong location: '%s'" % head) 666edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep match = pattern.match(tail) 667edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(match is not None, "Invalid file name: '%s'" % tail) 668edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep groups = match.groups() 669edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if previous_groups is not None: 670edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertGreaterEqual(int(groups[0]), int(previous_groups[0]), 671edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Non-monotonic seconds: '%s' before '%s'" % 672edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (previous_groups[0], groups[0])) 673edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if int(groups[0]) == int(previous_groups[0]): 674edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertGreaterEqual(int(groups[1]), int(previous_groups[1]), 675edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Non-monotonic milliseconds: '%s' before '%s'" % 676edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (previous_groups[1], groups[1])) 677edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(int(groups[2]) == pid, 678edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Process ID mismatch: '%s' should be '%s'" % 679edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (groups[2], pid)) 680edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(int(groups[3]) == int(previous_groups[3]) + 1, 681edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Non-sequential counter: '%s' before '%s'" % 682edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (previous_groups[3], groups[3])) 683edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(groups[4] == hostname, 684edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Host name mismatch: '%s' should be '%s'" % 685edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (groups[4], hostname)) 686edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep previous_groups = groups 687edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep tmp_file.write(_sample_message) 688edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep tmp_file.seek(0) 689edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(tmp_file.read() == _sample_message) 690edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep tmp_file.close() 691edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep file_count = len(os.listdir(os.path.join(self._path, "tmp"))) 692edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(file_count == repetitions, 693edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Wrong file count: '%s' should be '%s'" % 694edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (file_count, repetitions)) 695edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 696edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_refresh(self): 697edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Update the table of contents 698edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._toc, {}) 699edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 700edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 1) 701edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._toc, {}) 702edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._refresh() 703edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._toc, {key0: os.path.join('new', key0), 704edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1: os.path.join('new', key1)}) 705edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2 = self._box.add(self._template % 2) 706edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._toc, {key0: os.path.join('new', key0), 707edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1: os.path.join('new', key1)}) 708edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._refresh() 709edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._toc, {key0: os.path.join('new', key0), 710edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1: os.path.join('new', key1), 711edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2: os.path.join('new', key2)}) 712edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 713edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_refresh_after_safety_period(self): 714edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Issue #13254: Call _refresh after the "file system safety 715edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # period" of 2 seconds has passed; _toc should still be 716edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # updated because this is the first call to _refresh. 717edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 718edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(self._template % 1) 719edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 720edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path) 721edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._toc, {}) 722edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 723edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Emulate sleeping. Instead of sleeping for 2 seconds, use the 724edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # skew factor to make _refresh think that the filesystem 725edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # safety period has passed and re-reading the _toc is only 726edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # required if mtimes differ. 727edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._skewfactor = -3 728edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 729edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._refresh() 730edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(sorted(self._box._toc.keys()), sorted([key0, key1])) 731edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 732edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_lookup(self): 733edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Look up message subpaths in the TOC 734edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box._lookup('foo')) 735edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(self._template % 0) 736edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._lookup(key0), os.path.join('new', key0)) 737edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.remove(os.path.join(self._path, 'new', key0)) 738edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._toc, {key0: os.path.join('new', key0)}) 739edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Be sure that the TOC is read back from disk (see issue #6896 740edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # about bad mtime behaviour on some systems). 741edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.flush() 742edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(KeyError, lambda: self._box._lookup(key0)) 743edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box._toc, {}) 744edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 745edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_lock_unlock(self): 746edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Lock and unlock the mailbox. For Maildir, this does nothing. 747edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.lock() 748edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.unlock() 749edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 750edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_folder (self): 751edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Test for bug #1569790: verify that folders returned by .get_folder() 752edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # use the same factory function. 753edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def dummy_factory (s): 754edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return None 755edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep box = self._factory(self._path, factory=dummy_factory) 756edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep folder = box.add_folder('folder1') 757edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(folder._factory, dummy_factory) 758edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 759edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep folder1_alias = box.get_folder('folder1') 760edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(folder1_alias._factory, dummy_factory) 761edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 762edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_directory_in_folder (self): 763edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Test that mailboxes still work if there's a stray extra directory 764edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # in a folder. 765edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in range(10): 766edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(mailbox.Message(_sample_message)) 767edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 768edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Create a stray directory 769edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.mkdir(os.path.join(self._path, 'cur', 'stray-dir')) 770edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 771edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Check that looping still works with the directory present. 772edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for msg in self._box: 773edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pass 774edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 775edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_file_permissions(self): 776edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Verify that message files are created without execute permissions 777edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if not hasattr(os, "stat") or not hasattr(os, "umask"): 778edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return 779edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(self._template % 0) 780edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep orig_umask = os.umask(0) 781edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep try: 782edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(msg) 783edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep finally: 784edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.umask(orig_umask) 785edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep path = os.path.join(self._path, self._box._lookup(key)) 786edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mode = os.stat(path).st_mode 787edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mode & 0111, 0) 788edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 789edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_folder_file_perms(self): 790edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # From bug #3228, we want to verify that the file created inside a Maildir 791edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # subfolder isn't marked as executable. 792edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if not hasattr(os, "stat") or not hasattr(os, "umask"): 793edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return 794edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 795edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep orig_umask = os.umask(0) 796edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep try: 797edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep subfolder = self._box.add_folder('subfolder') 798edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep finally: 799edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.umask(orig_umask) 800edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 801edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep path = os.path.join(subfolder._path, 'maildirfolder') 802edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep st = os.stat(path) 803edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep perms = st.st_mode 804edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse((perms & 0111)) # Execute bits should all be off. 805edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 806edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_reread(self): 807edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Do an initial unconditional refresh 808edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._refresh() 809edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 810edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Put the last modified times more than two seconds into the past 811edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # (because mtime may have only a two second granularity). 812edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for subdir in ('cur', 'new'): 813edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.utime(os.path.join(self._box._path, subdir), 814edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (time.time()-5,)*2) 815edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 816edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Because mtime has a two second granularity in worst case (FAT), a 817edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # refresh is done unconditionally if called for within 818edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # two-second-plus-a-bit of the last one, just in case the mbox has 819edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # changed; so now we have to wait for that interval to expire. 820edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # 821edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Because this is a test, emulate sleeping. Instead of 822edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # sleeping for 2 seconds, use the skew factor to make _refresh 823edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # think that 2 seconds have passed and re-reading the _toc is 824edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # only required if mtimes differ. 825edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._skewfactor = -3 826edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 827edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Re-reading causes the ._toc attribute to be assigned a new dictionary 828edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # object, so we'll check that the ._toc attribute isn't a different 829edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # object. 830edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep orig_toc = self._box._toc 831edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def refreshed(): 832edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return self._box._toc is not orig_toc 833edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 834edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._refresh() 835edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(refreshed()) 836edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 837edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Now, write something into cur and remove it. This changes 838edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # the mtime and should cause a re-read. Note that "sleep 839edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # emulation" is still in effect, as skewfactor is -3. 840edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep filename = os.path.join(self._path, 'cur', 'stray-file') 841edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f = open(filename, 'w') 842edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.close() 843edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.unlink(filename) 844edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._refresh() 845edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(refreshed()) 846edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 847edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 848edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass _TestSingleFile(TestMailbox): 849edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep '''Common tests for single-file mailboxes''' 850edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 851edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_doesnt_rewrite(self): 852edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # When only adding messages, flush() should not rewrite the 853edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # mailbox file. See issue #9559. 854edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 855edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Inode number changes if the contents are written to another 856edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # file which is then renamed over the original file. So we 857edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # must check that the inode number doesn't change. 858edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep inode_before = os.stat(self._path).st_ino 859edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 860edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(self._template % 0) 861edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.flush() 862edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 863edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep inode_after = os.stat(self._path).st_ino 864edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(inode_before, inode_after) 865edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 866edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Make sure the message was really added 867edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 868edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path) 869edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 1) 870edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 871edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_permissions_after_flush(self): 872edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # See issue #5346 873edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 874edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Make the mailbox world writable. It's unlikely that the new 875edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # mailbox file would have these permissions after flush(), 876edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # because umask usually prevents it. 877edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mode = os.stat(self._path).st_mode | 0o666 878edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.chmod(self._path, mode) 879edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 880edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(self._template % 0) 881edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep i = self._box.add(self._template % 1) 882edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Need to remove one message to make flush() create a new file 883edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(i) 884edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.flush() 885edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 886edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(os.stat(self._path).st_mode, mode) 887edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 888edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 889edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass _TestMboxMMDF(_TestSingleFile): 890edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 891edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def tearDown(self): 892edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 893edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._delete_recursively(self._path) 894edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for lock_remnant in glob.glob(self._path + '.*'): 895edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.unlink(lock_remnant) 896edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 897edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_from_string(self): 898edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Add a string starting with 'From ' to the mailbox 899edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add('From foo@bar blah\nFrom: foo\n\n0\n') 900edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box[key].get_from(), 'foo@bar blah') 901edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box[key].get_payload(), '0\n') 902edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 903edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_mbox_or_mmdf_message(self): 904edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Add an mboxMessage or MMDFMessage 905edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 906edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = class_('From foo@bar blah\nFrom: foo\n\n0\n') 907edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key = self._box.add(msg) 908edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 909edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_open_close_open(self): 910edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Open and inspect previously-created mailbox 911edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep values = [self._template % i for i in xrange(3)] 912edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for value in values: 913edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(value) 914edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 915edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mtime = os.path.getmtime(self._path) 916edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path) 917edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box), 3) 918edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for key in self._box.iterkeys(): 919edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIn(self._box.get_string(key), values) 920edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 921edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mtime, os.path.getmtime(self._path)) 922edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 923edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_and_close(self): 924edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Verifying that closing a mailbox doesn't change added items 925edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(_sample_message) 926edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for i in xrange(3): 927edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(self._template % i) 928edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add(_sample_message) 929edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._file.flush() 930edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box._file.seek(0) 931edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep contents = self._box._file.read() 932edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 933edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with open(self._path, 'rb') as f: 934edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(contents, f.read()) 935edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path) 936edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 937edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep @unittest.skipUnless(hasattr(os, 'fork'), "Test needs fork().") 938edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep @unittest.skipUnless(hasattr(socket, 'socketpair'), "Test needs socketpair().") 939edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_lock_conflict(self): 940edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Fork off a child process that will lock the mailbox temporarily, 941edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # unlock it and exit. 942edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep c, p = socket.socketpair() 943edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.addCleanup(c.close) 944edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.addCleanup(p.close) 945edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 946edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pid = os.fork() 947edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if pid == 0: 948edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # child 949edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep try: 950edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # lock the mailbox, and signal the parent it can proceed 951edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.lock() 952edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep c.send(b'c') 953edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 954edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # wait until the parent is done, and unlock the mailbox 955edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep c.recv(1) 956edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.unlock() 957edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep finally: 958edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os._exit(0) 959edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 960edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # In the parent, wait until the child signals it locked the mailbox. 961edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep p.recv(1) 962edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep try: 963edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(mailbox.ExternalClashError, 964edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.lock) 965edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep finally: 966edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Signal the child it can now release the lock and exit. 967edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep p.send(b'p') 968edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Wait for child to exit. Locking should now succeed. 969edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep exited_pid, status = os.waitpid(pid, 0) 970edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 971edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.lock() 972edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.unlock() 973edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 974edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_relock(self): 975edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Test case for bug #1575506: the mailbox class was locking the 976edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # wrong file object in its flush() method. 977edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = "Subject: sub\n\nbody\n" 978edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(msg) 979edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.flush() 980edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 981edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 982edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path) 983edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.lock() 984edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2 = self._box.add(msg) 985edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.flush() 986edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(self._box._locked) 987edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 988edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 989edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 990edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMbox(_TestMboxMMDF, unittest.TestCase): 991edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 992edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = lambda self, path, factory=None: mailbox.mbox(path, factory) 993edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 994edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_file_perms(self): 995edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # From bug #3228, we want to verify that the mailbox file isn't executable, 996edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # even if the umask is set to something that would leave executable bits set. 997edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # We only run this test on platforms that support umask. 998edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if hasattr(os, 'umask') and hasattr(os, 'stat'): 999edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep try: 1000edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep old_umask = os.umask(0077) 1001edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 1002edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.unlink(self._path) 1003edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = mailbox.mbox(self._path, create=True) 1004edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add('') 1005edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 1006edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep finally: 1007edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.umask(old_umask) 1008edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1009edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep st = os.stat(self._path) 1010edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep perms = st.st_mode 1011edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse((perms & 0111)) # Execute bits should all be off. 1012edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1013edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_terminating_newline(self): 1014edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep message = email.message.Message() 1015edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep message['From'] = 'john@example.com' 1016edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep message.set_payload('No newline at the end') 1017edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep i = self._box.add(message) 1018edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1019edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # A newline should have been appended to the payload 1020edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep message = self._box.get(i) 1021edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(message.get_payload(), 'No newline at the end\n') 1022edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1023edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_message_separator(self): 1024edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Check there's always a single blank line after each message 1025edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add('From: foo\n\n0') # No newline at the end 1026edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with open(self._path) as f: 1027edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep data = f.read() 1028edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(data[-3:], '0\n\n') 1029edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1030edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add('From: foo\n\n0\n') # Newline at the end 1031edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with open(self._path) as f: 1032edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep data = f.read() 1033edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(data[-3:], '0\n\n') 1034edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1035edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1036edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMMDF(_TestMboxMMDF, unittest.TestCase): 1037edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1038edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = lambda self, path, factory=None: mailbox.MMDF(path, factory) 1039edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1040edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1041edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMH(TestMailbox, unittest.TestCase): 1042edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1043edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = lambda self, path, factory=None: mailbox.MH(path, factory) 1044edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1045edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_list_folders(self): 1046edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # List folders 1047edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('one') 1048edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('two') 1049edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('three') 1050edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 3) 1051edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), 1052edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep set(('one', 'two', 'three'))) 1053edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1054edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_get_folder(self): 1055edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Open folders 1056edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def dummy_factory (s): 1057edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return None 1058edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box = self._factory(self._path, dummy_factory) 1059edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1060edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep new_folder = self._box.add_folder('foo.bar') 1061edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep folder0 = self._box.get_folder('foo.bar') 1062edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep folder0.add(self._template % 'bar') 1063edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(os.path.isdir(os.path.join(self._path, 'foo.bar'))) 1064edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep folder1 = self._box.get_folder('foo.bar') 1065edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(folder1.get_string(folder1.keys()[0]), 1066edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._template % 'bar') 1067edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1068edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Test for bug #1569790: verify that folders returned by .get_folder() 1069edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # use the same factory function. 1070edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(new_folder._factory, self._box._factory) 1071edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(folder0._factory, self._box._factory) 1072edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1073edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_add_and_remove_folders(self): 1074edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Delete folders 1075edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('one') 1076edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('two') 1077edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 2) 1078edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), set(('one', 'two'))) 1079edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove_folder('one') 1080edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 1) 1081edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), set(('two', ))) 1082edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.add_folder('three') 1083edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 2) 1084edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), set(('two', 'three'))) 1085edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove_folder('three') 1086edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 1) 1087edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.list_folders()), set(('two', ))) 1088edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove_folder('two') 1089edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(self._box.list_folders()), 0) 1090edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.list_folders(), []) 1091edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1092edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_sequences(self): 1093edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get and set sequences 1094edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), {}) 1095edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0 = mailbox.MHMessage(self._template % 0) 1096edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0.add_sequence('foo') 1097edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(msg0) 1098edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), {'foo':[key0]}) 1099edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1 = mailbox.MHMessage(self._template % 1) 1100edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1.set_sequences(['bar', 'replied', 'foo']) 1101edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(msg1) 1102edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), 1103edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {'foo':[key0, key1], 'bar':[key1], 'replied':[key1]}) 1104edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0.set_sequences(['flagged']) 1105edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key0] = msg0 1106edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), 1107edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {'foo':[key1], 'bar':[key1], 'replied':[key1], 1108edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'flagged':[key0]}) 1109edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(key1) 1110edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), {'flagged':[key0]}) 1111edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1112edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_issue2625(self): 1113edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0 = mailbox.MHMessage(self._template % 0) 1114edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0.add_sequence('foo') 1115edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(msg0) 1116edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep refmsg0 = self._box.get_message(key0) 1117edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1118edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_issue7627(self): 1119edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0 = mailbox.MHMessage(self._template % 0) 1120edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(msg0) 1121edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.lock() 1122edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(key0) 1123edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.unlock() 1124edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1125edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_pack(self): 1126edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Pack the contents of the mailbox 1127edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0 = mailbox.MHMessage(self._template % 0) 1128edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1 = mailbox.MHMessage(self._template % 1) 1129edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg2 = mailbox.MHMessage(self._template % 2) 1130edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg3 = mailbox.MHMessage(self._template % 3) 1131edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0.set_sequences(['foo', 'unseen']) 1132edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1.set_sequences(['foo']) 1133edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg2.set_sequences(['foo', 'flagged']) 1134edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg3.set_sequences(['foo', 'bar', 'replied']) 1135edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(msg0) 1136edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(msg1) 1137edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2 = self._box.add(msg2) 1138edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key3 = self._box.add(msg3) 1139edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), 1140edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {'foo':[key0,key1,key2,key3], 'unseen':[key0], 1141edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'flagged':[key2], 'bar':[key3], 'replied':[key3]}) 1142edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(key2) 1143edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), 1144edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {'foo':[key0,key1,key3], 'unseen':[key0], 'bar':[key3], 1145edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'replied':[key3]}) 1146edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.pack() 1147edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.keys(), [1, 2, 3]) 1148edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = key0 1149edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = key0 + 1 1150edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2 = key1 + 1 1151edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), 1152edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {'foo':[1, 2, 3], 'unseen':[1], 'bar':[3], 'replied':[3]}) 1153edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1154edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Test case for packing while holding the mailbox locked. 1155edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(msg1) 1156edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(msg1) 1157edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key2 = self._box.add(msg1) 1158edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key3 = self._box.add(msg1) 1159edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1160edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(key0) 1161edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(key2) 1162edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.lock() 1163edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.pack() 1164edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.unlock() 1165edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_sequences(), 1166edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep {'foo':[1, 2, 3, 4, 5], 1167edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'unseen':[1], 'bar':[3], 'replied':[3]}) 1168edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1169edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _get_lock_path(self): 1170edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return os.path.join(self._path, '.mh_sequences.lock') 1171edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1172edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1173edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestBabyl(_TestSingleFile, unittest.TestCase): 1174edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1175edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = lambda self, path, factory=None: mailbox.Babyl(path, factory) 1176edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1177edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def tearDown(self): 1178edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.close() 1179edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._delete_recursively(self._path) 1180edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for lock_remnant in glob.glob(self._path + '.*'): 1181edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.unlink(lock_remnant) 1182edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1183edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_labels(self): 1184edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get labels from the mailbox 1185edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_labels(), []) 1186edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0 = mailbox.BabylMessage(self._template % 0) 1187edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0.add_label('foo') 1188edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key0 = self._box.add(msg0) 1189edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._box.get_labels(), ['foo']) 1190edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1 = mailbox.BabylMessage(self._template % 1) 1191edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg1.set_labels(['bar', 'answered', 'foo']) 1192edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep key1 = self._box.add(msg1) 1193edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.get_labels()), set(['foo', 'bar'])) 1194edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg0.set_labels(['blah', 'filed']) 1195edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box[key0] = msg0 1196edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.get_labels()), 1197edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep set(['foo', 'bar', 'blah'])) 1198edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._box.remove(key1) 1199edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(set(self._box.get_labels()), set(['blah'])) 1200edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1201edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1202edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMessage(TestBase, unittest.TestCase): 1203edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1204edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = mailbox.Message # Overridden by subclasses to reuse tests 1205edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1206edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def setUp(self): 1207edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._path = test_support.TESTFN 1208edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1209edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def tearDown(self): 1210edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._delete_recursively(self._path) 1211edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1212edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize_with_eMM(self): 1213edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize based on email.message.Message instance 1214edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eMM = email.message_from_string(_sample_message) 1215edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._factory(eMM) 1216edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._post_initialize_hook(msg) 1217edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1218edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1219edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize_with_string(self): 1220edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize based on string 1221edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._factory(_sample_message) 1222edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._post_initialize_hook(msg) 1223edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1224edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1225edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize_with_file(self): 1226edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize based on contents of file 1227edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with open(self._path, 'w+') as f: 1228edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.write(_sample_message) 1229edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep f.seek(0) 1230edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._factory(f) 1231edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._post_initialize_hook(msg) 1232edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1233edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1234edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize_with_nothing(self): 1235edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize without arguments 1236edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._factory() 1237edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._post_initialize_hook(msg) 1238edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(msg, email.message.Message) 1239edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(msg, mailbox.Message) 1240edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsInstance(msg, self._factory) 1241edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.keys(), []) 1242edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertFalse(msg.is_multipart()) 1243edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_payload(), None) 1244edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1245edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize_incorrectly(self): 1246edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize with invalid argument 1247edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(TypeError, lambda: self._factory(object())) 1248edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1249edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_become_message(self): 1250edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Take on the state of another message 1251edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep eMM = email.message_from_string(_sample_message) 1252edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._factory() 1253edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg._become_message(eMM) 1254edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1255edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1256edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_explain_to(self): 1257edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Copy self's format-specific data to other message formats. 1258edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # This test is superficial; better ones are in TestMessageConversion. 1259edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self._factory() 1260edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.Message, mailbox.MaildirMessage, 1261edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mailbox.mboxMessage, mailbox.MHMessage, 1262edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mailbox.BabylMessage, mailbox.MMDFMessage): 1263edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep other_msg = class_() 1264edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg._explain_to(other_msg) 1265edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep other_msg = email.message.Message() 1266edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(TypeError, lambda: msg._explain_to(other_msg)) 1267edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1268edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _post_initialize_hook(self, msg): 1269edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Overridden by subclasses to check extra things after initialization 1270edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pass 1271edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1272edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1273edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMaildirMessage(TestMessage, unittest.TestCase): 1274edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1275edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = mailbox.MaildirMessage 1276edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1277edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _post_initialize_hook(self, msg): 1278edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg._subdir, 'new') 1279edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg._info,'') 1280edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1281edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_subdir(self): 1282edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Use get_subdir() and set_subdir() 1283edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(_sample_message) 1284edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'new') 1285edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_subdir('cur') 1286edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'cur') 1287edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_subdir('new') 1288edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'new') 1289edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(ValueError, lambda: msg.set_subdir('tmp')) 1290edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'new') 1291edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_subdir('new') 1292edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'new') 1293edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1294edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1295edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_flags(self): 1296edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Use get_flags(), set_flags(), add_flag(), remove_flag() 1297edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(_sample_message) 1298edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), '') 1299edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'new') 1300edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_flags('F') 1301edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'new') 1302edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'F') 1303edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_flags('SDTP') 1304edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'DPST') 1305edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_flag('FT') 1306edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'DFPST') 1307edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.remove_flag('TDRP') 1308edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'FS') 1309edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'new') 1310edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1311edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1312edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_date(self): 1313edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Use get_date() and set_date() 1314edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(_sample_message) 1315edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep diff = msg.get_date() - time.time() 1316edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(abs(diff) < 60, diff) 1317edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_date(0.0) 1318edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_date(), 0.0) 1319edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1320edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_info(self): 1321edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Use get_info() and set_info() 1322edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(_sample_message) 1323edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_info(), '') 1324edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_info('1,foo=bar') 1325edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_info(), '1,foo=bar') 1326edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(TypeError, lambda: msg.set_info(None)) 1327edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1328edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1329edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_info_and_flags(self): 1330edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Test interaction of info and flag methods 1331edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(_sample_message) 1332edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_info(), '') 1333edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_flags('SF') 1334edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'FS') 1335edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_info(), '2,FS') 1336edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_info('1,') 1337edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), '') 1338edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_info(), '1,') 1339edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.remove_flag('RPT') 1340edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), '') 1341edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_info(), '1,') 1342edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_flag('D') 1343edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'D') 1344edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_info(), '2,D') 1345edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1346edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1347edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1348edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass _TestMboxMMDFMessage: 1349edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1350edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = mailbox._mboxMMDFMessage 1351edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1352edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _post_initialize_hook(self, msg): 1353edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_from(msg) 1354edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1355edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize_with_unixfrom(self): 1356edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize with a message that already has a _unixfrom attribute 1357edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.Message(_sample_message) 1358edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_unixfrom('From foo@bar blah') 1359edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.mboxMessage(msg) 1360edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_from(), 'foo@bar blah') 1361edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1362edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_from(self): 1363edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get and set "From " line 1364edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.mboxMessage(_sample_message) 1365edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_from(msg) 1366edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_from('foo bar') 1367edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_from(), 'foo bar') 1368edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_from('foo@bar', True) 1369edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_from(msg, 'foo@bar') 1370edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_from('blah@temp', time.localtime()) 1371edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_from(msg, 'blah@temp') 1372edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1373edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_flags(self): 1374edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Use get_flags(), set_flags(), add_flag(), remove_flag() 1375edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.mboxMessage(_sample_message) 1376edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), '') 1377edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_flags('F') 1378edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'F') 1379edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_flags('XODR') 1380edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'RODX') 1381edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_flag('FA') 1382edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'RODFAX') 1383edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.remove_flag('FDXA') 1384edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'RO') 1385edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1386edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1387edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _check_from(self, msg, sender=None): 1388edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Check contents of "From " line 1389edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if sender is None: 1390edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep sender = "MAILER-DAEMON" 1391edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertTrue(re.match(sender + r" \w{3} \w{3} [\d ]\d [\d ]\d:\d{2}:" 1392edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep r"\d{2} \d{4}", msg.get_from())) 1393edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1394edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1395edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMboxMessage(_TestMboxMMDFMessage, TestMessage): 1396edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1397edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = mailbox.mboxMessage 1398edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1399edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1400edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMHMessage(TestMessage, unittest.TestCase): 1401edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1402edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = mailbox.MHMessage 1403edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1404edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _post_initialize_hook(self, msg): 1405edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg._sequences, []) 1406edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1407edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_sequences(self): 1408edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get, set, join, and leave sequences 1409edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MHMessage(_sample_message) 1410edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), []) 1411edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_sequences(['foobar']) 1412edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), ['foobar']) 1413edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_sequences([]) 1414edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), []) 1415edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('unseen') 1416edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), ['unseen']) 1417edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('flagged') 1418edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), ['unseen', 'flagged']) 1419edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('flagged') 1420edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), ['unseen', 'flagged']) 1421edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.remove_sequence('unseen') 1422edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), ['flagged']) 1423edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('foobar') 1424edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), ['flagged', 'foobar']) 1425edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.remove_sequence('replied') 1426edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), ['flagged', 'foobar']) 1427edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_sequences(['foobar', 'replied']) 1428edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_sequences(), ['foobar', 'replied']) 1429edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1430edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1431edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestBabylMessage(TestMessage, unittest.TestCase): 1432edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1433edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = mailbox.BabylMessage 1434edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1435edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _post_initialize_hook(self, msg): 1436edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg._labels, []) 1437edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1438edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_labels(self): 1439edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get, set, join, and leave labels 1440edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1441edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), []) 1442edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_labels(['foobar']) 1443edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), ['foobar']) 1444edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_labels([]) 1445edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), []) 1446edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label('filed') 1447edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), ['filed']) 1448edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label('resent') 1449edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), ['filed', 'resent']) 1450edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label('resent') 1451edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), ['filed', 'resent']) 1452edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.remove_label('filed') 1453edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), ['resent']) 1454edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label('foobar') 1455edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), ['resent', 'foobar']) 1456edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.remove_label('unseen') 1457edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), ['resent', 'foobar']) 1458edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_labels(['foobar', 'answered']) 1459edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_labels(), ['foobar', 'answered']) 1460edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1461edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_visible(self): 1462edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Get, set, and update visible headers 1463edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1464edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep visible = msg.get_visible() 1465edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(visible.keys(), []) 1466edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(visible.get_payload(), None) 1467edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep visible['User-Agent'] = 'FooBar 1.0' 1468edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep visible['X-Whatever'] = 'Blah' 1469edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_visible().keys(), []) 1470edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_visible(visible) 1471edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep visible = msg.get_visible() 1472edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(visible.keys(), ['User-Agent', 'X-Whatever']) 1473edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(visible['User-Agent'], 'FooBar 1.0') 1474edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(visible['X-Whatever'], 'Blah') 1475edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(visible.get_payload(), None) 1476edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.update_visible() 1477edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(visible.keys(), ['User-Agent', 'X-Whatever']) 1478edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(visible.get_payload(), None) 1479edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep visible = msg.get_visible() 1480edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(visible.keys(), ['User-Agent', 'Date', 'From', 'To', 1481edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'Subject']) 1482edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for header in ('User-Agent', 'Date', 'From', 'To', 'Subject'): 1483edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(visible[header], msg[header]) 1484edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1485edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1486edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMMDFMessage(_TestMboxMMDFMessage, TestMessage): 1487edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1488edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep _factory = mailbox.MMDFMessage 1489edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1490edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1491edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestMessageConversion(TestBase, unittest.TestCase): 1492edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1493edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_plain_to_x(self): 1494edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert Message to all formats 1495edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.Message, mailbox.MaildirMessage, 1496edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mailbox.mboxMessage, mailbox.MHMessage, 1497edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mailbox.BabylMessage, mailbox.MMDFMessage): 1498edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_plain = mailbox.Message(_sample_message) 1499edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = class_(msg_plain) 1500edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1501edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1502edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_x_to_plain(self): 1503edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert all formats to Message 1504edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.Message, mailbox.MaildirMessage, 1505edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mailbox.mboxMessage, mailbox.MHMessage, 1506edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mailbox.BabylMessage, mailbox.MMDFMessage): 1507edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = class_(_sample_message) 1508edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_plain = mailbox.Message(msg) 1509edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg_plain) 1510edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1511edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_x_to_invalid(self): 1512edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert all formats to an invalid format 1513edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.Message, mailbox.MaildirMessage, 1514edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mailbox.mboxMessage, mailbox.MHMessage, 1515edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep mailbox.BabylMessage, mailbox.MMDFMessage): 1516edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertRaises(TypeError, lambda: class_(False)) 1517edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1518edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_maildir_to_maildir(self): 1519edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert MaildirMessage to MaildirMessage 1520edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir = mailbox.MaildirMessage(_sample_message) 1521edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir.set_flags('DFPRST') 1522edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir.set_subdir('cur') 1523edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep date = msg_maildir.get_date() 1524edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(msg_maildir) 1525edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._check_sample(msg) 1526edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), 'DFPRST') 1527edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_subdir(), 'cur') 1528edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_date(), date) 1529edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1530edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_maildir_to_mboxmmdf(self): 1531edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert MaildirMessage to mboxmessage and MMDFMessage 1532edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('D', ''), ('F', 'F'), ('P', ''), ('R', 'A'), ('S', 'R'), 1533edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('T', 'D'), ('DFPRST', 'RDFA')) 1534edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1535edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir = mailbox.MaildirMessage(_sample_message) 1536edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir.set_date(0.0) 1537edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1538edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir.set_flags(setting) 1539edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = class_(msg_maildir) 1540edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), result) 1541edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_from(), 'MAILER-DAEMON %s' % 1542edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep time.asctime(time.gmtime(0.0))) 1543edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir.set_subdir('cur') 1544edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(class_(msg_maildir).get_flags(), 'RODFA') 1545edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1546edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_maildir_to_mh(self): 1547edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert MaildirMessage to MHMessage 1548edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir = mailbox.MaildirMessage(_sample_message) 1549edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('D', ['unseen']), ('F', ['unseen', 'flagged']), 1550edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('P', ['unseen']), ('R', ['unseen', 'replied']), ('S', []), 1551edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('T', ['unseen']), ('DFPRST', ['replied', 'flagged'])) 1552edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1553edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir.set_flags(setting) 1554edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MHMessage(msg_maildir).get_sequences(), 1555edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep result) 1556edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1557edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_maildir_to_babyl(self): 1558edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert MaildirMessage to Babyl 1559edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir = mailbox.MaildirMessage(_sample_message) 1560edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('D', ['unseen']), ('F', ['unseen']), 1561edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('P', ['unseen', 'forwarded']), ('R', ['unseen', 'answered']), 1562edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('S', []), ('T', ['unseen', 'deleted']), 1563edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('DFPRST', ['deleted', 'answered', 'forwarded'])) 1564edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1565edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_maildir.set_flags(setting) 1566edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.BabylMessage(msg_maildir).get_labels(), 1567edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep result) 1568edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1569edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_mboxmmdf_to_maildir(self): 1570edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert mboxMessage and MMDFMessage to MaildirMessage 1571edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1572edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF = class_(_sample_message) 1573edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF.set_from('foo@bar', time.gmtime(0.0)) 1574edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('R', 'S'), ('O', ''), ('D', 'T'), ('F', 'F'), ('A', 'R'), 1575edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('RODFA', 'FRST')) 1576edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1577edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF.set_flags(setting) 1578edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MaildirMessage(msg_mboxMMDF) 1579edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_flags(), result) 1580edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_date(), 0.0) 1581edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF.set_flags('O') 1582edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg_mboxMMDF).get_subdir(), 1583edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'cur') 1584edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1585edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_mboxmmdf_to_mboxmmdf(self): 1586edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert mboxMessage and MMDFMessage to mboxMessage and MMDFMessage 1587edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1588edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF = class_(_sample_message) 1589edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF.set_flags('RODFA') 1590edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF.set_from('foo@bar') 1591edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class2_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1592edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg2 = class2_(msg_mboxMMDF) 1593edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg2.get_flags(), 'RODFA') 1594edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg2.get_from(), 'foo@bar') 1595edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1596edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_mboxmmdf_to_mh(self): 1597edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert mboxMessage and MMDFMessage to MHMessage 1598edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1599edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF = class_(_sample_message) 1600edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('R', []), ('O', ['unseen']), ('D', ['unseen']), 1601edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('F', ['unseen', 'flagged']), 1602edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('A', ['unseen', 'replied']), 1603edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('RODFA', ['replied', 'flagged'])) 1604edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1605edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg_mboxMMDF.set_flags(setting) 1606edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MHMessage(msg_mboxMMDF).get_sequences(), 1607edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep result) 1608edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1609edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_mboxmmdf_to_babyl(self): 1610edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert mboxMessage and MMDFMessage to BabylMessage 1611edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1612edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = class_(_sample_message) 1613edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('R', []), ('O', ['unseen']), 1614edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('D', ['unseen', 'deleted']), ('F', ['unseen']), 1615edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('A', ['unseen', 'answered']), 1616edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('RODFA', ['deleted', 'answered'])) 1617edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1618edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.set_flags(setting) 1619edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.BabylMessage(msg).get_labels(), result) 1620edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1621edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_mh_to_maildir(self): 1622edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert MHMessage to MaildirMessage 1623edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('unseen', ''), ('replied', 'RS'), ('flagged', 'FS')) 1624edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1625edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MHMessage(_sample_message) 1626edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence(setting) 1627edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg).get_flags(), result) 1628edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg).get_subdir(), 'cur') 1629edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MHMessage(_sample_message) 1630edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('unseen') 1631edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('replied') 1632edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('flagged') 1633edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg).get_flags(), 'FR') 1634edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg).get_subdir(), 'cur') 1635edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1636edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_mh_to_mboxmmdf(self): 1637edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert MHMessage to mboxMessage and MMDFMessage 1638edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('unseen', 'O'), ('replied', 'ROA'), ('flagged', 'ROF')) 1639edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1640edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MHMessage(_sample_message) 1641edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence(setting) 1642edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1643edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(class_(msg).get_flags(), result) 1644edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MHMessage(_sample_message) 1645edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('unseen') 1646edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('replied') 1647edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('flagged') 1648edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1649edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(class_(msg).get_flags(), 'OFA') 1650edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1651edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_mh_to_mh(self): 1652edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert MHMessage to MHMessage 1653edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MHMessage(_sample_message) 1654edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('unseen') 1655edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('replied') 1656edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('flagged') 1657edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MHMessage(msg).get_sequences(), 1658edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ['unseen', 'replied', 'flagged']) 1659edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1660edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_mh_to_babyl(self): 1661edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert MHMessage to BabylMessage 1662edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('unseen', ['unseen']), ('replied', ['answered']), 1663edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('flagged', [])) 1664edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1665edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MHMessage(_sample_message) 1666edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence(setting) 1667edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.BabylMessage(msg).get_labels(), result) 1668edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.MHMessage(_sample_message) 1669edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('unseen') 1670edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('replied') 1671edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_sequence('flagged') 1672edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.BabylMessage(msg).get_labels(), 1673edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ['unseen', 'answered']) 1674edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1675edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_babyl_to_maildir(self): 1676edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert BabylMessage to MaildirMessage 1677edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('unseen', ''), ('deleted', 'ST'), ('filed', 'S'), 1678edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('answered', 'RS'), ('forwarded', 'PS'), ('edited', 'S'), 1679edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('resent', 'PS')) 1680edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1681edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1682edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label(setting) 1683edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg).get_flags(), result) 1684edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg).get_subdir(), 'cur') 1685edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1686edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for label in ('unseen', 'deleted', 'filed', 'answered', 'forwarded', 1687edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'edited', 'resent'): 1688edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label(label) 1689edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg).get_flags(), 'PRT') 1690edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MaildirMessage(msg).get_subdir(), 'cur') 1691edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1692edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_babyl_to_mboxmmdf(self): 1693edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert BabylMessage to mboxMessage and MMDFMessage 1694edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('unseen', 'O'), ('deleted', 'ROD'), ('filed', 'RO'), 1695edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('answered', 'ROA'), ('forwarded', 'RO'), ('edited', 'RO'), 1696edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('resent', 'RO')) 1697edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1698edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1699edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1700edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label(setting) 1701edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(class_(msg).get_flags(), result) 1702edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1703edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for label in ('unseen', 'deleted', 'filed', 'answered', 'forwarded', 1704edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'edited', 'resent'): 1705edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label(label) 1706edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for class_ in (mailbox.mboxMessage, mailbox.MMDFMessage): 1707edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(class_(msg).get_flags(), 'ODA') 1708edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1709edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_babyl_to_mh(self): 1710edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert BabylMessage to MHMessage 1711edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pairs = (('unseen', ['unseen']), ('deleted', []), ('filed', []), 1712edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('answered', ['replied']), ('forwarded', []), ('edited', []), 1713edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ('resent', [])) 1714edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for setting, result in pairs: 1715edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1716edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label(setting) 1717edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MHMessage(msg).get_sequences(), result) 1718edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1719edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for label in ('unseen', 'deleted', 'filed', 'answered', 'forwarded', 1720edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'edited', 'resent'): 1721edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label(label) 1722edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(mailbox.MHMessage(msg).get_sequences(), 1723edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ['unseen', 'replied']) 1724edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1725edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_babyl_to_babyl(self): 1726edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Convert BabylMessage to BabylMessage 1727edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = mailbox.BabylMessage(_sample_message) 1728edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.update_visible() 1729edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for label in ('unseen', 'deleted', 'filed', 'answered', 'forwarded', 1730edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'edited', 'resent'): 1731edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.add_label(label) 1732edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg2 = mailbox.BabylMessage(msg) 1733edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg2.get_labels(), ['unseen', 'deleted', 'filed', 1734edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'answered', 'forwarded', 'edited', 1735edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'resent']) 1736edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_visible().keys(), msg2.get_visible().keys()) 1737edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for key in msg.get_visible().keys(): 1738edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg.get_visible()[key], msg2.get_visible()[key]) 1739edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1740edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1741edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestProxyFileBase(TestBase): 1742edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1743edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_read(self, proxy): 1744edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Read by byte 1745edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(0) 1746edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(), 'bar') 1747edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(1) 1748edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(), 'ar') 1749edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(0) 1750edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(2), 'ba') 1751edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(1) 1752edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(-1), 'ar') 1753edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(2) 1754edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(1000), 'r') 1755edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1756edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_readline(self, proxy): 1757edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Read by line 1758edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(0) 1759edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readline(), 'foo' + os.linesep) 1760edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readline(), 'bar' + os.linesep) 1761edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readline(), 'fred' + os.linesep) 1762edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readline(), 'bob') 1763edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(2) 1764edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readline(), 'o' + os.linesep) 1765edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(6 + 2 * len(os.linesep)) 1766edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readline(), 'fred' + os.linesep) 1767edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(6 + 2 * len(os.linesep)) 1768edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readline(2), 'fr') 1769edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readline(-10), 'ed' + os.linesep) 1770edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1771edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_readlines(self, proxy): 1772edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Read multiple lines 1773edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(0) 1774edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readlines(), ['foo' + os.linesep, 1775edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'bar' + os.linesep, 1776edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'fred' + os.linesep, 'bob']) 1777edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(0) 1778edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readlines(2), ['foo' + os.linesep]) 1779edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(3 + len(os.linesep)) 1780edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readlines(4 + len(os.linesep)), 1781edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ['bar' + os.linesep, 'fred' + os.linesep]) 1782edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(3) 1783edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.readlines(1000), [os.linesep, 'bar' + os.linesep, 1784edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 'fred' + os.linesep, 'bob']) 1785edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1786edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_iteration(self, proxy): 1787edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Iterate by line 1788edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(0) 1789edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep iterator = iter(proxy) 1790edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(list(iterator), 1791edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ['foo' + os.linesep, 'bar' + os.linesep, 'fred' + os.linesep, 'bob']) 1792edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1793edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_seek_and_tell(self, proxy): 1794edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Seek and use tell to check position 1795edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(3) 1796edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.tell(), 3) 1797edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(len(os.linesep)), os.linesep) 1798edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(2, 1) 1799edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(1 + len(os.linesep)), 'r' + os.linesep) 1800edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(-3 - len(os.linesep), 2) 1801edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(3), 'bar') 1802edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(2, 0) 1803edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(), 'o' + os.linesep + 'bar' + os.linesep) 1804edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.seek(100) 1805edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.read(), '') 1806edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1807edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def _test_close(self, proxy): 1808edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Close a file 1809edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.close() 1810edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Issue 11700 subsequent closes should be a no-op, not an error. 1811edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy.close() 1812edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1813edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1814edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestProxyFile(TestProxyFileBase, unittest.TestCase): 1815edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1816edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def setUp(self): 1817edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._path = test_support.TESTFN 1818edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file = open(self._path, 'wb+') 1819edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1820edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def tearDown(self): 1821edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.close() 1822edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._delete_recursively(self._path) 1823edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1824edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize(self): 1825edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize and check position 1826edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('foo') 1827edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pos = self._file.tell() 1828edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy0 = mailbox._ProxyFile(self._file) 1829edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy0.tell(), pos) 1830edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._file.tell(), pos) 1831edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy1 = mailbox._ProxyFile(self._file, 0) 1832edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy1.tell(), 0) 1833edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._file.tell(), pos) 1834edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1835edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_read(self): 1836edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('bar') 1837edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_read(mailbox._ProxyFile(self._file)) 1838edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1839edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_readline(self): 1840edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('foo%sbar%sfred%sbob' % (os.linesep, os.linesep, 1841edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.linesep)) 1842edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_readline(mailbox._ProxyFile(self._file)) 1843edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1844edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_readlines(self): 1845edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('foo%sbar%sfred%sbob' % (os.linesep, os.linesep, 1846edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.linesep)) 1847edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_readlines(mailbox._ProxyFile(self._file)) 1848edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1849edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_iteration(self): 1850edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('foo%sbar%sfred%sbob' % (os.linesep, os.linesep, 1851edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.linesep)) 1852edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_iteration(mailbox._ProxyFile(self._file)) 1853edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1854edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_seek_and_tell(self): 1855edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('foo%sbar%s' % (os.linesep, os.linesep)) 1856edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_seek_and_tell(mailbox._ProxyFile(self._file)) 1857edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1858edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_close(self): 1859edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('foo%sbar%s' % (os.linesep, os.linesep)) 1860edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_close(mailbox._ProxyFile(self._file)) 1861edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1862edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1863edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass TestPartialFile(TestProxyFileBase, unittest.TestCase): 1864edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1865edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def setUp(self): 1866edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._path = test_support.TESTFN 1867edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file = open(self._path, 'wb+') 1868edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1869edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def tearDown(self): 1870edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.close() 1871edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._delete_recursively(self._path) 1872edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1873edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_initialize(self): 1874edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Initialize and check position 1875edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('foo' + os.linesep + 'bar') 1876edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pos = self._file.tell() 1877edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep proxy = mailbox._PartialFile(self._file, 2, 5) 1878edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(proxy.tell(), 0) 1879edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(self._file.tell(), pos) 1880edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1881edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_read(self): 1882edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('***bar***') 1883edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_read(mailbox._PartialFile(self._file, 3, 6)) 1884edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1885edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_readline(self): 1886edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('!!!!!foo%sbar%sfred%sbob!!!!!' % 1887edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (os.linesep, os.linesep, os.linesep)) 1888edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_readline(mailbox._PartialFile(self._file, 5, 1889edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 18 + 3 * len(os.linesep))) 1890edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1891edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_readlines(self): 1892edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('foo%sbar%sfred%sbob?????' % 1893edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (os.linesep, os.linesep, os.linesep)) 1894edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_readlines(mailbox._PartialFile(self._file, 0, 1895edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 13 + 3 * len(os.linesep))) 1896edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1897edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_iteration(self): 1898edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('____foo%sbar%sfred%sbob####' % 1899edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep (os.linesep, os.linesep, os.linesep)) 1900edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_iteration(mailbox._PartialFile(self._file, 4, 1901edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 17 + 3 * len(os.linesep))) 1902edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1903edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_seek_and_tell(self): 1904edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('(((foo%sbar%s$$$' % (os.linesep, os.linesep)) 1905edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_seek_and_tell(mailbox._PartialFile(self._file, 3, 1906edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 9 + 2 * len(os.linesep))) 1907edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1908edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_close(self): 1909edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._file.write('&foo%sbar%s^' % (os.linesep, os.linesep)) 1910edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._test_close(mailbox._PartialFile(self._file, 1, 1911edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 6 + 3 * len(os.linesep))) 1912edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1913edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1914edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep## Start: tests from the original module (for backward compatibility). 1915edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1916edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepFROM_ = "From some.body@dummy.domain Sat Jul 24 13:43:35 2004\n" 1917edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepDUMMY_MESSAGE = """\ 1918edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepFrom: some.body@dummy.domain 1919edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepTo: me@my.domain 1920edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepSubject: Simple Test 1921edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1922edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepThis is a dummy message. 1923edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep""" 1924edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1925edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepclass MaildirTestCase(unittest.TestCase): 1926edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1927edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def setUp(self): 1928edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # create a new maildir mailbox to work with: 1929edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._dir = test_support.TESTFN 1930edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if os.path.isdir(self._dir): 1931edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.rmtree(self._dir) 1932edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if os.path.isfile(self._dir): 1933edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.unlink(self._dir) 1934edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.mkdir(self._dir) 1935edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.mkdir(os.path.join(self._dir, "cur")) 1936edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.mkdir(os.path.join(self._dir, "tmp")) 1937edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.mkdir(os.path.join(self._dir, "new")) 1938edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._counter = 1 1939edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._msgfiles = [] 1940edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1941edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def tearDown(self): 1942edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep map(os.unlink, self._msgfiles) 1943edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.rmdir(os.path.join(self._dir, "cur")) 1944edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.rmdir(os.path.join(self._dir, "tmp")) 1945edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.rmdir(os.path.join(self._dir, "new")) 1946edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.rmdir(self._dir) 1947edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1948edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def createMessage(self, dir, mbox=False): 1949edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep t = int(time.time() % 1000000) 1950edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep pid = self._counter 1951edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._counter += 1 1952edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep filename = os.extsep.join((str(t), str(pid), "myhostname", "mydomain")) 1953edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep tmpname = os.path.join(self._dir, "tmp", filename) 1954edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep newname = os.path.join(self._dir, dir, filename) 1955edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with open(tmpname, "w") as fp: 1956edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._msgfiles.append(tmpname) 1957edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if mbox: 1958edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep fp.write(FROM_) 1959edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep fp.write(DUMMY_MESSAGE) 1960edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep if hasattr(os, "link"): 1961edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep os.link(tmpname, newname) 1962edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep else: 1963edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep with open(newname, "w") as fp: 1964edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep fp.write(DUMMY_MESSAGE) 1965edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self._msgfiles.append(newname) 1966edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep return tmpname 1967edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1968edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_empty_maildir(self): 1969edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep """Test an empty maildir mailbox""" 1970edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Test for regression on bug #117490: 1971edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep # Make sure the boxes attribute actually gets set. 1972edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mbox = mailbox.Maildir(test_support.TESTFN) 1973edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep #self.assertTrue(hasattr(self.mbox, "boxes")) 1974edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep #self.assertTrue(len(self.mbox.boxes) == 0) 1975edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self.mbox.next(), None) 1976edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self.mbox.next(), None) 1977edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1978edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_nonempty_maildir_cur(self): 1979edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.createMessage("cur") 1980edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mbox = mailbox.Maildir(test_support.TESTFN) 1981edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep #self.assertTrue(len(self.mbox.boxes) == 1) 1982edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self.mbox.next() 1983edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsNot(msg, None) 1984edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.fp.close() 1985edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self.mbox.next(), None) 1986edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self.mbox.next(), None) 1987edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1988edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_nonempty_maildir_new(self): 1989edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.createMessage("new") 1990edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mbox = mailbox.Maildir(test_support.TESTFN) 1991edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep #self.assertTrue(len(self.mbox.boxes) == 1) 1992edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self.mbox.next() 1993edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsNot(msg, None) 1994edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.fp.close() 1995edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self.mbox.next(), None) 1996edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self.mbox.next(), None) 1997edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 1998edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_nonempty_maildir_both(self): 1999edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.createMessage("cur") 2000edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.createMessage("new") 2001edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.mbox = mailbox.Maildir(test_support.TESTFN) 2002edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep #self.assertTrue(len(self.mbox.boxes) == 2) 2003edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self.mbox.next() 2004edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsNot(msg, None) 2005edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.fp.close() 2006edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg = self.mbox.next() 2007edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIsNot(msg, None) 2008edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep msg.fp.close() 2009edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self.mbox.next(), None) 2010edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertIs(self.mbox.next(), None) 2011edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2012edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep def test_unix_mbox(self): 2013edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep ### should be better! 2014edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep import email.parser 2015edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep fname = self.createMessage("cur", True) 2016edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep n = 0 2017edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep fid = open(fname) 2018edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for msg in mailbox.PortableUnixMailbox(fid, 2019edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep email.parser.Parser().parse): 2020edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep n += 1 2021edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(msg["subject"], "Simple Test") 2022edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(len(str(msg)), len(FROM_)+len(DUMMY_MESSAGE)) 2023edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep fid.close() 2024edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep self.assertEqual(n, 1) 2025edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2026edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep## End: classes from the original module (for backward compatibility). 2027edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2028edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2029edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep_sample_message = """\ 2030edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepReturn-Path: <gkj@gregorykjohnson.com> 2031edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepX-Original-To: gkj+person@localhost 2032edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepDelivered-To: gkj+person@localhost 2033edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepReceived: from localhost (localhost [127.0.0.1]) 2034edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep by andy.gregorykjohnson.com (Postfix) with ESMTP id 356ED9DD17 2035edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for <gkj+person@localhost>; Wed, 13 Jul 2005 17:23:16 -0400 (EDT) 2036edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepDelivered-To: gkj@sundance.gregorykjohnson.com 2037edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepReceived: from localhost [127.0.0.1] 2038edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep by localhost with POP3 (fetchmail-6.2.5) 2039edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for gkj+person@localhost (single-drop); Wed, 13 Jul 2005 17:23:16 -0400 (EDT) 2040edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepReceived: from andy.gregorykjohnson.com (andy.gregorykjohnson.com [64.32.235.228]) 2041edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep by sundance.gregorykjohnson.com (Postfix) with ESMTP id 5B056316746 2042edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for <gkj@gregorykjohnson.com>; Wed, 13 Jul 2005 17:23:11 -0400 (EDT) 2043edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepReceived: by andy.gregorykjohnson.com (Postfix, from userid 1000) 2044edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep id 490CD9DD17; Wed, 13 Jul 2005 17:23:11 -0400 (EDT) 2045edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepDate: Wed, 13 Jul 2005 17:23:11 -0400 2046edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepFrom: "Gregory K. Johnson" <gkj@gregorykjohnson.com> 2047edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepTo: gkj@gregorykjohnson.com 2048edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepSubject: Sample message 2049edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepMessage-ID: <20050713212311.GC4701@andy.gregorykjohnson.com> 2050edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepMime-Version: 1.0 2051edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepContent-Type: multipart/mixed; boundary="NMuMz9nt05w80d4+" 2052edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepContent-Disposition: inline 2053edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepUser-Agent: Mutt/1.5.9i 2054edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2055edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2056edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep--NMuMz9nt05w80d4+ 2057edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepContent-Type: text/plain; charset=us-ascii 2058edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepContent-Disposition: inline 2059edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2060edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepThis is a sample message. 2061edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2062edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep-- 2063edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepGregory K. Johnson 2064edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2065edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep--NMuMz9nt05w80d4+ 2066edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepContent-Type: application/octet-stream 2067edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepContent-Disposition: attachment; filename="text.gz" 2068edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepContent-Transfer-Encoding: base64 2069edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2070edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepH4sICM2D1UIAA3RleHQAC8nILFYAokSFktSKEoW0zJxUPa7wzJIMhZLyfIWczLzUYj0uAHTs 2071edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep3FYlAAAA 2072edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2073edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep--NMuMz9nt05w80d4+-- 2074edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep""" 2075edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2076edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep_sample_headers = { 2077edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Return-Path":"<gkj@gregorykjohnson.com>", 2078edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "X-Original-To":"gkj+person@localhost", 2079edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Delivered-To":"gkj+person@localhost", 2080edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Received":"""from localhost (localhost [127.0.0.1]) 2081edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep by andy.gregorykjohnson.com (Postfix) with ESMTP id 356ED9DD17 2082edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for <gkj+person@localhost>; Wed, 13 Jul 2005 17:23:16 -0400 (EDT)""", 2083edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Delivered-To":"gkj@sundance.gregorykjohnson.com", 2084edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Received":"""from localhost [127.0.0.1] 2085edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep by localhost with POP3 (fetchmail-6.2.5) 2086edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for gkj+person@localhost (single-drop); Wed, 13 Jul 2005 17:23:16 -0400 (EDT)""", 2087edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Received":"""from andy.gregorykjohnson.com (andy.gregorykjohnson.com [64.32.235.228]) 2088edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep by sundance.gregorykjohnson.com (Postfix) with ESMTP id 5B056316746 2089edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep for <gkj@gregorykjohnson.com>; Wed, 13 Jul 2005 17:23:11 -0400 (EDT)""", 2090edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Received":"""by andy.gregorykjohnson.com (Postfix, from userid 1000) 2091edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep id 490CD9DD17; Wed, 13 Jul 2005 17:23:11 -0400 (EDT)""", 2092edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Date":"Wed, 13 Jul 2005 17:23:11 -0400", 2093edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "From":""""Gregory K. Johnson" <gkj@gregorykjohnson.com>""", 2094edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "To":"gkj@gregorykjohnson.com", 2095edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Subject":"Sample message", 2096edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Mime-Version":"1.0", 2097edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Content-Type":"""multipart/mixed; boundary="NMuMz9nt05w80d4+\"""", 2098edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "Content-Disposition":"inline", 2099edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep "User-Agent": "Mutt/1.5.9i" } 2100edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2101edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep_sample_payloads = ("""This is a sample message. 2102edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2103edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep-- 2104edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander StoepGregory K. Johnson 2105edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep""", 2106edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep"""H4sICM2D1UIAA3RleHQAC8nILFYAokSFktSKEoW0zJxUPa7wzJIMhZLyfIWczLzUYj0uAHTs 2107edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep3FYlAAAA 2108edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep""") 2109edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2110edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2111edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepdef test_main(): 2112edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep tests = (TestMailboxSuperclass, TestMaildir, TestMbox, TestMMDF, TestMH, 2113edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep TestBabyl, TestMessage, TestMaildirMessage, TestMboxMessage, 2114edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep TestMHMessage, TestBabylMessage, TestMMDFMessage, 2115edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep TestMessageConversion, TestProxyFile, TestPartialFile, 2116edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep MaildirTestCase) 2117edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.run_unittest(*tests) 2118edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_support.reap_children() 2119edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2120edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep 2121edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoepif __name__ == '__main__': 2122edbb763a2b63074cd468a5d33a17908b2cc0654Jeff Vander Stoep test_main() 2123