From 95701c28c014a64c3c5e7a5b9c133269383416b7 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 10 Apr 2014 14:35:19 +0200 Subject: [PATCH] [FIX] test: HttpCase wait http requests to finish bzr revid: chs@openerp.com-20140410123519-wngil3aghdc6llqc --- openerp/service/server.py | 12 ++++++++++++ openerp/tests/common.py | 10 ++++++++++ 2 files changed, 22 insertions(+) diff --git a/openerp/service/server.py b/openerp/service/server.py index 0cdb9f27e54..76b415eb01e 100644 --- a/openerp/service/server.py +++ b/openerp/service/server.py @@ -62,6 +62,14 @@ class BaseWSGIServerNoBind(werkzeug.serving.BaseWSGIServer): # dont listen as we use PreforkServer#socket pass + +class RequestHandler(werkzeug.serving.WSGIRequestHandler): + def setup(self): + # flag the current thread as handling a http request + super(RequestHandler, self).setup() + me = threading.currentThread() + me.name = 'openerp.service.http.request.%s' % (me.ident,) + # _reexec() should set LISTEN_* to avoid connection refused during reload time. It # should also work with systemd socket activation. This is currently untested # and not yet used. @@ -71,6 +79,10 @@ class ThreadedWSGIServerReloadable(werkzeug.serving.ThreadedWSGIServer): given by the environement, this is used by autoreload to keep the listen socket open when a reload happens. """ + def __init__(self, host, port, app): + super(ThreadedWSGIServerReloadable, self).__init__(host, port, app, + handler=RequestHandler) + def server_bind(self): envfd = os.environ.get('LISTEN_FDS') if envfd and os.environ.get('LISTEN_PID') == str(os.getpid()): diff --git a/openerp/tests/common.py b/openerp/tests/common.py index 9f3684fa6df..7cc753e810b 100644 --- a/openerp/tests/common.py +++ b/openerp/tests/common.py @@ -229,8 +229,18 @@ class HttpCase(TransactionCase): # kill phantomjs if phantom.exit() wasn't called in the test if phantom.poll() is None: phantom.terminate() + self._wait_remaining_requests() _logger.info("phantom_run execution finished") + def _wait_remaining_requests(self): + for thread in threading.enumerate(): + if thread.name.startswith('openerp.service.http.request.'): + while thread.isAlive(): + # Need a busyloop here as thread.join() masks signals + # and would prevent the forced shutdown. + thread.join(0.05) + time.sleep(0.05) + def phantom_jsfile(self, jsfile, timeout=60, **kw): options = { 'timeout' : timeout,