aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Rodger <paul@paulrodger.com>2002-04-24 07:44:59 +0000
committerPaul Rodger <paul@paulrodger.com>2002-04-24 07:44:59 +0000
commit14d58baee112cb294fd2e856c79a9cf8a87b742e (patch)
tree5e11fd1cb23006364360ee5acc7abbc47111192f
parenta79e730127a925a8a750b0545bbe5be93fd6e0ca (diff)
downloadarchivemail-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--CHANGELOG1
-rwxr-xr-xarchivemail.py2
-rwxr-xr-xtest_archivemail.py360
3 files changed, 267 insertions, 96 deletions
diff --git a/CHANGELOG b/CHANGELOG
index e5d2fe7..ed406cc 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -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