summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2014-12-22 11:10:15 +0000
committerGerrit Code Review <review@openstack.org>2014-12-22 11:10:15 +0000
commit4cfb0e657b88395bc0c8c5e28f4a03dba21ee1a9 (patch)
tree071e3a9a8f2232b8b89019bd107a5b8b3944ba8b
parent22671745b7f6ca22467cd84b520df18dd6c1f753 (diff)
parent686682699630b4a4366894e15467da82a36d1100 (diff)
downloadoslo-incubator-4cfb0e657b88395bc0c8c5e28f4a03dba21ee1a9.tar.gz
Merge "ServiceRestartTest: make it more resilient" into stable/juno
-rw-r--r--tests/unit/test_service.py83
1 files changed, 36 insertions, 47 deletions
diff --git a/tests/unit/test_service.py b/tests/unit/test_service.py
index 8d469cb2..97bc3203 100644
--- a/tests/unit/test_service.py
+++ b/tests/unit/test_service.py
@@ -71,6 +71,36 @@ class ServiceWithTimer(service.Service):
class ServiceTestBase(test_base.BaseTestCase):
"""A base class for ServiceLauncherTest and ServiceRestartTest."""
+ def _spawn_service(self, workers=1, *args, **kwargs):
+ self.workers = workers
+ pid = os.fork()
+ if pid == 0:
+ os.setsid()
+ # NOTE(johannes): We can't let the child processes exit back
+ # into the unit test framework since then we'll have multiple
+ # processes running the same tests (and possibly forking more
+ # processes that end up in the same situation). So we need
+ # to catch all exceptions and make sure nothing leaks out, in
+ # particular SystemExit, which is raised by sys.exit(). We use
+ # os._exit() which doesn't have this problem.
+ status = 0
+ try:
+ serv = ServiceWithTimer()
+ launcher = service.launch(serv, workers=workers)
+ launcher.wait(*args, **kwargs)
+ except SystemExit as exc:
+ status = exc.code
+ except BaseException:
+ # We need to be defensive here too
+ try:
+ traceback.print_exc()
+ except BaseException:
+ print("Couldn't print traceback")
+ status = 2
+ # Really exit
+ os._exit(status)
+ return pid
+
def _wait(self, cond, timeout):
start = time.time()
while not cond():
@@ -107,37 +137,7 @@ class ServiceLauncherTest(ServiceTestBase):
"""Originally from nova/tests/integrated/test_multiprocess_api.py."""
def _spawn(self):
- self.workers = 2
- pid = os.fork()
- if pid == 0:
- os.setsid()
- # NOTE(johannes): We can't let the child processes exit back
- # into the unit test framework since then we'll have multiple
- # processes running the same tests (and possibly forking more
- # processes that end up in the same situation). So we need
- # to catch all exceptions and make sure nothing leaks out, in
- # particular SystemExit, which is raised by sys.exit(). We use
- # os._exit() which doesn't have this problem.
- status = 0
- try:
- launcher = service.ProcessLauncher()
- serv = ServiceWithTimer()
- launcher.launch_service(serv, workers=self.workers)
- launcher.wait()
- except SystemExit as exc:
- status = exc.code
- except BaseException:
- # We need to be defensive here too
- try:
- traceback.print_exc()
- except BaseException:
- print("Couldn't print traceback")
- status = 2
-
- # Really exit
- os._exit(status)
-
- self.pid = pid
+ self.pid = self._spawn_service(workers=2)
# Wait at most 10 seconds to spawn workers
cond = lambda: self.workers == len(self._get_workers())
@@ -231,25 +231,14 @@ class ServiceLauncherTest(ServiceTestBase):
class ServiceRestartTest(ServiceTestBase):
- def _spawn_service(self):
+ def _spawn(self):
ready_event = multiprocessing.Event()
- pid = os.fork()
- status = 0
- if pid == 0:
- os.setsid()
- try:
- serv = ServiceWithTimer()
- launcher = service.ServiceLauncher()
- launcher.launch_service(serv)
- launcher.wait(ready_callback=ready_event.set)
- except SystemExit as exc:
- status = exc.code
- os._exit(status)
- self.pid = pid
+ self.pid = self._spawn_service(workers=1,
+ ready_callback=ready_event.set)
return ready_event
def test_service_restart(self):
- ready = self._spawn_service()
+ ready = self._spawn()
timeout = 5
ready.wait(timeout)
@@ -261,7 +250,7 @@ class ServiceRestartTest(ServiceTestBase):
self.assertTrue(ready.is_set(), 'Service never back after SIGHUP')
def test_terminate_sigterm(self):
- ready = self._spawn_service()
+ ready = self._spawn()
timeout = 5
ready.wait(timeout)
self.assertTrue(ready.is_set(), 'Service never became ready')