From bb8d673183294a43c716ff8738da2492f3d7a94b Mon Sep 17 00:00:00 2001 From: Fabian Jahr Date: Mon, 2 Jun 2025 22:40:14 +0200 Subject: [PATCH] test: Add coinstatsindex compatibility test --- .../feature_coinstatsindex_compatibility.py | 64 +++++++++++++++++++ test/functional/test_runner.py | 1 + 2 files changed, 65 insertions(+) create mode 100755 test/functional/feature_coinstatsindex_compatibility.py diff --git a/test/functional/feature_coinstatsindex_compatibility.py b/test/functional/feature_coinstatsindex_compatibility.py new file mode 100755 index 00000000000..357700a7137 --- /dev/null +++ b/test/functional/feature_coinstatsindex_compatibility.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# Copyright (c) 2025 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. +"""Test coinstatsindex across node versions. + +This test may be removed some time after v29 has reached end of life. +""" + +import shutil + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import assert_equal + + +class CoinStatsIndexTest(BitcoinTestFramework): + def set_test_params(self): + self.num_nodes = 2 + self.supports_cli = False + self.extra_args = [["-coinstatsindex"],["-coinstatsindex"]] + + def skip_test_if_missing_module(self): + self.skip_if_no_previous_releases() + + def setup_nodes(self): + self.add_nodes( + self.num_nodes, + extra_args=self.extra_args, + versions=[ + None, + 280200, + ], + ) + self.start_nodes() + + def run_test(self): + self._test_coin_stats_index_compatibility() + + def _test_coin_stats_index_compatibility(self): + node = self.nodes[0] + legacy_node = self.nodes[1] + for n in self.nodes: + self.wait_until(lambda: n.getindexinfo()['coinstatsindex']['synced'] is True) + + self.log.info("Test that gettxoutsetinfo() output is consistent between the different index versions") + res0 = node.gettxoutsetinfo('muhash') + res1 = legacy_node.gettxoutsetinfo('muhash') + assert_equal(res1, res0) + + self.log.info("Test that gettxoutsetinfo() output is consistent for the new index running on a datadir with the old version") + self.stop_nodes() + shutil.rmtree(node.chain_path / "indexes" / "coinstatsindex") + shutil.copytree(legacy_node.chain_path / "indexes" / "coinstats", node.chain_path / "indexes" / "coinstats") + old_version_path = node.chain_path / "indexes" / "coinstats" + msg = f'[warning] Old version of coinstatsindex found at {old_version_path}. This folder can be safely deleted unless you plan to downgrade your node to version 29 or lower.' + with node.assert_debug_log(expected_msgs=[msg]): + self.start_node(0, ['-coinstatsindex']) + self.wait_until(lambda: node.getindexinfo()['coinstatsindex']['synced'] is True) + res2 = node.gettxoutsetinfo('muhash') + assert_equal(res2, res0) + + +if __name__ == '__main__': + CoinStatsIndexTest(__file__).main() diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py index f2e514a7a46..94965618cd9 100755 --- a/test/functional/test_runner.py +++ b/test/functional/test_runner.py @@ -342,6 +342,7 @@ BASE_SCRIPTS = [ 'feature_anchors.py', 'mempool_datacarrier.py', 'feature_coinstatsindex.py', + 'feature_coinstatsindex_compatibility.py', 'wallet_orphanedreward.py', 'wallet_timelock.py', 'p2p_permissions.py',