You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@buildstream.apache.org by gi...@apache.org on 2020/12/29 13:17:14 UTC

[buildstream] 03/04: tests/.../http_server: be spawn friendly

This is an automated email from the ASF dual-hosted git repository.

github-bot pushed a commit to branch aevri/enable_spawn_ci_6
in repository https://gitbox.apache.org/repos/asf/buildstream.git

commit b0164e05bb71ac4d62cd62d475230ca14e786d96
Author: Angelos Evripiotis <je...@bloomberg.net>
AuthorDate: Fri Oct 25 15:20:26 2019 +0100

    tests/.../http_server: be spawn friendly
    
    Make SimpleHttpServer work when using the 'spawn' method of
    multiprocessing.
    
    Instead of trying to pickle the HTTPServer and friends to the new
    process, buffer any config calls and then start the server only in the
    new process.
---
 tests/testutils/http_server.py | 59 +++++++++++++++++++++++++++++++-----------
 1 file changed, 44 insertions(+), 15 deletions(-)

diff --git a/tests/testutils/http_server.py b/tests/testutils/http_server.py
index b72e745..57e813f 100644
--- a/tests/testutils/http_server.py
+++ b/tests/testutils/http_server.py
@@ -81,30 +81,59 @@ class AuthHTTPServer(HTTPServer):
         super().__init__(*args, **kwargs)
 
 
-class SimpleHttpServer(multiprocessing.Process):
+class SimpleHttpServer():
+    # pylint: disable=attribute-defined-outside-init
+
     def __init__(self):
-        super().__init__()
-        self.server = AuthHTTPServer(('127.0.0.1', 0), RequestHandler)
-        self.started = False
+        self._reset()
+
+    def _reset(self):
+        self._process = None
+        self._port = None
+        self._anonymous_dir = None
+        self._user_list = []
 
     def start(self):
-        self.started = True
-        super().start()
+        assert self._process is None, "Server already running."
+        queue = multiprocessing.SimpleQueue()
+
+        self._process = multiprocessing.Process(
+            target=_run_server,
+            args=(queue, self._anonymous_dir, self._user_list),
+        )
 
-    def run(self):
-        self.server.serve_forever()
+        self._process.start()
+        self._port = queue.get()
 
     def stop(self):
-        if not self.started:
-            return
-        self.terminate()
-        self.join()
+        assert self._process is not None, "Server not running."
+        self._process.terminate()
+        self._process.join()
+        self._reset()
 
     def allow_anonymous(self, cwd):
-        self.server.anonymous_dir = cwd
+        assert self._process is None, "Can't modify server after start()."
+        assert self._anonymous_dir is None, "Only one anonymous_dir is supported."
+        self._anonymous_dir = cwd
 
     def add_user(self, user, password, cwd):
-        self.server.users[user] = (password, cwd)
+        assert self._process is None, "Can't modify server after start()."
+        self._user_list.append((user, password, cwd))
 
     def base_url(self):
-        return 'http://127.0.0.1:{}'.format(self.server.server_port)
+        assert self._port is not None
+        return 'http://127.0.0.1:{}'.format(self._port)
+
+
+def _run_server(queue, anonymous_dir, user_list):
+    server = AuthHTTPServer(('127.0.0.1', 0), RequestHandler)
+
+    if anonymous_dir is not None:
+        server.anonymous_dir = anonymous_dir
+
+    for user, password, cwd in user_list:
+        server.users[user] = (password, cwd)
+
+    queue.put(server.server_port)
+
+    server.serve_forever()