(self, expected_msgs, unexpected_msgs=None, *, timeout=0)
| 578 | |
| 579 | @contextlib.contextmanager |
| 580 | def assert_debug_log(self, expected_msgs, unexpected_msgs=None, *, timeout=0): |
| 581 | if unexpected_msgs is None: |
| 582 | unexpected_msgs = [] |
| 583 | assert_equal(type(expected_msgs), list) |
| 584 | assert_equal(type(unexpected_msgs), list) |
| 585 | remaining_expected = list(expected_msgs) |
| 586 | |
| 587 | time_end = time.time() + timeout * self.timeout_factor |
| 588 | prev_size = self.debug_log_size(encoding="utf-8") # Must use same encoding that is used to read() below |
| 589 | |
| 590 | def join_log(log): |
| 591 | return " - " + "\n - ".join(log.splitlines()) |
| 592 | |
| 593 | yield |
| 594 | |
| 595 | while True: |
| 596 | with open(self.debug_log_path, encoding="utf-8", errors="replace") as dl: |
| 597 | dl.seek(prev_size) |
| 598 | log = dl.read() |
| 599 | for unexpected_msg in unexpected_msgs: |
| 600 | if unexpected_msg in log: |
| 601 | self._raise_assertion_error(f'Unexpected message "{unexpected_msg}" ' |
| 602 | f'found in log:\n\n{join_log(log)}\n\n') |
| 603 | while remaining_expected and remaining_expected[-1] in log: |
| 604 | remaining_expected.pop() |
| 605 | if not remaining_expected: |
| 606 | return |
| 607 | if time.time() >= time_end: |
| 608 | break |
| 609 | time.sleep(0.05) |
| 610 | remaining_expected = [e for e in remaining_expected if e not in log] |
| 611 | self._raise_assertion_error(f'Expected message(s) {remaining_expected!s} ' |
| 612 | f'not found in log:\n\n{join_log(log)}\n\n') |
| 613 | |
| 614 | @contextlib.contextmanager |
| 615 | def busy_wait_for_debug_log(self, expected_msgs, timeout=60): |
no test coverage detected