diff options
-rw-r--r-- | test/python/threads/asgi.py | 27 | ||||
-rw-r--r-- | test/python/threads/wsgi.py | 15 | ||||
-rw-r--r-- | test/test_asgi_application.py | 41 | ||||
-rw-r--r-- | test/test_python_application.py | 41 |
4 files changed, 124 insertions, 0 deletions
diff --git a/test/python/threads/asgi.py b/test/python/threads/asgi.py new file mode 100644 index 00000000..d51ae431 --- /dev/null +++ b/test/python/threads/asgi.py @@ -0,0 +1,27 @@ +import asyncio +import time +import threading + +async def application(scope, receive, send): + assert scope['type'] == 'http' + + headers = scope.get('headers', []) + + def get_header(n, v=None): + for h in headers: + if h[0] == n: + return h[1] + return v + + delay = float(get_header(b'x-delay', 0)) + + time.sleep(delay) + + await send({ + 'type': 'http.response.start', + 'status': 200, + 'headers': [ + (b'content-length', b'0'), + (b'x-thread', str(threading.currentThread().ident).encode()), + ] + }) diff --git a/test/python/threads/wsgi.py b/test/python/threads/wsgi.py new file mode 100644 index 00000000..1cc8ffe2 --- /dev/null +++ b/test/python/threads/wsgi.py @@ -0,0 +1,15 @@ +import time +import threading + +def application(environ, start_response): + delay = float(environ.get('HTTP_X_DELAY', 0)) + + time.sleep(delay) + + start_response('200', [ + ('Content-Length', '0'), + ('Wsgi-Multithread', str(environ['wsgi.multithread'])), + ('X-Thread', str(threading.currentThread().ident)) + ]) + + return [] diff --git a/test/test_asgi_application.py b/test/test_asgi_application.py index 1a654ebf..179a69ee 100644 --- a/test/test_asgi_application.py +++ b/test/test_asgi_application.py @@ -401,3 +401,44 @@ Connection: close assert ( self.wait_for_record(r'\(5\) Thread: 100') is not None ), 'last thread finished' + + def test_asgi_application_threads(self): + self.load('threads') + + assert 'success' in self.conf( + '4', 'applications/threads/threads' + ), 'configure 4 threads' + + socks = [] + + for i in range(4): + (_, sock) = self.get( + headers={ + 'Host': 'localhost', + 'X-Delay': '2', + 'Connection': 'close', + }, + no_recv=True, + start=True, + ) + + socks.append(sock) + + time.sleep(0.25) # required to avoid greedy request reading + + threads = set() + + for sock in socks: + resp = self.recvall(sock).decode('utf-8') + + self.log_in(resp) + + resp = self._resp_to_dict(resp) + + assert resp['status'] == 200, 'status' + + threads.add(resp['headers']['x-thread']) + + sock.close() + + assert len(socks) == len(threads), 'threads differs' diff --git a/test/test_python_application.py b/test/test_python_application.py index 6ea9f4ff..780b836a 100644 --- a/test/test_python_application.py +++ b/test/test_python_application.py @@ -832,3 +832,44 @@ last line: 987654321 assert 'success' in self.conf_delete('applications/callable/callable') assert self.get()['status'] == 204, 'default response 2' + + def test_python_application_threads(self): + self.load('threads') + + assert 'success' in self.conf( + '4', 'applications/threads/threads' + ), 'configure 4 threads' + + socks = [] + + for i in range(4): + (_, sock) = self.get( + headers={ + 'Host': 'localhost', + 'X-Delay': '2', + 'Connection': 'close', + }, + no_recv=True, + start=True, + ) + + socks.append(sock) + + threads = set() + + for sock in socks: + resp = self.recvall(sock).decode('utf-8') + + self.log_in(resp) + + resp = self._resp_to_dict(resp) + + assert resp['status'] == 200, 'status' + + threads.add(resp['headers']['X-Thread']) + + assert resp['headers']['Wsgi-Multithread'] == 'True', 'multithread' + + sock.close() + + assert len(socks) == len(threads), 'threads differs' |