zcashd/qa/rpc-tests/wallet_deprecation.py

116 lines
4.2 KiB
Python
Raw Normal View History

Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
#!/usr/bin/env python3
# Copyright (c) 2022 The Zcash developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or https://www.opensource.org/licenses/mit-license.php .
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
assert_true,
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
start_nodes,
stop_nodes,
wait_bitcoinds,
)
from test_framework.authproxy import JSONRPCException
import os.path
# Pick a subset of the deprecated RPC methods to test with. This test assumes that
# the deprecation feature name is the same as the RPC method name, and that the RPC
# method works without any arguments.
TESTABLE_FEATURES = [
"z_gettotalbalance",
"getnewaddress",
"z_getnewaddress",
]
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
# Test wallet address behaviour across network upgrades
class WalletDeprecationTest(BitcoinTestFramework):
def __init__(self):
super().__init__()
self.num_nodes = 1
def setup_chain(self):
super().setup_chain()
# Save a copy of node 0's zcash.conf
with open(os.path.join(self.options.tmpdir, "node0", "zcash.conf"), 'r', encoding='utf8') as f:
self.conf_lines = f.readlines()
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
def setup_network(self):
self.setup_network_with_args([])
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
def setup_network_with_args(self, allowed_deprecated):
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
dep_args = ["-allowdeprecated=" + v for v in allowed_deprecated]
self.nodes = start_nodes(
self.num_nodes, self.options.tmpdir,
extra_args=[dep_args] * self.num_nodes)
def setup_network_with_config(self, allowed_deprecated):
conf_lines = self.conf_lines + ["allowdeprecated={}\n".format(v) for v in allowed_deprecated]
with open(os.path.join(self.options.tmpdir, "node0", "zcash.conf"), 'w', encoding='utf8') as f:
f.writelines(conf_lines)
self.nodes = start_nodes(self.num_nodes, self.options.tmpdir)
def verify_enabled(self, function):
try:
getattr(self.nodes[0], function)()
except JSONRPCException as e:
raise AssertionError("'%s' not enabled (failed with '%s')" % (
function,
e.error['message'],
))
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
def verify_disabled(self, function):
errorString = ''
try:
getattr(self.nodes[0], function)()
except JSONRPCException as e:
errorString = e.error['message']
assert_true(
"DEPRECATED" in errorString,
"'%s' not disabled (%s)" % (
function,
"failed with '%s'" % errorString if len(errorString) > 0 else "succeeded",
))
def test_case(self, start_mode, features_to_allow, expected_state, default_enabled, default_disabled):
stop_nodes(self.nodes)
wait_bitcoinds()
start_mode(features_to_allow)
for function in default_enabled:
if function in TESTABLE_FEATURES:
expected_state(function)
for function in default_disabled:
if function in TESTABLE_FEATURES:
expected_state(function)
def run_test(self):
dep_info = self.nodes[0].getdeprecationinfo()
default_enabled = dep_info['deprecated_features']
default_disabled = dep_info['disabled_features']
for function in TESTABLE_FEATURES:
assert(function in default_enabled or function in default_disabled)
# RPC methods that are deprecated but enabled by default should succeed
for function in default_enabled:
if function in TESTABLE_FEATURES:
self.verify_enabled(function)
# RPC methods that are deprecated and not enabled by default should fail
for function in default_disabled:
if function in TESTABLE_FEATURES:
self.verify_disabled(function)
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
for start_mode in (self.setup_network_with_args, self.setup_network_with_config):
# restart with a specific selection of deprecated methods enabled
self.test_case(start_mode, default_disabled, self.verify_enabled, default_enabled, default_disabled)
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
# restart with no deprecated methods enabled
self.test_case(start_mode, ["none"], self.verify_disabled, default_enabled, default_disabled)
Allow deprecated wallet features to be preemptively disabled. This adds an `-allowdeprecated` CLI parameter whose value is a flag indicating a deprecated feature that should be explicitly enabled. Multiple instances of this argument may be provided. In the case that this parameter is not provided, all currently deprecated RPC methods that are not slated for removal in the next release remain available. A user may disable all deprecated features entirely by providing the string "none" as the argument to this parameter, or enable all deprecated features, including those slated for removal, by providing the string "all" as the argument to this parameter. In the case that "all" or "none" is specified, multiple invocations of `-allowdeprecated` are not permitted. To explicitly enable only a specific set of deprecated features, use `-allowdeprecated=<flag1> -allowdeprecated=<flagN> ...` when starting zcashd. The following flags are recognized: - "all" - enables all deprecated features. - "none" - disables all deprecated features. - "legacy_privacy" - enables the use of the deprecated "legacy" privacy policy for z_sendmany. This causes the default behavior to conform to the `FullPrivacy` directive in all cases instead of just for transactions involving unified addresses. - "getnewaddress" - enables the `getnewaddress` RPC method. - "z_getnewaddress" - enables the `z_getnewaddress` RPC method. - "zcrawreceive" - enables the `zcrawreceive` RPC method. - "zcrawjoinsplit" - enables the `zcrawjoinsplit` RPC method. - "zcrawkeygen" - enables the `zcrawkeygen` RPC method. - "addrtype" - when this option is set, the deprecated `type` attribute is returned in addition to `pool` or `address_type` (which contain the same information) in the results of RPC methods that return address metadata.
2022-04-21 15:47:56 -07:00
if __name__ == '__main__':
WalletDeprecationTest().main()