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