diff -r b571d2d32971 -r 72d7feeb071e server/test/unittest_ldapuser.py --- a/server/test/unittest_ldapuser.py Tue Jan 25 09:51:47 2011 +0100 +++ b/server/test/unittest_ldapuser.py Tue Jan 25 09:52:49 2011 +0100 @@ -17,7 +17,12 @@ # with CubicWeb. If not, see . """cubicweb.server.sources.ldapusers unit and functional tests""" -import socket +import os +import shutil +import time +from os.path import abspath, join, exists +import subprocess +from socket import socket, error as socketerror from logilab.common.testlib import TestCase, unittest_main, mock_object from cubicweb.devtools.testlib import CubicWebTC @@ -25,30 +30,17 @@ from cubicweb.server.sources.ldapuser import * -if '17.1' in socket.gethostbyname('ldap1'): - SYT = 'syt' - SYT_EMAIL = 'Sylvain Thenault' - ADIM = 'adim' - CONFIG = u'''host=ldap1 -user-base-dn=ou=People,dc=logilab,dc=fr +SYT = 'syt' +SYT_EMAIL = 'Sylvain Thenault' +ADIM = 'adim' +CONFIG = u'''host=%s +user-base-dn=ou=People,dc=cubicweb,dc=test user-scope=ONELEVEL user-classes=top,posixAccount user-login-attr=uid user-default-group=users user-attrs-map=gecos:email,uid:login ''' -else: - SYT = 'sthenault' - SYT_EMAIL = 'sylvain.thenault@logilab.fr' - ADIM = 'adimascio' - CONFIG = u'''host=ldap1 -user-base-dn=ou=People,dc=logilab,dc=net -user-scope=ONELEVEL -user-classes=top,OpenLDAPperson -user-login-attr=uid -user-default-group=users -user-attrs-map=mail:email,uid:login -''' def nopwd_authenticate(self, session, login, password): @@ -71,15 +63,21 @@ return self.extid2eid(user['dn'], 'CWUser', session) def setUpModule(*args): + create_slapd_configuration(LDAPUserSourceTC.config) global repo - LDAPUserSourceTC._init_repo() - repo = LDAPUserSourceTC.repo - add_ldap_source(LDAPUserSourceTC.cnx) + try: + LDAPUserSourceTC._init_repo() + repo = LDAPUserSourceTC.repo + add_ldap_source(LDAPUserSourceTC.cnx) + except: + terminate_slapd() + raise def tearDownModule(*args): global repo repo.shutdown() del repo + terminate_slapd() def add_ldap_source(cnx): cnx.request().create_entity('CWSource', name=u'ldapuser', type=u'ldapuser', @@ -93,6 +91,55 @@ # check we get some users from ldap assert len(rset) > 1 +def create_slapd_configuration(config): + global slapd_process, CONFIG + basedir = join(config.apphome, "ldapdb") + slapdconf = join(config.apphome, "slapd.conf") + if not exists(basedir): + os.makedirs(basedir) + # fill ldap server with some data + ldiffile = join(config.apphome, "ldap_test.ldif") + print "Initing ldap database" + cmdline = "/usr/sbin/slapadd -f %s -l %s -c" % (slapdconf, ldiffile) + subprocess.call(cmdline, shell=True) + + + #ldapuri = 'ldapi://' + join(basedir, "ldapi").replace('/', '%2f') + for port in range(9000, 9100): + try: + socket().bind(('localhost', port)) + except socketerror, e: + if e.errno == 98: # Address already in use + pass + else: + raise + else: + break + else: + raise Exception("Can't find a free TCP port on localhost") + + host = 'localhost:%s' % port + ldapuri = 'ldap://%s' % host + cmdline = ["/usr/sbin/slapd", "-f", slapdconf, "-h", ldapuri, "-d", "0"] + print "Starting slapd on", ldapuri + slapd_process = subprocess.Popen(cmdline) + time.sleep(0.2) + if slapd_process.poll() is None: + print "slapd started with pid %s" % slapd_process.pid + else: + raise EnvironmentError('Cannot start slapd with cmdline="%s" (from directory "%s")' % + (" ".join(cmdline), os.getcwd())) + CONFIG = CONFIG % host + +def terminate_slapd(): + global slapd_process + if slapd_process.returncode is None: + print "terminating slapd" + slapd_process.terminate() + slapd_process.wait() + print "DONE" + + del slapd_process class LDAPUserSourceTC(CubicWebTC): @@ -117,7 +164,8 @@ def test_base(self): # check a known one - e = self.sexecute('CWUser X WHERE X login %(login)s', {'login': SYT}).get_entity(0, 0) + rset = self.sexecute('CWUser X WHERE X login %(login)s', {'login': SYT}) + e = rset.get_entity(0, 0) self.assertEqual(e.login, SYT) e.complete() self.assertEqual(e.creation_date, None)