From 2800a71a28362cd2ec73fa3c8a2bae56a3ce09d5 Mon Sep 17 00:00:00 2001 From: Sebastian Spaeth Date: Fri, 24 Feb 2012 09:39:39 +0100 Subject: [PATCH] tests: Add "create email test" This is the first test that actually creates a (local) email and syncs. We check the result of the sync operation, to see if the server has actually been assigning a proper UID to the email and bail out if not. This test therefore excercises our ability to properly detect the new UID of an APPENDED email. Obviously we still need some IMAP<->IMAP tests too, but since this is the same codepath being used for APPENDs in that case, it could also help to detect instabilities there. In order to get this test in, the OLITestLib got a few new helper functions: - delete_maildir - create_mail - get_maildir_uids The test passes here. I invoke it via: python -m unittest test.tests.test_01_basic.TestBasicFunctions.test_04_createmail or run python setup.py test, to run the whole suite. Signed-off-by: Sebastian Spaeth --- test/OLItest/TestRunner.py | 52 +++++++++++++++++++++++++++++++++++++ test/tests/test_01_basic.py | 26 ++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/test/OLItest/TestRunner.py b/test/OLItest/TestRunner.py index 7a2bb51..1ce3b5f 100644 --- a/test/OLItest/TestRunner.py +++ b/test/OLItest/TestRunner.py @@ -22,12 +22,15 @@ import sys import shutil import subprocess import tempfile +import random +random.seed() try: from configparser import SafeConfigParser except ImportError: # python 2 from ConfigParser import SafeConfigParser from . import default_conf + class OLITestLib(): cred_file = None testdir = None @@ -179,6 +182,36 @@ class OLITestLib(): if e.errno != 17: # 'already exists' is ok. raise + @classmethod + def delete_maildir(cls, folder): + """Delete maildir 'folder' in our test maildir + + Does not fail if not existing""" + assert cls.testdir != None + maildir = os.path.join(cls.testdir, 'mail', folder) + shutil.rmtree(maildir, ignore_errors=True) + + @classmethod + def create_mail(cls, folder, mailfile=None, content=None): + """Create a mail in maildir 'folder'/new + + Use default mailfilename if not given. + Use some default content if not given""" + assert cls.testdir != None + while True: # Loop till we found a unique filename + mailfile = '{}:2,'.format(random.randint(0,999999999)) + mailfilepath = os.path.join(cls.testdir, 'mail', + folder, 'new', mailfile) + if not os.path.isfile(mailfilepath): + break + with open(mailfilepath,"wb") as mailf: + mailf.write(b'''From: test +Subject: Boo +Date: 1 Jan 1980 +To: test@offlineimap.org + +Content here.''') + @classmethod def count_maildir_mails(cls, folder): """Returns the number of mails in maildir 'folder' @@ -196,3 +229,22 @@ class OLITestLib(): if dirpath.endswith(('/cur', '/new')): mails += len(files) return boxes, mails + + # find UID in a maildir filename + re_uidmatch = re.compile(',U=(\d+)') + + @classmethod + def get_maildir_uids(cls, folder): + """Returns a list of maildir mail uids, 'None' if no valid uid""" + assert cls.testdir != None + mailfilepath = os.path.join(cls.testdir, 'mail', folder) + assert os.path.isdir(mailfilepath) + ret = [] + for dirpath, dirs, files in os.walk(mailfilepath): + if not dirpath.endswith((os.path.sep + 'new', os.path.sep + 'cur')): + continue # only /new /cur are interesting + for file in files: + m = cls.re_uidmatch.search(file) + uid = m.group(1) if m else None + ret.append(uid) + return ret diff --git a/test/tests/test_01_basic.py b/test/tests/test_01_basic.py index 6cda54e..aadec72 100644 --- a/test/tests/test_01_basic.py +++ b/test/tests/test_01_basic.py @@ -31,6 +31,7 @@ def setUpModule(): def tearDownModule(): logging.info("Tear Down test module") + # comment out next line to keep testdir after test runs. TODO: make nicer OLITestLib.delete_test_dir() #Stuff that can be used @@ -80,7 +81,7 @@ class TestBasicFunctions(unittest.TestCase): #logging.warn("%s %s "% (code, res)) self.assertEqual(res, "") boxes, mails = OLITestLib.count_maildir_mails('') - self.assertTrue((boxes, mails)==(2,0), msg="Expected 2 folders and 0" + self.assertTrue((boxes, mails)==(2,0), msg="Expected 2 folders and 0 " "mails, but sync led to {} folders and {} mails".format( boxes, mails)) @@ -101,4 +102,27 @@ class TestBasicFunctions(unittest.TestCase): self.assertEqual(mismatch, True, msg="Mismatching nametrans rules did " "NOT trigger an 'infinite folder generation' error. Output was:\n" "{}".format(res)) + # Write out default config file again + OLITestLib.write_config_file() + def test_04_createmail(self): + """Create mail in OLItest 1, sync, wipe folder sync + + Currently, this will mean the folder will be recreated + locally. At some point when remote folder deletion is + implemented, this behavior will change.""" + OLITestLib.delete_remote_testfolders() + OLITestLib.create_maildir('INBOX.OLItest') + OLITestLib.create_mail('INBOX.OLItest') + code, res = OLITestLib.run_OLI() + #logging.warn("%s %s "% (code, res)) + self.assertEqual(res, "") + boxes, mails = OLITestLib.count_maildir_mails('') + self.assertTrue((boxes, mails)==(1,1), msg="Expected 1 folders and 1 " + "mails, but sync led to {} folders and {} mails".format( + boxes, mails)) + # The local Mail should have been assigned a proper UID now, check! + uids = OLITestLib.get_maildir_uids('INBOX.OLItest') + self.assertFalse (None in uids, msg = "All mails should have been "+ \ + "assigned the IMAP's UID number, but {} messages had no valid ID "\ + .format(len([None for x in uids if x==None])))