From 00d18f80d29c06937270fa02b9a44f7d49fd61ec Mon Sep 17 00:00:00 2001 From: Konstantin Akimov Date: Tue, 24 Mar 2026 14:46:44 +0700 Subject: [PATCH 1/2] test: add functional tests for -deprecatedrpc=permissive_bool --- test/functional/rpc_deprecated.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/test/functional/rpc_deprecated.py b/test/functional/rpc_deprecated.py index a839eda5d108..690fe870ceed 100755 --- a/test/functional/rpc_deprecated.py +++ b/test/functional/rpc_deprecated.py @@ -4,15 +4,16 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Test deprecation of RPC calls.""" from test_framework.test_framework import BitcoinTestFramework -# from test_framework.util import assert_raises_rpc_error +from test_framework.util import assert_raises_rpc_error, assert_equal class DeprecatedRpcTest(BitcoinTestFramework): def set_test_params(self): self.num_nodes = 2 self.setup_clean_chain = True - self.extra_args = [[], []] + self.extra_args = [[], ["-deprecatedrpc=permissive_bool"]] def run_test(self): + self.test_permissive_bool() # This test should be used to verify correct behaviour of deprecated # RPC methods with and without the -deprecatedrpc flags. For example: # @@ -25,5 +26,17 @@ def run_test(self): # self.generate(self.nodes[1], 1) self.log.info("No tested deprecated RPC methods") + + def test_permissive_bool(self): + self.generate(self.nodes[0], 1) + assert_equal([], self.nodes[0].protx("list", "valid", True)) + assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", 1) + assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", "1") + + assert_equal([], self.nodes[1].protx("list", "valid", True)) + assert_equal([], self.nodes[1].protx("list", "valid", 1)) + assert_equal([], self.nodes[1].protx("list", "valid", "1")) + + if __name__ == '__main__': DeprecatedRpcTest().main() From 02c4ed465e7672f5be121158f8df5ee51498fdea Mon Sep 17 00:00:00 2001 From: UdjinM6 Date: Fri, 27 Mar 2026 22:25:21 +0300 Subject: [PATCH 2/2] test: expand permissive_bool test coverage Add full coverage for the permissive_bool legacy input surface: - Test falsy values (False, 0, "0") in both strict and permissive modes - Test string aliases ("yes", "no") in both modes - Test invalid values (2, "notabool") are still rejected in permissive mode - Add log.info calls for test sections - Comment out stale "No tested deprecated RPC methods" message Co-Authored-By: Claude Opus 4.6 --- test/functional/rpc_deprecated.py | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/test/functional/rpc_deprecated.py b/test/functional/rpc_deprecated.py index 690fe870ceed..0780b8515823 100755 --- a/test/functional/rpc_deprecated.py +++ b/test/functional/rpc_deprecated.py @@ -13,7 +13,6 @@ def set_test_params(self): self.extra_args = [[], ["-deprecatedrpc=permissive_bool"]] def run_test(self): - self.test_permissive_bool() # This test should be used to verify correct behaviour of deprecated # RPC methods with and without the -deprecatedrpc flags. For example: # @@ -24,19 +23,40 @@ def run_test(self): # self.log.info("Test generate RPC") # assert_raises_rpc_error(-32, 'The wallet generate rpc method is deprecated', self.nodes[0].rpc.generate, 1) # self.generate(self.nodes[1], 1) - self.log.info("No tested deprecated RPC methods") - + # self.log.info("No tested deprecated RPC methods") + self.test_permissive_bool() def test_permissive_bool(self): + self.log.info("Test -deprecatedrpc=permissive_bool") self.generate(self.nodes[0], 1) + + self.log.info("Node 0 (strict): JSON boolean accepted, legacy types rejected") assert_equal([], self.nodes[0].protx("list", "valid", True)) + assert_equal([], self.nodes[0].protx("list", "valid", False)) assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", 1) assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", "1") + assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", 0) + assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", "0") + assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", "true") + assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", "false") + assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", "yes") + assert_raises_rpc_error(-8, 'detailed must be a JSON boolean. Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.', self.nodes[0].protx, "list", "valid", "no") + self.log.info("Node 1 (permissive): JSON boolean and legacy types accepted") assert_equal([], self.nodes[1].protx("list", "valid", True)) assert_equal([], self.nodes[1].protx("list", "valid", 1)) assert_equal([], self.nodes[1].protx("list", "valid", "1")) + assert_equal([], self.nodes[1].protx("list", "valid", False)) + assert_equal([], self.nodes[1].protx("list", "valid", 0)) + assert_equal([], self.nodes[1].protx("list", "valid", "0")) + assert_equal([], self.nodes[1].protx("list", "valid", "true")) + assert_equal([], self.nodes[1].protx("list", "valid", "false")) + assert_equal([], self.nodes[1].protx("list", "valid", "yes")) + assert_equal([], self.nodes[1].protx("list", "valid", "no")) + self.log.info("Node 1 (permissive): invalid values still rejected") + assert_raises_rpc_error(-8, "detailed must be true, false, yes, no, 1 or 0 (not '2')", self.nodes[1].protx, "list", "valid", 2) + assert_raises_rpc_error(-8, "detailed must be true, false, yes, no, 1 or 0 (not 'notabool')", self.nodes[1].protx, "list", "valid", "notabool") if __name__ == '__main__': DeprecatedRpcTest().main()