Tests: added Python threading tests.

This commit is contained in:
Max Romanov
2020-11-05 00:05:02 +03:00
parent 8e37b1cbf5
commit f27953af61
4 changed files with 124 additions and 0 deletions

View 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()),
]
})

View 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 []

View File

@@ -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'

View File

@@ -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'