Add unit testing for the mailbox acls parsing functionality
authorPlamen Dimitrov <plamen.dimitrov@intra2net.com>
Tue, 10 Jul 2012 09:15:52 +0000 (11:15 +0200)
committerPlamen Dimitrov <plamen.dimitrov@intra2net.com>
Tue, 10 Jul 2012 09:15:52 +0000 (11:15 +0200)
file_iterator.py
restore_mail_inject.py
unit_tester.py [new file with mode: 0644]

index 5cdc5c0..38a59dc 100644 (file)
@@ -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]
index 627ba41..a4dace9 100644 (file)
@@ -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 (file)
index 0000000..8c77d1d
--- /dev/null
@@ -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