diff options
author | Paul Rodger <paul@paulrodger.com> | 2002-04-24 07:44:59 +0000 |
---|---|---|
committer | Paul Rodger <paul@paulrodger.com> | 2002-04-24 07:44:59 +0000 |
commit | 14d58baee112cb294fd2e856c79a9cf8a87b742e (patch) | |
tree | 5e11fd1cb23006364360ee5acc7abbc47111192f | |
parent | a79e730127a925a8a750b0545bbe5be93fd6e0ca (diff) | |
download | archivemail-14d58baee112cb294fd2e856c79a9cf8a87b742e.tar.gz archivemail-14d58baee112cb294fd2e856c79a9cf8a87b742e.tar.bz2 archivemail-14d58baee112cb294fd2e856c79a9cf8a87b742e.zip |
Added a lot more system tests.
Hopefully I haven't gone too overboard with 957 lines of testing code for
a 1100 line program :)
-rw-r--r-- | CHANGELOG | 1 | ||||
-rwxr-xr-x | archivemail.py | 2 | ||||
-rwxr-xr-x | test_archivemail.py | 360 |
3 files changed, 267 insertions, 96 deletions
@@ -6,6 +6,7 @@ Version 0.4.2 - ??? 1970. Yes, someone had a 'Date' header with 1967 :) * Complain if the mailbox to be read does not look like a valid mbox-format mailbox. + * Added a few more tests to test_archivemail.py Version 0.4.1 - 21 April 2002 * Don't archive messages that are flagged important unless we are given the diff --git a/archivemail.py b/archivemail.py index 8ac2836..148d7a5 100755 --- a/archivemail.py +++ b/archivemail.py @@ -537,7 +537,7 @@ class IdentityCache: assert(msg) message_id = msg.get('Message-ID') assert(message_id) - if self.seen_ids.has_key(message_id): + if message_id in self.seen_ids: user_warning("duplicate message id: '%s' in mailbox '%s'" % (message_id, self.mailbox_name)) self.seen_ids[message_id] = 1 diff --git a/test_archivemail.py b/test_archivemail.py index 7509e56..d6b10a3 100755 --- a/test_archivemail.py +++ b/test_archivemail.py @@ -49,6 +49,7 @@ def check_python_version(): check_python_version() # define & run this early because 'unittest' is new +import copy import fcntl import filecmp import os @@ -334,59 +335,6 @@ class TestChooseTempDir(unittest.TestCase): ########## acceptance testing ########### -class TestArchiveMboxTimestamp(unittest.TestCase): - """original mbox timestamps should always be preserved""" - def setUp(self): - archivemail.options.quiet = 1 - - def testNew(self): - """mbox timestamps should not change after no archival""" - self.mbox_name = make_mbox(messages=3, hours_old=(24 * 179)) - self.mtime = os.path.getmtime(self.mbox_name) - 66 - self.atime = os.path.getatime(self.mbox_name) - 88 - os.utime(self.mbox_name, (self.atime, self.mtime)) - archivemail.archive(self.mbox_name) - assert(os.path.exists(self.mbox_name)) - new_atime = os.path.getatime(self.mbox_name) - new_mtime = os.path.getmtime(self.mbox_name) - self.assertEqual(self.mtime, new_mtime) - self.assertEqual(self.atime, new_atime) - - def testMixed(self): - """mbox timestamps should not change after semi-archival""" - self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181)) - self.mtime = os.path.getmtime(self.mbox_name) - 66 - self.atime = os.path.getatime(self.mbox_name) - 88 - os.utime(self.mbox_name, (self.atime, self.mtime)) - archive_name = self.mbox_name + "_archive.gz" - archivemail.archive(self.mbox_name) - assert(os.path.exists(self.mbox_name)) - new_atime = os.path.getatime(self.mbox_name) - new_mtime = os.path.getmtime(self.mbox_name) - self.assertEqual(self.mtime, new_mtime) - self.assertEqual(self.atime, new_atime) - - def testOld(self): - """mbox timestamps should not change after archival""" - self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181)) - self.mtime = os.path.getmtime(self.mbox_name) - 66 - self.atime = os.path.getatime(self.mbox_name) - 88 - os.utime(self.mbox_name, (self.atime, self.mtime)) - archive_name = self.mbox_name + "_archive.gz" - archivemail.archive(self.mbox_name) - assert(os.path.exists(self.mbox_name)) - new_atime = os.path.getatime(self.mbox_name) - new_mtime = os.path.getmtime(self.mbox_name) - self.assertEqual(self.mtime, new_mtime) - self.assertEqual(self.atime, new_atime) - - def tearDown(self): - archivemail.options.quiet = 0 - for name in (self.mbox_name, self.mbox_name + "_archive.gz"): - if os.path.exists(name): - os.remove(name) - - class TestArchiveMbox(unittest.TestCase): """archiving should work based on the date of messages given""" old_mbox = None @@ -419,6 +367,80 @@ class TestArchiveMbox(unittest.TestCase): assert(os.path.exists(archive_name)) assert(filecmp.cmp(archive_name, self.copy_name, shallow=0)) + def testOldSystem(self): + """archiving an old mailbox via system should create an archive""" + self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181)) + self.mbox_mode = os.stat(self.mbox_name)[stat.ST_MODE] + self.copy_name = tempfile.mktemp() + shutil.copyfile(self.mbox_name, self.copy_name) + + run = "./archivemail.py --quiet %s" % self.mbox_name + self.assertEqual(os.system(run), 0) + assert(os.path.exists(self.mbox_name)) + self.assertEqual(os.path.getsize(self.mbox_name), 0) + new_mode = os.stat(self.mbox_name)[stat.ST_MODE] + self.assertEqual(self.mbox_mode, new_mode) + + archive_name = self.mbox_name + "_archive.gz" + assert(os.path.exists(archive_name)) + self.assertEqual(os.system("gzip -d %s" % archive_name), 0) + + archive_name = self.mbox_name + "_archive" + assert(os.path.exists(archive_name)) + assert(filecmp.cmp(archive_name, self.copy_name, shallow=0)) + + def testDateSystem(self): + """test that the --date option works as expected""" + test_headers = ( + { + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2030', + 'Date' : 'Fri, 28 Jul 2000 16:11:36 +1000', + }, + { + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2000', + 'Date' : None, + }, + { + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2030', + 'Date' : None, + 'Delivery-date' : 'Fri, 28 Jul 2000 16:11:36 +1000', + }, + { + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2030', + 'Date' : None, + 'Resent-Date' : 'Fri, 28 Jul 2000 16:11:36 +1000', + }, + ) + for headers in test_headers: + for option in ('--date=2000-07-29', '-D2000-07-29', + '--date="29 Jul 2000"', '--date="29 July 2000"'): + self.mbox_name = make_mbox(messages=3, headers=headers) + self.copy_name = tempfile.mktemp() + shutil.copyfile(self.mbox_name, self.copy_name) + run = "./archivemail.py -q %s %s" % (option, self.mbox_name) + self.assertEqual(os.system(run), 0) + assert(os.path.exists(self.mbox_name)) + self.assertEqual(os.path.getsize(self.mbox_name), 0) + archive_name = self.mbox_name + "_archive.gz" + assert(os.path.exists(archive_name)) + self.assertEqual(os.system("gzip -d %s" % archive_name), 0) + archive_name = self.mbox_name + "_archive" + assert(os.path.exists(archive_name)) + assert(filecmp.cmp(archive_name, self.copy_name, shallow=0)) + self.tearDown() + for option in ('--date=2000-07-27', '-D2000-07-27', + '--date="27 Jul 2000"', '--date="27 July 2000"'): + self.mbox_name = make_mbox(messages=3, headers=headers) + self.copy_name = tempfile.mktemp() + shutil.copyfile(self.mbox_name, self.copy_name) + run = "./archivemail.py -q %s %s" % (option, self.mbox_name) + self.assertEqual(os.system(run), 0) + assert(os.path.exists(self.mbox_name)) + assert(filecmp.cmp(self.mbox_name, self.copy_name, shallow=0)) + archive_name = self.mbox_name + "_archive.gz" + assert(not os.path.exists(archive_name)) + self.tearDown() + def testMixed(self): """archiving a mixed mailbox should make a mixed-archive""" self.new_mbox = make_mbox(messages=3, hours_old=(24 * 179)) @@ -436,13 +458,46 @@ class TestArchiveMbox(unittest.TestCase): assert(os.path.exists(archive_name)) assert(filecmp.cmp(archive_name, self.old_mbox, shallow=0)) + def testMixedSystem(self): + """archiving a mixed mailbox via system should make a mixed-archive""" + self.new_mbox = make_mbox(messages=3, hours_old=(24 * 179)) + self.old_mbox = make_mbox(messages=3, hours_old=(24 * 181)) + self.mbox_name = tempfile.mktemp() + shutil.copyfile(self.new_mbox, self.mbox_name) + append_file(self.old_mbox, self.mbox_name) + run = "./archivemail.py --quiet %s" % self.mbox_name + self.assertEqual(os.system(run), 0) + assert(os.path.exists(self.mbox_name)) + assert(filecmp.cmp(self.new_mbox, self.mbox_name, shallow=0)) + archive_name = self.mbox_name + "_archive.gz" + assert(os.path.exists(archive_name)) + self.assertEqual(os.system("gzip -d %s" % archive_name), 0) + archive_name = self.mbox_name + "_archive" + assert(os.path.exists(archive_name)) + assert(filecmp.cmp(archive_name, self.old_mbox, shallow=0)) + def testNew(self): """archiving a new mailbox should not create an archive""" self.mbox_name = make_mbox(messages=3, hours_old=(24 * 179)) self.mbox_mode = os.stat(self.mbox_name)[stat.ST_MODE] self.copy_name = tempfile.mktemp() shutil.copyfile(self.mbox_name, self.copy_name) + archivemail.archive(self.mbox_name) + assert(os.path.exists(self.mbox_name)) + assert(filecmp.cmp(self.mbox_name, self.copy_name, shallow=0)) + new_mode = os.stat(self.mbox_name)[stat.ST_MODE] + self.assertEqual(self.mbox_mode, new_mode) + archive_name = self.mbox_name + "_archive.gz" + assert(not os.path.exists(archive_name)) + def testNewSystem(self): + """archiving a new mailbox via system should not create an archive""" + self.mbox_name = make_mbox(messages=3, hours_old=(24 * 179)) + self.mbox_mode = os.stat(self.mbox_name)[stat.ST_MODE] + self.copy_name = tempfile.mktemp() + shutil.copyfile(self.mbox_name, self.copy_name) + run = "./archivemail.py --quiet %s" % self.mbox_name + self.assertEqual(os.system(run), 0) archivemail.archive(self.mbox_name) assert(os.path.exists(self.mbox_name)) assert(filecmp.cmp(self.mbox_name, self.copy_name, shallow=0)) @@ -461,7 +516,6 @@ class TestArchiveMbox(unittest.TestCase): shutil.copyfile(self.mbox_name, archive_name) # archive has 3 msgs append_file(self.mbox_name, self.copy_name) # copy now has 6 msgs self.assertEqual(os.system("gzip %s" % archive_name), 0) - archivemail.archive(self.mbox_name) assert(os.path.exists(self.mbox_name)) self.assertEqual(os.path.getsize(self.mbox_name), 0) @@ -474,6 +528,81 @@ class TestArchiveMbox(unittest.TestCase): assert(os.path.exists(archive_name)) assert(filecmp.cmp(archive_name, self.copy_name, shallow=0)) + def testOldExistingSystem(self): + """archiving an old mailbox via system with an existing archive""" + self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181)) + self.mbox_mode = os.stat(self.mbox_name)[stat.ST_MODE] + self.copy_name = tempfile.mktemp() + archive_name = self.mbox_name + "_archive" + shutil.copyfile(self.mbox_name, self.copy_name) + shutil.copyfile(self.mbox_name, archive_name) # archive has 3 msgs + append_file(self.mbox_name, self.copy_name) # copy now has 6 msgs + self.assertEqual(os.system("gzip %s" % archive_name), 0) + run = "./archivemail.py --quiet %s" % self.mbox_name + self.assertEqual(os.system(run), 0) + assert(os.path.exists(self.mbox_name)) + self.assertEqual(os.path.getsize(self.mbox_name), 0) + new_mode = os.stat(self.mbox_name)[stat.ST_MODE] + self.assertEqual(self.mbox_mode, new_mode) + archive_name = self.mbox_name + "_archive.gz" + assert(os.path.exists(archive_name)) + self.assertEqual(os.system("gzip -d %s" % archive_name), 0) + archive_name = self.mbox_name + "_archive" + assert(os.path.exists(archive_name)) + assert(filecmp.cmp(archive_name, self.copy_name, shallow=0)) + + def testOldWeirdHeaders(self): + """old mailboxes with weird headers should create an exact archive""" + weird_headers = ( + { # we should archive even though date < epoch + 'From_' : 'sender@dummy.domain Sat Feb 09 02:35:07 1962', + 'Date' : 'Fri, 08 Feb 1962 07:22:54 -0500', + }, + { # we should archive because of the date on the 'From_' line + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2000', + 'Date' : 'Friskhdfkjkh, 28 Jul 2002 1line noise6:11:36 +1000', + }, + { # we should archive because of the date on the 'From_' line + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2000', + 'Date' : None, + }, + { # we should archive because of the date in 'Delivery-date' + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2030', + 'Date' : 'Frcorruptioni, 28 Jul 20line noise00 16:6 +1000', + 'Delivery-date' : 'Fri, 28 Jul 2000 16:11:36 +1000', + }, + { # we should archive because of the date in 'Delivery-date' + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2030', + 'Date' : None, + 'Delivery-date' : 'Fri, 28 Jul 2000 16:11:36 +1000', + }, + { # we should archive because of the date in 'Resent-Date' + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2030', + 'Date' : 'Frcorruptioni, 28 Jul 20line noise00 16:6 +1000', + 'Resent-Date' : 'Fri, 28 Jul 2000 16:11:36 +1000', + }, + { # we should archive because of the date in 'Resent-Date' + 'From_' : 'sender@dummy.domain Fri Jul 28 16:11:36 2030', + 'Date' : None, + 'Resent-Date' : 'Fri, 28 Jul 2000 16:11:36 +1000', + }, + ) + for headers in weird_headers: + self.setUp() + self.mbox_name = make_mbox(messages=3, headers=headers) + self.copy_name = tempfile.mktemp() + shutil.copyfile(self.mbox_name, self.copy_name) + archivemail.archive(self.mbox_name) + assert(os.path.exists(self.mbox_name)) + self.assertEqual(os.path.getsize(self.mbox_name), 0) + archive_name = self.mbox_name + "_archive.gz" + assert(os.path.exists(archive_name)) + self.assertEqual(os.system("gzip -d %s" % archive_name), 0) + archive_name = self.mbox_name + "_archive" + assert(os.path.exists(archive_name)) + assert(filecmp.cmp(archive_name, self.copy_name, shallow=0)) + self.tearDown() + def tearDown(self): archivemail.options.quiet = 0 archive = self.mbox_name + "_archive" @@ -483,6 +612,59 @@ class TestArchiveMbox(unittest.TestCase): os.remove(name) +class TestArchiveMboxTimestamp(unittest.TestCase): + """original mbox timestamps should always be preserved""" + def setUp(self): + archivemail.options.quiet = 1 + + def testNew(self): + """mbox timestamps should not change after no archival""" + self.mbox_name = make_mbox(messages=3, hours_old=(24 * 179)) + self.mtime = os.path.getmtime(self.mbox_name) - 66 + self.atime = os.path.getatime(self.mbox_name) - 88 + os.utime(self.mbox_name, (self.atime, self.mtime)) + archivemail.archive(self.mbox_name) + assert(os.path.exists(self.mbox_name)) + new_atime = os.path.getatime(self.mbox_name) + new_mtime = os.path.getmtime(self.mbox_name) + self.assertEqual(self.mtime, new_mtime) + self.assertEqual(self.atime, new_atime) + + def testMixed(self): + """mbox timestamps should not change after semi-archival""" + self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181)) + self.mtime = os.path.getmtime(self.mbox_name) - 66 + self.atime = os.path.getatime(self.mbox_name) - 88 + os.utime(self.mbox_name, (self.atime, self.mtime)) + archive_name = self.mbox_name + "_archive.gz" + archivemail.archive(self.mbox_name) + assert(os.path.exists(self.mbox_name)) + new_atime = os.path.getatime(self.mbox_name) + new_mtime = os.path.getmtime(self.mbox_name) + self.assertEqual(self.mtime, new_mtime) + self.assertEqual(self.atime, new_atime) + + def testOld(self): + """mbox timestamps should not change after archival""" + self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181)) + self.mtime = os.path.getmtime(self.mbox_name) - 66 + self.atime = os.path.getatime(self.mbox_name) - 88 + os.utime(self.mbox_name, (self.atime, self.mtime)) + archive_name = self.mbox_name + "_archive.gz" + archivemail.archive(self.mbox_name) + assert(os.path.exists(self.mbox_name)) + new_atime = os.path.getatime(self.mbox_name) + new_mtime = os.path.getmtime(self.mbox_name) + self.assertEqual(self.mtime, new_mtime) + self.assertEqual(self.atime, new_atime) + + def tearDown(self): + archivemail.options.quiet = 0 + for name in (self.mbox_name, self.mbox_name + "_archive.gz"): + if os.path.exists(name): + os.remove(name) + + class TestArchiveMboxPreserveStatus(unittest.TestCase): """make sure the 'preserve_unread' option works""" def setUp(self): @@ -492,7 +674,7 @@ class TestArchiveMboxPreserveStatus(unittest.TestCase): def testOldRead(self): """archiving an old read mailbox should create an archive""" self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181), \ - status="RO") + headers={"Status":"RO"}) self.copy_name = tempfile.mktemp() shutil.copyfile(self.mbox_name, self.copy_name) @@ -536,7 +718,7 @@ class TestArchiveMboxFlagged(unittest.TestCase): """by default, old flagged messages should not be archived""" archivemail.options.include_flagged = 0 self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181), \ - x_status="F") + headers={"X-Status":"F"}) self.copy_name = tempfile.mktemp() shutil.copyfile(self.mbox_name, self.copy_name) @@ -550,7 +732,7 @@ class TestArchiveMboxFlagged(unittest.TestCase): """new flagged messages should not be archived with include_flagged""" archivemail.options.include_flagged = 1 self.mbox_name = make_mbox(messages=3, hours_old=(24 * 179), \ - x_status="F") + headers={"X-Status":"F"}) self.copy_name = tempfile.mktemp() shutil.copyfile(self.mbox_name, self.copy_name) @@ -564,7 +746,7 @@ class TestArchiveMboxFlagged(unittest.TestCase): """old flagged messages should be archived with include_flagged""" archivemail.options.include_flagged = 1 self.mbox_name = make_mbox(messages=3, hours_old=(24 * 181), \ - x_status="F") + headers={"X-Status":"F"}) self.copy_name = tempfile.mktemp() shutil.copyfile(self.mbox_name, self.copy_name) @@ -587,8 +769,7 @@ class TestArchiveMboxFlagged(unittest.TestCase): os.remove(name) - -class TestArchiveMboxUncompressedOld(unittest.TestCase): +class TestArchiveMboxUncompressed(unittest.TestCase): """make sure that the 'no_compress' option works""" mbox_name = None new_mbox = None @@ -718,43 +899,31 @@ class TestArchiveMboxMode(unittest.TestCase): ########## helper routines ############ -def make_message(body=None, date=None, delivery_date=None, from_address=None, - hours_old=0, resent_date=None, status=None, subject=None, to_address=None, - unix_from=None, x_status=None): - - if not date: +def make_message(body=None, default_headers={}, hours_old=None): + headers = copy.copy(default_headers) + if not headers: + headers = {} + if 'Date' not in headers: time_message = time.time() - (60 * 60 * hours_old) - date = time.asctime(time.localtime(time_message)) - if not from_address: - from_address = "sender@dummy.domain" - if not to_address: - to_address = "receipient@dummy.domain" - if not subject: - subject = "This is the subject" - if not unix_from: - unix_from = "From %s %s" % (from_address, date) + headers['Date'] = time.asctime(time.localtime(time_message)) + if 'From' not in headers: + headers['From'] = "sender@dummy.domain" + if 'To' not in headers: + headers['To'] = "receipient@dummy.domain" + if 'Subject' not in headers: + headers['Subject'] = "This is the subject" + if 'From_' not in headers: + headers['From_'] = "%s %s" % (headers['From'], headers['Date']) if not body: body = "This is the message body" msg = "" - if unix_from: - msg = msg + ("%s\n" % unix_from) - if date: - msg = msg + ("Date: %s\n" % date) - if delivery_date: - msg = msg + ("Delivery-Date: %s\n" % delivery_date) - if resent_date: - msg = msg + ("Resent-Date: %s\n" % resent_date) - if status: - msg = msg + ("Status: %s\n" % status) - if x_status: - msg = msg + ("X-Status: %s\n" % x_status) - if from_address: - msg = msg + ("From: %s\n" % from_address) - if to_address: - msg = msg + ("To: %s\n" % to_address) - if subject: - msg = msg + ("Subject: %s\n" % subject) + if 'From_' in headers: + msg = msg + ("From %s\n" % headers['From_']) + del headers['From_'] + for key in headers.keys(): + if headers[key] is not None: + msg = msg + ("%s: %s\n" % (key, headers[key])) msg = msg + "\n\n" + body + "\n\n" return msg @@ -769,12 +938,13 @@ def append_file(source, dest): read.close() write.close() -def make_mbox(messages=1, hours_old=0, status=None, x_status=None): +def make_mbox(body=None, headers=None, hours_old=0, messages=1): name = tempfile.mktemp() file = open(name, "w") for count in range(messages): - file.write(make_message(hours_old=hours_old, status=status, \ - x_status=x_status)) + msg = make_message(body=body, default_headers=headers, + hours_old=hours_old) + file.write(msg) file.close() return name |