Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions Lib/slapdtest/_slapdtest.py
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,6 @@ def _find_commands(self):
self.PATH_LDAPDELETE = self._find_command('ldapdelete')
self.PATH_LDAPMODIFY = self._find_command('ldapmodify')
self.PATH_LDAPWHOAMI = self._find_command('ldapwhoami')
self.PATH_SLAPADD = self._find_command('slapadd')

self.PATH_SLAPD = os.environ.get('SLAPD', None)
if not self.PATH_SLAPD:
Expand All @@ -276,7 +275,7 @@ def _find_command(self, cmd, in_sbin=False):
if command is None:
raise ValueError(
"Command '{}' not found. Set the {} environment variable to "
"override slapdtest's search path.".format(cmd, var_name)
"override slapdtest's search path: {}.".format(cmd, var_name, path)
)
return command

Expand Down Expand Up @@ -347,6 +346,7 @@ def gen_config(self):
'cafile': self.cafile,
'servercert': self.servercert,
'serverkey': self.serverkey,
'slapd_path': self.SBIN_PATH,
}
return self.slapd_conf_template % config_dict

Expand Down Expand Up @@ -407,12 +407,17 @@ def _start_slapd(self):
'-F', self._slapd_conf,
'-h', ' '.join(urls),
]
stderr = None
if self._log.isEnabledFor(logging.DEBUG):
slapd_args.extend(['-d', '-1'])
stderr = os.open(os.path.join(self.testrundir, 'slapd.log'), os.O_WRONLY|os.O_CREAT)
else:
slapd_args.extend(['-d', '0'])
self._log.info('starting slapd: %r', ' '.join(slapd_args))
self._proc = subprocess.Popen(slapd_args)
self._proc = subprocess.Popen(slapd_args, stderr=stderr)
if stderr is not None:
os.close(stderr)
stderr = None
# Waits until the LDAP server socket is open, or slapd crashed
deadline = time.monotonic() + 10
# no cover to avoid spurious coverage changes, see
Expand Down Expand Up @@ -452,15 +457,16 @@ def start(self):
self._proc.pid, self.ldap_uri, self.ldapi_uri
)

def stop(self):
def stop(self, cleanup=True):
"""
Stops the slapd server, and waits for it to terminate and cleans up
"""
if self._proc is not None:
self._log.debug('stopping slapd with pid %d', self._proc.pid)
self._proc.terminate()
self.wait()
self._cleanup_rundir()
if cleanup:
self._cleanup_rundir()
atexit.unregister(self.stop)

def restart(self):
Expand Down Expand Up @@ -508,14 +514,17 @@ def _cli_auth_args(self):

# no cover to avoid spurious coverage changes
def _cli_popen(self, ldapcommand, extra_args=None, ldap_uri=None,
stdin_data=None): # pragma: no cover
stdin_data=None, tool=None): # pragma: no cover
if ldap_uri is None:
ldap_uri = self.default_ldap_uri

if ldapcommand.split("/")[-1].startswith("ldap"):
args = [ldapcommand, '-H', ldap_uri] + self._cli_auth_args()
else:
args = [ldapcommand, '-F', self._slapd_conf]
if tool:
args = [ldapcommand, '-T', tool, '-F', self._slapd_conf]
else:
args = [ldapcommand, '-F', self._slapd_conf]

args += (extra_args or [])

Expand Down Expand Up @@ -574,17 +583,18 @@ def slapadd(self, ldif, extra_args=None):
Runs slapadd on this slapd instance, passing it the ldif content
"""
self._cli_popen(
self.PATH_SLAPADD,
self.PATH_SLAPD,
stdin_data=ldif.encode("utf-8") if ldif else None,
extra_args=extra_args,
tool='add'
)

def __enter__(self):
self.start()
return self

def __exit__(self, exc_type, exc_value, traceback):
self.stop()
self.stop(exc_type is None)


class SlapdTestCase(unittest.TestCase):
Expand Down Expand Up @@ -613,4 +623,4 @@ def setUpClass(cls):

@classmethod
def tearDownClass(cls):
cls.server.stop()
cls.server.stop(False)