Move `wait_until_result` into `FakeChannel` (#8758)

FakeChannel has everything we need, and this more accurately models the real
flow.
This commit is contained in:
Richard van der Hoff 2020-11-16 18:21:47 +00:00 committed by GitHub
parent 4f76eef0e8
commit f125895475
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 24 additions and 25 deletions

1
changelog.d/8758.misc Normal file
View File

@ -0,0 +1 @@
Refactor test utilities for injecting HTTP requests.

View File

@ -32,7 +32,7 @@ from synapse.util.httpresourcetree import create_resource_tree
from synapse.util.stringutils import random_string from synapse.util.stringutils import random_string
from tests import unittest from tests import unittest
from tests.server import FakeChannel, wait_until_result from tests.server import FakeChannel
from tests.utils import default_config from tests.utils import default_config
@ -94,7 +94,7 @@ class RemoteKeyResourceTestCase(BaseRemoteKeyResourceTestCase):
% (server_name.encode("utf-8"), key_id.encode("utf-8")), % (server_name.encode("utf-8"), key_id.encode("utf-8")),
b"1.1", b"1.1",
) )
wait_until_result(self.reactor, req) channel.await_result()
self.assertEqual(channel.code, 200) self.assertEqual(channel.code, 200)
resp = channel.json_body resp = channel.json_body
return resp return resp
@ -190,7 +190,7 @@ class EndToEndPerspectivesTests(BaseRemoteKeyResourceTestCase):
req.requestReceived( req.requestReceived(
b"POST", path.encode("utf-8"), b"1.1", b"POST", path.encode("utf-8"), b"1.1",
) )
wait_until_result(self.reactor, req) channel.await_result()
self.assertEqual(channel.code, 200) self.assertEqual(channel.code, 200)
resp = channel.json_body resp = channel.json_body
return resp return resp

View File

@ -117,6 +117,25 @@ class FakeChannel:
def transport(self): def transport(self):
return self return self
def await_result(self, timeout: int = 100) -> None:
"""
Wait until the request is finished.
"""
self._reactor.run()
x = 0
while not self.result.get("done"):
# If there's a producer, tell it to resume producing so we get content
if self._producer:
self._producer.resumeProducing()
x += 1
if x > timeout:
raise TimedOutException("Timed out waiting for request to finish.")
self._reactor.advance(0.1)
class FakeSite: class FakeSite:
""" """
@ -225,30 +244,9 @@ def make_request(
return req, channel return req, channel
def wait_until_result(clock, request, timeout=100):
"""
Wait until the request is finished.
"""
clock.run()
x = 0
while not request.finished:
# If there's a producer, tell it to resume producing so we get content
if request._channel._producer:
request._channel._producer.resumeProducing()
x += 1
if x > timeout:
raise TimedOutException("Timed out waiting for request to finish.")
clock.advance(0.1)
def render(request, resource, clock): def render(request, resource, clock):
request.render(resource) request.render(resource)
wait_until_result(clock, request) request._channel.await_result()
@implementer(IReactorPluggableNameResolver) @implementer(IReactorPluggableNameResolver)