From 79c28101de6528f24b9fa9198b002326f7c91524 Mon Sep 17 00:00:00 2001 From: Plamen Dimitrov Date: Tue, 10 Jul 2012 11:15:52 +0200 Subject: [PATCH] Add unit testing for the mailbox acls parsing functionality --- file_iterator.py | 15 ++++++---- restore_mail_inject.py | 4 +- unit_tester.py | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 unit_tester.py diff --git a/file_iterator.py b/file_iterator.py index 5cdc5c0..38a59dc 100644 --- a/file_iterator.py +++ b/file_iterator.py @@ -52,18 +52,21 @@ class FileIterator: with open(mboxlistfile, 'r') as acl_file: for line in acl_file: acls = {} - linedata = MBOXFILE_LINE.match(line).groups() - if len(linedata) == 0: + try: + linedata = MBOXFILE_LINE.match(line).groups() + except AttributeError: logging.warning("Illegal line in mailbox list dump: %s", line) continue key = linedata[0] aclstr = linedata[1] - + # loop through acl rights string and build dictionary of users and rights while(aclstr != ""): - acldata = ACL_STRING.match(aclstr).groups() - if len(acldata) == 0: - logging.error("Illegal acl string in mailbox list dump: %s", line) + try: + acldata = ACL_STRING.match(aclstr).groups() + except AttributeError: + logging.warning("Illegal acl string in mailbox list dump: %s", line) + aclstr = "" continue aclstr = acldata[2] acls[acldata[0]] = acldata[1] diff --git a/restore_mail_inject.py b/restore_mail_inject.py index 627ba41..a4dace9 100644 --- a/restore_mail_inject.py +++ b/restore_mail_inject.py @@ -33,7 +33,7 @@ def main(): session = MailIterator(args.user) else: session = MailIterator(args.user) - #session = MailIterator("/var/imap/socket/imap", "cyrus", "geheim") + #session = MailIterator("/var/imap/socket/imap", "cyrus", "geheim") storage = FileIterator() # retrieve mailbox list from the mailbox list file @@ -116,7 +116,7 @@ def prepare_logger(): formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') console.setFormatter(formatter) default_logger.addHandler(console) - + # add a handler for warnings counting warnings_handler = WarningsHandler() warnings_handler.setLevel(LOG_UNCLEAN_EXIT_LEVEL) diff --git a/unit_tester.py b/unit_tester.py new file mode 100644 index 0000000..8c77d1d --- /dev/null +++ b/unit_tester.py @@ -0,0 +1,73 @@ +''' +restore-mail-inject.py - Tool to inject mails via IMAP + +Copyright (c) 2012 Intra2net AG +''' + +import unittest +import os +from file_iterator import FileIterator + +class FileContentsParse(unittest.TestCase): + """Test the retrieved acls from a dummy mailbox list file""" + + # class attributes + # FileIterator instance to be tested for parsing + file_iter = None + # dummy filename to be used for parsing the acls + dummy_filename = None + # dummy file descriptor to be used for parsing the acls + dummy_file = None + + # wrong naming conventions are due to python unittest library requirement + def setUp(self): + """Prepares the testing confitions.""" + self.file_iter = FileIterator() + self.dummy_filename = "test_acls.dump" + self.dummy_file = open(self.dummy_filename, "w") + self.dummy_file.write("user.00schneider\t0 default 00schneider\tlrswipkxtecda\t\n" + "user.00schneider.ibx_poped\t0 default 00schneider\tlrswipkxtecda\t\n" + "user.00schneider.ibx_sub\t0 default 00schneider\tlrswpkxtecda\t\n" + "user.abrus\t0 default abrus\tlrswipkxtecda\t\n" + "user.abrus.Aufgaben\t0 default abrus\tlrswipkxtecda\tabrus2\tlrswikxtecda\t\n" + "user.abrus.Entw&APw-rfe\t0 default abrus\tlrswipkxtecda\t\n" + "user.abrus.Gesendete Objekte\t0 default abrus\tlrswipkxtecda\t\n" + "user.abrus.Junk-E-Mail\t0 default abrus\tlrswipkxtecda\t\n" + "user.abrus.Kalender\t0 default abrus\tlrswipkxtecda\t\n" + "user.abrus.Kontakte\t0 default abrus\tlrswipkxtecda\t\n" + "user.abrus.Notizen\t0 default abrus\tlrswipkxtecda\t\n" + "user.abrus.foobar\t0 default abrus\tlrswipkxtecda\t\n") + self.dummy_file.close() + + # wrong naming conventions are due to python unittest library requirement + def tearDown(self): + """Clean up the testing conditions""" + os.unlink(self.dummy_filename) + + def test_mboxlist_firstline(self): + """Test whether first line was parsed correctly.""" + parsed_acls = self.file_iter.load_mailbox_list(self.dummy_filename) + self.assertIn("user.00schneider", parsed_acls) + self.assertIn("00schneider", parsed_acls["user.00schneider"]) + self.assertEqual(parsed_acls["user.00schneider"]["00schneider"], "lrswipkxtecda", "Wront acls were parsed for a user.") + + def test_mboxlist_totals(self): + """Test whether there are missing parsed lines, mailboxs, and users.""" + parsed_acls = self.file_iter.load_mailbox_list(self.dummy_filename) + self.assertEqual(len(parsed_acls), 12) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 2) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + self.assertEqual(len(parsed_acls.popitem()[1]), 1) + + +if __name__ == '__main__': + unittest.main() \ No newline at end of file -- 1.7.1