~singpolyma/biboumi

440e04c6ba1dfae2d6fbb55b120763e3d0da6cd1 — louiz’ 4 years ago 0cb62d9
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
2 files changed, 15 insertions(+), 1 deletions(-)

M tests/end_to_end/__main__.py
M tests/end_to_end/functions.py
M tests/end_to_end/__main__.py => tests/end_to_end/__main__.py +11 -0
@@ 83,6 83,7 @@ class XMPPComponent(slixmpp.BaseXMPP):

        self.scenario = scenario
        self.biboumi = biboumi
        self.timeout_handler = None
        # A callable, taking a stanza as argument and raising a StanzaError
        # exception if the test should fail.
        self.stanza_checker = None


@@ 96,6 97,13 @@ class XMPPComponent(slixmpp.BaseXMPP):
        self.scenario.steps = []
        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, _):
        self.loop.stop()



@@ 113,6 121,9 @@ class XMPPComponent(slixmpp.BaseXMPP):
        self.run_scenario()

    def run_scenario(self):
        if self.timeout_handler is not None:
            self.timeout_handler.cancel()
            self.timeout_handler = None
        if self.scenario.steps:
            step = self.scenario.steps.pop(0)
            try:

M tests/end_to_end/functions.py => tests/end_to_end/functions.py +4 -1
@@ 127,7 127,9 @@ def expect_stanza(*args, optional=False, after=None):
        replacements = common_replacements
        replacements.update(xmpp.saved_values)
        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)

def send_stanza(stanza):


@@ 148,6 150,7 @@ def expect_unordered(*args):
                formatted_xpaths.append(formatted_xpath)
            formatted_list_of_xpaths.append(tuple(formatted_xpaths))
        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)

def expect_unordered_already_formatted(formatted_list_of_xpaths, xmpp, biboumi):