summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--test/python/threads/asgi.py27
-rw-r--r--test/python/threads/wsgi.py15
-rw-r--r--test/test_asgi_application.py41
-rw-r--r--test/test_python_application.py41
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'