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 (
|
||||
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'
|
||||
|
||||
@@ -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'
|
||||
|
||||
Reference in New Issue
Block a user