diff --git a/test/boothtestenv.py.in b/test/boothtestenv.py.in index 26a40cb..8a23615 100644 --- a/test/boothtestenv.py.in +++ b/test/boothtestenv.py.in @@ -1,75 +1,77 @@ import os import subprocess import time import tempfile import unittest from assertions import BoothAssertions from utils import use_single_instance class BoothTestEnvironment(unittest.TestCase, BoothAssertions): abs_test_src_path = os.path.abspath('TEST_SRC_DIR') example_config_path = os.path.join(abs_test_src_path, '../conf/booth.conf.example') abs_test_build_path = os.path.abspath('TEST_BUILD_DIR') boothd_path = os.path.join(abs_test_build_path, '../src/boothd') def setUp(self): if not self._testMethodName.startswith('test_'): raise RuntimeError("unexpected test method name: " + self._testMethodName) self.test_name = self._testMethodName[5:] self.test_path = os.path.join(self.test_run_path, self.test_name) os.makedirs(self.test_path) # Give all users permisions for temp directory so boothd running as "hacluster" # can delete the lock file if os.geteuid() == 0: os.chmod(self.test_path, 0o777) # It's not good idea to kill other instancies so call following function # only if single_instance mode is used if use_single_instance(): self.ensure_boothd_not_running() def ensure_boothd_not_running(self): # Need to redirect STDERR in case we're not root, in which - # case netstat's -p option causes a warning. However we only + # case netstat's -p option causes a warning (ss doesn't). However we only # want to kill boothd processes which we own; -p will list the # pid for those and only those, which is exactly what we want # here. - subprocess.call("netstat -tpln 2>&1 | perl -lne 'm,LISTEN\s+(\d+)/boothd, and kill 15, $1'", shell=True) + subprocess.call("(netstat -tlnp || ss -tlnp) 2>&1 | " + + "perl -lne '(m,LISTEN\s+(\d+)/boothd, || /\"boothd\".*pid=(\d+)/) and kill 15, $1'", + shell=True) def get_tempfile(self, identity): tf = tempfile.NamedTemporaryFile( prefix='%s.%d.' % (identity, time.time()), dir=self.test_path, delete=False ) return tf.name def init_log(self): self.log_file = self.get_tempfile('log') os.putenv('HA_debugfile', self.log_file) # See cluster-glue/lib/clplumbing/cl_log.c def read_log(self): if not os.path.exists(self.log_file): return '' l = open(self.log_file) msgs = ''.join(l.readlines()) l.close() return msgs def check_return_code(self, pid, return_code, expected_exitcode): if return_code is None: print("pid %d still running" % pid) if expected_exitcode is not None: self.fail("expected exit code %d, not long-running process" % expected_exitcode) else: print("pid %d exited with code %d" % (pid, return_code)) if expected_exitcode is None: msg = "should not exit" else: msg = "should exit with code %s" % expected_exitcode msg += "\nLog follows (see %s)" % self.log_file msg += "\nN.B. expect mlockall/setscheduler errors when running tests non-root" msg += "\n-----------\n%s" % self.read_log() self.assertEqual(return_code, expected_exitcode, msg)