e2e: Add a 10s timeout for expect_stanza
Otherwise, if we expect a stanza and biboumi never sends it, we just hang here. Now, we display a nice error after 10 seconds, and move on to the next test, as other failures (xpath doesn’t match) do
This commit is contained in:
@@ -83,6 +83,7 @@ class XMPPComponent(slixmpp.BaseXMPP):
|
|||||||
|
|
||||||
self.scenario = scenario
|
self.scenario = scenario
|
||||||
self.biboumi = biboumi
|
self.biboumi = biboumi
|
||||||
|
self.timeout_handler = None
|
||||||
# A callable, taking a stanza as argument and raising a StanzaError
|
# A callable, taking a stanza as argument and raising a StanzaError
|
||||||
# exception if the test should fail.
|
# exception if the test should fail.
|
||||||
self.stanza_checker = None
|
self.stanza_checker = None
|
||||||
@@ -96,6 +97,13 @@ class XMPPComponent(slixmpp.BaseXMPP):
|
|||||||
self.scenario.steps = []
|
self.scenario.steps = []
|
||||||
self.failed = True
|
self.failed = True
|
||||||
|
|
||||||
|
def on_timeout(self, xpaths):
|
||||||
|
error_msg = "Timeout while waiting for a stanza that would match the expected xpath(s):"
|
||||||
|
for xpath in xpaths:
|
||||||
|
error_msg += "\n" + xpath
|
||||||
|
self.error(error_msg)
|
||||||
|
self.run_scenario()
|
||||||
|
|
||||||
def on_end_session(self, _):
|
def on_end_session(self, _):
|
||||||
self.loop.stop()
|
self.loop.stop()
|
||||||
|
|
||||||
@@ -113,6 +121,9 @@ class XMPPComponent(slixmpp.BaseXMPP):
|
|||||||
self.run_scenario()
|
self.run_scenario()
|
||||||
|
|
||||||
def run_scenario(self):
|
def run_scenario(self):
|
||||||
|
if self.timeout_handler is not None:
|
||||||
|
self.timeout_handler.cancel()
|
||||||
|
self.timeout_handler = None
|
||||||
if self.scenario.steps:
|
if self.scenario.steps:
|
||||||
step = self.scenario.steps.pop(0)
|
step = self.scenario.steps.pop(0)
|
||||||
try:
|
try:
|
||||||
|
|||||||
@@ -127,7 +127,9 @@ def expect_stanza(*args, optional=False, after=None):
|
|||||||
replacements = common_replacements
|
replacements = common_replacements
|
||||||
replacements.update(xmpp.saved_values)
|
replacements.update(xmpp.saved_values)
|
||||||
check_func = check_xpath if not optional else check_xpath_optional
|
check_func = check_xpath if not optional else check_xpath_optional
|
||||||
xmpp.stanza_checker = partial(check_func, [xpath.format_map(replacements) for xpath in xpaths], xmpp, after)
|
formatted_xpaths = [xpath.format_map(replacements) for xpath in xpaths]
|
||||||
|
xmpp.stanza_checker = partial(check_func, formatted_xpaths, xmpp, after)
|
||||||
|
xmpp.timeout_handler = asyncio.get_event_loop().call_later(10, partial(xmpp.on_timeout, formatted_xpaths))
|
||||||
return partial(f, *args, optional=optional, after=after)
|
return partial(f, *args, optional=optional, after=after)
|
||||||
|
|
||||||
def send_stanza(stanza):
|
def send_stanza(stanza):
|
||||||
@@ -148,6 +150,7 @@ def expect_unordered(*args):
|
|||||||
formatted_xpaths.append(formatted_xpath)
|
formatted_xpaths.append(formatted_xpath)
|
||||||
formatted_list_of_xpaths.append(tuple(formatted_xpaths))
|
formatted_list_of_xpaths.append(tuple(formatted_xpaths))
|
||||||
expect_unordered_already_formatted(formatted_list_of_xpaths, xmpp, biboumi)
|
expect_unordered_already_formatted(formatted_list_of_xpaths, xmpp, biboumi)
|
||||||
|
xmpp.timeout_handler = asyncio.get_event_loop().call_later(10, partial(xmpp.on_timeout, formatted_list_of_xpaths))
|
||||||
return partial(f, *args)
|
return partial(f, *args)
|
||||||
|
|
||||||
def expect_unordered_already_formatted(formatted_list_of_xpaths, xmpp, biboumi):
|
def expect_unordered_already_formatted(formatted_list_of_xpaths, xmpp, biboumi):
|
||||||
|
|||||||
Reference in New Issue
Block a user