Commit bd625aa5 authored by louiz’'s avatar louiz’

e2etests: we are able to receive optional stanzas

parent 45f442b6
...@@ -21,6 +21,17 @@ class MatchAll(MatcherBase): ...@@ -21,6 +21,17 @@ class MatchAll(MatcherBase):
class StanzaError(Exception): class StanzaError(Exception):
"""
Raised when a step fails.
"""
pass
class SkipStepError(Exception):
"""
Raised by a step when it needs to be skiped, by running
the next available step immediately.
"""
pass pass
...@@ -69,6 +80,10 @@ class XMPPComponent(slixmpp.BaseXMPP): ...@@ -69,6 +80,10 @@ class XMPPComponent(slixmpp.BaseXMPP):
self.stanza_checker(stanza) self.stanza_checker(stanza)
except StanzaError as e: except StanzaError as e:
self.error(e) self.error(e)
except SkipStepError:
# Run the next step and then re-handle this same stanza
self.run_scenario()
return self.handle_incoming_stanza(stanza)
self.stanza_checker = None self.stanza_checker = None
self.run_scenario() self.run_scenario()
...@@ -97,6 +112,13 @@ def check_xpath(xpaths, stanza): ...@@ -97,6 +112,13 @@ def check_xpath(xpaths, stanza):
raise StanzaError("Received stanza “%s” did not match expected xpath “%s”" % (stanza, xpath)) raise StanzaError("Received stanza “%s” did not match expected xpath “%s”" % (stanza, xpath))
def check_xpath_optional(xpaths, stanza):
try:
check_xpath(xpaths, stanza)
except StanzaError:
raise SkipStepError()
class Scenario: class Scenario:
"""Defines a list of actions that are executed in sequence, until one of """Defines a list of actions that are executed in sequence, until one of
them throws an exception, or until the end. An action can be something them throws an exception, or until the end. An action can be something
...@@ -170,11 +192,12 @@ def send_stanza(stanza, xmpp, biboumi): ...@@ -170,11 +192,12 @@ def send_stanza(stanza, xmpp, biboumi):
asyncio.get_event_loop().call_soon(xmpp.run_scenario) asyncio.get_event_loop().call_soon(xmpp.run_scenario)
def expect_stanza(xpaths, xmpp, biboumi): def expect_stanza(xpaths, xmpp, biboumi, optional=False):
check_func = check_xpath if not optional else check_xpath_optional
if isinstance(xpaths, str): if isinstance(xpaths, str):
xmpp.stanza_checker = partial(check_xpath, [xpaths.format_map(common_replacements)]) xmpp.stanza_checker = partial(check_func, [xpaths.format_map(common_replacements)])
elif isinstance(xpaths, tuple): elif isinstance(xpaths, tuple):
xmpp.stanza_checker = partial(check_xpath, [xpath.format_map(common_replacements) for xpath in xpaths]) xmpp.stanza_checker = partial(check_func, [xpath.format_map(common_replacements) for xpath in xpaths])
else: else:
print("Warning, from argument type passed to expect_stanza: %s" % (type(xpaths))) print("Warning, from argument type passed to expect_stanza: %s" % (type(xpaths)))
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment