summaryrefslogtreecommitdiff
path: root/Mailman/testing
diff options
context:
space:
mode:
Diffstat (limited to 'Mailman/testing')
-rw-r--r--Mailman/testing/base.py42
-rw-r--r--Mailman/testing/emailbase.py9
-rw-r--r--Mailman/testing/test_handlers.py7
-rw-r--r--Mailman/testing/test_membership.py26
-rw-r--r--Mailman/testing/test_security_mgr.py42
5 files changed, 65 insertions, 61 deletions
diff --git a/Mailman/testing/base.py b/Mailman/testing/base.py
index cb0a78819..a61740956 100644
--- a/Mailman/testing/base.py
+++ b/Mailman/testing/base.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2007 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -18,6 +18,8 @@
"""Test base class which handles creating and deleting a test list."""
import os
+import grp
+import pwd
import stat
import shutil
import difflib
@@ -25,19 +27,25 @@ import tempfile
import unittest
from cStringIO import StringIO
+from sqlalchemy.orm import clear_mappers
from Mailman import MailList
from Mailman import Utils
from Mailman.bin import rmlist
from Mailman.configuration import config
+from Mailman.database.dbcontext import dbcontext
NL = '\n'
-PERMISSIONS = stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH
class TestBase(unittest.TestCase):
def _configure(self, fp):
+ # Make sure that we don't pollute the real database with our test
+ # mailing list.
+ test_engine_url = 'sqlite:///' + self._dbfile
+ print >> fp, 'SQLALCHEMY_ENGINE_URL = "%s"' % test_engine_url
+ config.SQLALCHEMY_ENGINE_URL = test_engine_url
print >> fp, 'add_domain("example.com", "www.example.com")'
# Only add this domain once to the current process
if 'example.com' not in config.domains:
@@ -54,24 +62,37 @@ class TestBase(unittest.TestCase):
raise self.failureException(fp.getvalue())
def setUp(self):
+ mailman_uid = pwd.getpwnam(config.MAILMAN_USER).pw_uid
+ mailman_gid = grp.getgrnam(config.MAILMAN_GROUP).gr_gid
# Write a temporary configuration file, but allow for subclasses to
- # add additional data.
- fd, self._config = tempfile.mkstemp(suffix='.cfg')
+ # add additional data. Make sure the config and db files, which
+ # mkstemp creates, has the proper ownership and permissions.
+ fd, self._config = tempfile.mkstemp(dir=config.DATA_DIR, suffix='.cfg')
os.close(fd)
+ os.chmod(self._config, 0440)
+ os.chown(self._config, mailman_uid, mailman_gid)
+ fd, self._dbfile = tempfile.mkstemp(dir=config.DATA_DIR, suffix='.db')
+ os.close(fd)
+ os.chmod(self._dbfile, 0660)
+ os.chown(self._dbfile, mailman_uid, mailman_gid)
fp = open(self._config, 'w')
try:
self._configure(fp)
finally:
fp.close()
- os.chmod(self._config, PERMISSIONS)
+ # Be sure to close the connection to the current database, and then
+ # reconnect to the new temporary SQLite database. Otherwise we end up
+ # with turds in the main database and our qrunner subprocesses won't
+ # find the mailing list. Because our global config object's
+ # SQLALCHEMY_ENGINE_URL variable has already been updated, the
+ # connect() call will open the database file the qrunners will be
+ # rendezvousing on.
+ dbcontext.close()
+ clear_mappers()
+ dbcontext.connect()
mlist = MailList.MailList()
mlist.Create('_xtest@example.com', 'owner@example.com', 'xxxxx')
mlist.Save()
- # We need to reload the mailing list to ensure that the member
- # adaptors are all sync'd up. This isn't strictly necessary with the
- # OldStyleMemberships adaptor, but it may be required for other
- # adaptors
- mlist.Load()
# This leaves the list in a locked state
self._mlist = mlist
@@ -80,3 +101,4 @@ class TestBase(unittest.TestCase):
rmlist.delete_list(self._mlist.fqdn_listname, self._mlist,
archives=True, quiet=True)
os.unlink(self._config)
+ os.unlink(self._dbfile)
diff --git a/Mailman/testing/emailbase.py b/Mailman/testing/emailbase.py
index 3421efb4b..e033195de 100644
--- a/Mailman/testing/emailbase.py
+++ b/Mailman/testing/emailbase.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2007 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -56,6 +56,10 @@ class EmailBase(TestBase):
TestBase._configure(self, fp)
print >> fp, 'SMTPPORT =', TESTPORT
config.SMTPPORT = TESTPORT
+ # Don't go nuts on mailmanctl restarts. If a qrunner fails once, it
+ # will keep failing.
+ print >> fp, 'MAX_RESTARTS = 1'
+ config.MAX_RESTARTS = 1
def setUp(self):
TestBase.setUp(self)
@@ -86,7 +90,7 @@ class EmailBase(TestBase):
time.sleep(3)
except socket.error, e:
# IWBNI e had an errno attribute
- if e[0] == errno.ECONNREFUSED:
+ if e[0] in (errno.ECONNREFUSED, errno.ETIMEDOUT):
break
else:
raise
@@ -105,6 +109,7 @@ class EmailBase(TestBase):
MSGTEXT = None
except asyncore.ExitNow:
pass
+ asyncore.close_all()
return MSGTEXT
finally:
self._mlist.Lock()
diff --git a/Mailman/testing/test_handlers.py b/Mailman/testing/test_handlers.py
index 09ca56c29..2e964389e 100644
--- a/Mailman/testing/test_handlers.py
+++ b/Mailman/testing/test_handlers.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2007 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -30,6 +30,7 @@ from email.Generator import Generator
from Mailman import Errors
from Mailman import Message
from Mailman import Version
+from Mailman import passwords
from Mailman.MailList import MailList
from Mailman.Queue.Switchboard import Switchboard
from Mailman.configuration import config
@@ -57,8 +58,8 @@ from Mailman.Handlers import ToUsenet
-def password(plaintext):
- return sha.new(plaintext).hexdigest()
+def password(cleartext):
+ return passwords.make_secret(cleartext, 'ssha')
diff --git a/Mailman/testing/test_membership.py b/Mailman/testing/test_membership.py
index b98e1b187..ed8ebb1f4 100644
--- a/Mailman/testing/test_membership.py
+++ b/Mailman/testing/test_membership.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2007 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -24,6 +24,7 @@ import unittest
from Mailman import MailList
from Mailman import MemberAdaptor
from Mailman import Utils
+from Mailman import passwords
from Mailman.Errors import NotAMemberError
from Mailman.UserDesc import UserDesc
from Mailman.configuration import config
@@ -31,6 +32,11 @@ from Mailman.testing.base import TestBase
+def password(cleartext):
+ return passwords.make_secret(cleartext, 'ssha')
+
+
+
class TestNoMembers(TestBase):
def test_no_member(self):
eq = self.assertEqual
@@ -78,9 +84,10 @@ class TestNoMembers(TestBase):
class TestMembers(TestBase):
def setUp(self):
TestBase.setUp(self)
+ self._member_password = password('xxXXxx')
self._mlist.addNewMember('person@dom.ain',
digest=0,
- password='xxXXxx',
+ password=self._member_password,
language='xx',
realname='A. Nice Person')
@@ -95,7 +102,7 @@ class TestMembers(TestBase):
eq(mlist.getMemberCPAddress('person@dom.ain'), 'person@dom.ain')
eq(mlist.getMemberCPAddresses(('person@dom.ain', 'noperson@dom.ain')),
['person@dom.ain', None])
- eq(mlist.getMemberPassword('person@dom.ain'), 'xxXXxx')
+ eq(mlist.getMemberPassword('person@dom.ain'), self._member_password)
eq(mlist.getMemberLanguage('person@dom.ain'), 'en')
eq(mlist.getMemberOption('person@dom.ain', config.Digests), 0)
eq(mlist.getMemberOption('person@dom.ain', config.AcknowledgePosts), 0)
@@ -106,7 +113,7 @@ class TestMembers(TestBase):
mlist = self._mlist
self.failIf(mlist.authenticateMember('person@dom.ain', 'xxx'))
self.assertEqual(mlist.authenticateMember('person@dom.ain', 'xxXXxx'),
- 'xxXXxx')
+ self._member_password)
def test_remove_member(self):
eq = self.assertEqual
@@ -161,7 +168,7 @@ class TestMembers(TestBase):
eq(mlist.getMemberCPAddress('nice@dom.ain'), 'nice@dom.ain')
eq(mlist.getMemberCPAddresses(('nice@dom.ain', 'nonice@dom.ain')),
['nice@dom.ain', None])
- eq(mlist.getMemberPassword('nice@dom.ain'), 'xxXXxx')
+ eq(mlist.getMemberPassword('nice@dom.ain'), self._member_password)
eq(mlist.getMemberLanguage('nice@dom.ain'), 'en')
eq(mlist.getMemberOption('nice@dom.ain', config.Digests), 0)
eq(mlist.getMemberOption('nice@dom.ain', config.AcknowledgePosts), 0)
@@ -188,9 +195,10 @@ class TestMembers(TestBase):
def test_set_password(self):
eq = self.assertEqual
mlist = self._mlist
- mlist.setMemberPassword('person@dom.ain', 'yyYYyy')
- eq(mlist.getMemberPassword('person@dom.ain'), 'yyYYyy')
- eq(mlist.authenticateMember('person@dom.ain', 'yyYYyy'), 'yyYYyy')
+ new_password = password('yyYYyy')
+ mlist.setMemberPassword('person@dom.ain', new_password)
+ eq(mlist.getMemberPassword('person@dom.ain'), new_password)
+ eq(mlist.authenticateMember('person@dom.ain', 'yyYYyy'), new_password)
self.failIf(mlist.authenticateMember('person@dom.ain', 'xxXXxx'))
def test_set_language(self):
@@ -200,7 +208,7 @@ class TestMembers(TestBase):
odesc = config.LC_DESCRIPTIONS.copy()
try:
config.add_language('xx', 'Xxian', 'utf-8')
- self._mlist.available_languages.append('xx')
+ self._mlist.add_language('xx')
self._mlist.setMemberLanguage('person@dom.ain', 'xx')
self.assertEqual(self._mlist.getMemberLanguage('person@dom.ain'),
'xx')
diff --git a/Mailman/testing/test_security_mgr.py b/Mailman/testing/test_security_mgr.py
index a8b056464..543330aed 100644
--- a/Mailman/testing/test_security_mgr.py
+++ b/Mailman/testing/test_security_mgr.py
@@ -1,4 +1,4 @@
-# Copyright (C) 2001-2006 by the Free Software Foundation, Inc.
+# Copyright (C) 2001-2007 by the Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
@@ -24,23 +24,19 @@ import errno
import Cookie
import unittest
-try:
- import crypt
-except ImportError:
- crypt = None
-
# Don't use cStringIO because we're going to inherit
from StringIO import StringIO
from Mailman import Errors
from Mailman import Utils
+from Mailman import passwords
from Mailman.configuration import config
from Mailman.testing.base import TestBase
-def password(plaintext):
- return sha.new(plaintext).hexdigest()
+def password(cleartext):
+ return passwords.make_secret(cleartext, 'ssha')
@@ -130,34 +126,6 @@ class TestAuthenticate(TestBase):
self.assertEqual(self._mlist.Authenticate(
[config.AuthListAdmin], 'xxxxxx'), config.UnAuthorized)
- def test_list_admin_upgrade(self):
- eq = self.assertEqual
- mlist = self._mlist
- mlist.password = md5.new('ssSSss').digest()
- eq(mlist.Authenticate(
- [config.AuthListAdmin], 'ssSSss'), config.AuthListAdmin)
- eq(mlist.password, password('ssSSss'))
- # Test crypt upgrades if crypt is supported
- if crypt:
- mlist.password = crypt.crypt('rrRRrr', 'zc')
- eq(self._mlist.Authenticate(
- [config.AuthListAdmin], 'rrRRrr'), config.AuthListAdmin)
- eq(mlist.password, password('rrRRrr'))
-
- def test_list_admin_oldstyle_unauth(self):
- eq = self.assertEqual
- mlist = self._mlist
- mlist.password = md5.new('ssSSss').digest()
- eq(mlist.Authenticate(
- [config.AuthListAdmin], 'xxxxxx'), config.UnAuthorized)
- eq(mlist.password, md5.new('ssSSss').digest())
- # Test crypt upgrades if crypt is supported
- if crypt:
- mlist.password = crypted = crypt.crypt('rrRRrr', 'zc')
- eq(self._mlist.Authenticate(
- [config.AuthListAdmin], 'xxxxxx'), config.UnAuthorized)
- eq(mlist.password, crypted)
-
def test_list_moderator(self):
self._mlist.mod_password = password('mmMMmm')
self.assertEqual(self._mlist.Authenticate(
@@ -165,7 +133,7 @@ class TestAuthenticate(TestBase):
def test_user(self):
mlist = self._mlist
- mlist.addNewMember('aperson@dom.ain', password='nosrepa')
+ mlist.addNewMember('aperson@dom.ain', password=password('nosrepa'))
self.assertEqual(mlist.Authenticate(
[config.AuthUser], 'nosrepa', 'aperson@dom.ain'), config.AuthUser)