# test_remctl.py -- Test suite for remctl Python bindings # # Written by Russ Allbery # Copyright 2008 Board of Trustees, Leland Stanford Jr. University # # See LICENSE for licensing terms. import remctl import errno, os, re, signal, time, unittest def needs_kerberos(func): """unittest test method decorator to skip tests requiring Kerberos Used to annotate test methods that require a Kerberos configuration. Ignores failures in the annotated test method. """ def wrapper(*args, **kw): if not os.path.isfile('data/test.principal'): return True else: return func(*args, **kw) wrapper.__name__ = func.__name__ wrapper.__doc__ = func.__doc__ return wrapper class TestRemctl(unittest.TestCase): def get_principal(self): file = open('data/test.principal', 'r') principal = file.read().rstrip() file.close() return principal @needs_kerberos def start_remctld(self): try: os.remove('data/pid') except OSError, (error, strerror): if error != errno.ENOENT: raise principal = self.get_principal() child = os.fork() if child == 0: output = open('data/test.output', 'w') os.dup2(output.fileno(), 1) os.chdir('@abs_top_srcdir@/tests') os.execl('@abs_top_builddir@/server/remctld', 'remctld', '-m', '-p', '14373', '-s', principal, '-f', 'data/conf-simple', '-P', '@abs_top_builddir@/tests/data/pid', '-d', '-S', '-F', '-k', '@abs_top_builddir@/tests/data/test.keytab') if not os.path.isfile('data/pid'): time.sleep(1) def stop_remctld(self): try: file = open('data/pid', 'r') pid = file.read().rstrip() file.close() os.kill(int(pid), signal.SIGTERM) child, status = os.waitpid(int(pid), 0) except IOError, (error, strerror): if error != errno.ENOENT: raise @needs_kerberos def run_kinit(self): os.environ['KRB5CCNAME'] = 'data/test.cache' self.principal = self.get_principal() commands = ('kinit -k -t data/test.keytab ' + self.principal, 'kinit -t data/test.keytab ' + self.principal, 'kinit -k -K data/test.keytab ' + self.principal) for command in commands: if os.system(command + ' >/dev/null