From a1f76230209629c5141984aaac1cc4ba7b4f761a Mon Sep 17 00:00:00 2001 From: Hodlinator <172445034+hodlinator@users.noreply.github.com> Date: Thu, 25 Sep 2025 23:12:01 +0200 Subject: [PATCH] qa: Only complain about expected messages that were not found MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Only leaves messages we never found in the final assert message of the functions, which is more helpful (remaining_expected). Avoids repeatedly searching for messages we have already found (pop()). Stops searching for other expected messages if we already failed finding one. Still need to clean remaining_expected at the end, but *only if we fail*. Co-authored-by: Lőrinc --- test/functional/test_framework/test_node.py | 25 ++++++++++----------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py index cf92f926bca..653d58d0b53 100755 --- a/test/functional/test_framework/test_node.py +++ b/test/functional/test_framework/test_node.py @@ -546,6 +546,7 @@ class TestNode(): unexpected_msgs = [] assert_equal(type(expected_msgs), list) assert_equal(type(unexpected_msgs), list) + remaining_expected = list(expected_msgs) time_end = time.time() + timeout * self.timeout_factor prev_size = self.debug_log_size(encoding="utf-8") # Must use same encoding that is used to read() below @@ -556,7 +557,6 @@ class TestNode(): yield while True: - found = True with open(self.debug_log_path, encoding="utf-8", errors="replace") as dl: dl.seek(prev_size) log = dl.read() @@ -564,15 +564,15 @@ class TestNode(): if unexpected_msg in log: self._raise_assertion_error(f'Unexpected message "{unexpected_msg}" ' f'found in log:\n\n{join_log(log)}\n\n') - for expected_msg in expected_msgs: - if expected_msg not in log: - found = False - if found: + while remaining_expected and remaining_expected[-1] in log: + remaining_expected.pop() + if not remaining_expected: return if time.time() >= time_end: break time.sleep(0.05) - self._raise_assertion_error(f'Expected message(s) {expected_msgs!s} ' + remaining_expected = [e for e in remaining_expected if e not in log] + self._raise_assertion_error(f'Expected message(s) {remaining_expected!s} ' f'not found in log:\n\n{join_log(log)}\n\n') @contextlib.contextmanager @@ -582,20 +582,18 @@ class TestNode(): """ time_end = time.time() + timeout * self.timeout_factor prev_size = self.debug_log_size(mode="rb") # Must use same mode that is used to read() below + remaining_expected = list(expected_msgs) yield while True: - found = True with open(self.debug_log_path, "rb") as dl: dl.seek(prev_size) log = dl.read() - for expected_msg in expected_msgs: - if expected_msg not in log: - found = False - - if found: + while remaining_expected and remaining_expected[-1] in log: + remaining_expected.pop() + if not remaining_expected: return if time.time() >= time_end: @@ -605,7 +603,8 @@ class TestNode(): # No sleep here because we want to detect the message fragment as fast as # possible. - self._raise_assertion_error(f'Expected message(s) {expected_msgs!s} ' + remaining_expected = [e for e in remaining_expected if e not in log] + self._raise_assertion_error(f'Expected message(s) {remaining_expected!s} ' f'not found in log:\n\n{print_log}\n\n') @contextlib.contextmanager