Tests: added Python threading tests.
This commit is contained in:
27
test/python/threads/asgi.py
Normal file
27
test/python/threads/asgi.py
Normal file
@@ -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()),
|
||||||
|
]
|
||||||
|
})
|
||||||
15
test/python/threads/wsgi.py
Normal file
15
test/python/threads/wsgi.py
Normal file
@@ -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 []
|
||||||
@@ -401,3 +401,44 @@ Connection: close
|
|||||||
assert (
|
assert (
|
||||||
self.wait_for_record(r'\(5\) Thread: 100') is not None
|
self.wait_for_record(r'\(5\) Thread: 100') is not None
|
||||||
), 'last thread finished'
|
), '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'
|
||||||
|
|||||||
@@ -832,3 +832,44 @@ last line: 987654321
|
|||||||
assert 'success' in self.conf_delete('applications/callable/callable')
|
assert 'success' in self.conf_delete('applications/callable/callable')
|
||||||
|
|
||||||
assert self.get()['status'] == 204, 'default response 2'
|
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'
|
||||||
|
|||||||
Reference in New Issue
Block a user