Allow use of exception (and by extension, assert statements) in the
called function in order to extract essential debug information about
the type of failure that was encountered.
In case the called function fails to succeed on the last retry and
raised an exception, log it as error and set it as the assert message to
propagate it through the pytest framework.
def _verify_keys():
# check number of keys matches expected.
if len(keys) != len(expected):
- return False
+ assert (
+ False
+ ), f"check_keys(): mismatched number of keys, expected {len(expected)}, got {len(keys)}"
if len(keys) == 0:
return True
expected[i].key = key
i += 1
if not found:
- return False
+ assert False, f"check_keys(): key {key} not found"
return True
def retry_with_timeout(func, timeout, delay=1, msg=None):
start_time = time.time()
+ exc_msg = None
while time.time() < start_time + timeout:
- if func():
- return
+ exc_msg = None
+ try:
+ if func():
+ return
+ except AssertionError as exc:
+ exc_msg = str(exc)
time.sleep(delay)
+ if exc_msg is not None:
+ isctest.log.error(exc_msg)
if msg is None:
- msg = f"{func.__module__}.{func.__qualname__} timed out after {timeout} s"
+ if exc_msg is not None:
+ msg = exc_msg
+ else:
+ msg = f"{func.__module__}.{func.__qualname__} timed out after {timeout} s"
assert False, msg