diff options
author | James O'Beirne <james.obeirne@pm.me> | 2021-12-10 14:32:24 -0500 |
---|---|---|
committer | James O'Beirne <james.obeirne@pm.me> | 2021-12-29 13:04:36 -0500 |
commit | 93db6d8422345cc10db333d56ea9bcceefcf58b6 (patch) | |
tree | a996dfe127a2c97a698071fda4205721ee783863 /test/functional | |
parent | 24fcf6e435ee53191b1404a11b0689bcd647c9e2 (diff) |
test: feature_init: retain debug.log and improve detection
This test sporadically fails due to the Python test missing log lines
for reasons that are poorly understood. The problem is made worse by the
fact that this test does not retain the log files from iteration to
iteration.
Change the test to do logline detection in a more robust manner (by
using `re.search` on the whole log content) in a way that is comparable
to the existing `assert_debug_log` utility, and retain all debug.log
content from case to case.
Diffstat (limited to 'test/functional')
-rwxr-xr-x | test/functional/feature_init.py | 37 |
1 files changed, 9 insertions, 28 deletions
diff --git a/test/functional/feature_init.py b/test/functional/feature_init.py index a82238f7cf..04a851bd85 100755 --- a/test/functional/feature_init.py +++ b/test/functional/feature_init.py @@ -44,8 +44,6 @@ class InitStressTest(BitcoinTestFramework): def sigterm_node(): node.process.terminate() node.process.wait() - node.debug_log_path.unlink() - node.debug_log_path.touch() def check_clean_start(): """Ensure that node restarts successfully after various interrupts.""" @@ -71,7 +69,7 @@ class InitStressTest(BitcoinTestFramework): 'net thread start', 'addcon thread start', 'loadblk thread start', - # TODO: reenable - see above TODO + # TODO: re-enable - see above TODO # 'txindex thread start', 'msghand thread start' ] @@ -84,39 +82,21 @@ class InitStressTest(BitcoinTestFramework): # TODO: add -txindex=1 to fully test index initiatlization. # extra_args=['-txindex=1'], ) - logfile = open(node.debug_log_path, 'r', encoding='utf8') - - MAX_SECS_TO_WAIT = 30 - start = time.time() - num_lines = 0 - while True: - line = logfile.readline() - if line: - num_lines += 1 - - if line and terminate_line.lower() in line.lower(): - self.log.debug(f"Terminating node after {num_lines} log lines seen") - sigterm_node() - break - - if (time.time() - start) > MAX_SECS_TO_WAIT: - raise AssertionError( - f"missed line {terminate_line}; terminating now after {num_lines} lines") - - if node.process.poll() is not None: - raise AssertionError(f"node failed to start (line: '{terminate_line}')") + num_total_logs = node.wait_for_debug_log([terminate_line], ignore_case=True) + self.log.debug(f"Terminating node after {num_total_logs} log lines seen") + sigterm_node() check_clean_start() - num_total_logs = len(node.debug_log_path.read_text().splitlines()) self.stop_node(0) self.log.info( f"Terminate at some random point in the init process (max logs: {num_total_logs})") for _ in range(40): - terminate_after = random.randint(1, num_total_logs) - self.log.debug(f"Starting node and will exit after {terminate_after} lines") + num_logs = len(Path(node.debug_log_path).read_text().splitlines()) + additional_lines = random.randint(1, num_total_logs) + self.log.debug(f"Starting node and will exit after {additional_lines} lines") node.start( # TODO: add -txindex=1 to fully test index initiatlization. # extra_args=['-txindex=1'], @@ -132,7 +112,8 @@ class InitStressTest(BitcoinTestFramework): if line: num_lines += 1 - if num_lines >= terminate_after or (time.time() - start) > MAX_SECS_TO_WAIT: + if num_lines >= (num_logs + additional_lines) or \ + (time.time() - start) > MAX_SECS_TO_WAIT: self.log.debug(f"Terminating node after {num_lines} log lines seen") sigterm_node() break |