mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
cc1f8db725
3c3e31c3a4 [tests] Add wallet-tool test (João Barbosa) 49d2374acf [tools] Add wallet inspection and modification tool (Jonas Schnelli) Pull request description: Adds an offline tool `bitcoin-wallet-tool` for wallet creation and maintenance. Currently this tool can create a new wallet file, display information on an existing wallet, and run the salvage and zapwallettxes maintenance tasks on an existing wallet. It can later be extended to support other common wallet maintenance tasks. Doing wallet maintenance tasks in an offline tool makes much more sense (and is potentially safer) than having to spin up a full node. Tree-SHA512: 75a28b8a58858d9d76c7532db40eacdefc5714ea5aab536fb1dc9756e2f7d750d69d68d59c50a68e633ce38fb5b8c3e3d4880db30fe01561e07ce58d42bceb2b
115 lines
4.0 KiB
Python
Executable File
115 lines
4.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2018 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 dash-wallet."""
|
|
import subprocess
|
|
import textwrap
|
|
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import assert_equal
|
|
|
|
class ToolWalletTest(BitcoinTestFramework):
|
|
def set_test_params(self):
|
|
self.num_nodes = 1
|
|
self.setup_clean_chain = True
|
|
|
|
def skip_test_if_missing_module(self):
|
|
self.skip_if_no_wallet()
|
|
|
|
def dash_wallet_process(self, *args):
|
|
binary = self.config["environment"]["BUILDDIR"] + '/src/dash-wallet' + self.config["environment"]["EXEEXT"]
|
|
args = ['-datadir={}'.format(self.nodes[0].datadir), '-regtest'] + list(args)
|
|
return subprocess.Popen([binary] + args, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
|
|
|
|
def assert_raises_tool_error(self, error, *args):
|
|
p = self.dash_wallet_process(*args)
|
|
stdout, stderr = p.communicate()
|
|
assert_equal(p.poll(), 1)
|
|
assert_equal(stdout, '')
|
|
assert_equal(stderr.strip(), error)
|
|
|
|
def assert_tool_output(self, output, *args):
|
|
p = self.dash_wallet_process(*args)
|
|
stdout, stderr = p.communicate()
|
|
assert_equal(p.poll(), 0)
|
|
assert_equal(stderr, '')
|
|
assert_equal(stdout, output)
|
|
|
|
def run_test(self):
|
|
|
|
self.assert_raises_tool_error('Invalid command: foo', 'foo')
|
|
# `dash-wallet help` is an error. Use `dash-wallet -help`
|
|
self.assert_raises_tool_error('Invalid command: help', 'help')
|
|
self.assert_raises_tool_error('Error: two methods provided (info and create). Only one method should be provided.', 'info', 'create')
|
|
self.assert_raises_tool_error('Error parsing command line arguments: Invalid parameter -foo', '-foo')
|
|
self.assert_raises_tool_error('Error loading wallet.dat. Is wallet being used by other process?', '-wallet=wallet.dat', 'info')
|
|
self.assert_raises_tool_error('Error: no wallet file at nonexistent.dat', '-wallet=nonexistent.dat', 'info')
|
|
|
|
# stop the node to close the wallet to call info command
|
|
self.stop_node(0)
|
|
|
|
out = textwrap.dedent('''\
|
|
Wallet info
|
|
===========
|
|
Encrypted: no
|
|
HD (hd seed available): no
|
|
Keypool Size: 1
|
|
Transactions: 0
|
|
Address Book: 0
|
|
''')
|
|
self.assert_tool_output(out, '-wallet=wallet.dat', 'info')
|
|
|
|
self.start_node(0)
|
|
self.nodes[0].upgradetohd()
|
|
self.stop_node(0)
|
|
|
|
out = textwrap.dedent('''\
|
|
Wallet info
|
|
===========
|
|
Encrypted: no
|
|
HD (hd seed available): yes
|
|
Keypool Size: 2
|
|
Transactions: 0
|
|
Address Book: 0
|
|
''')
|
|
self.assert_tool_output(out, '-wallet=wallet.dat', 'info')
|
|
|
|
# mutate the wallet to check the info command output changes accordingly
|
|
self.start_node(0)
|
|
self.nodes[0].generate(1)
|
|
self.stop_node(0)
|
|
|
|
out = textwrap.dedent('''\
|
|
Wallet info
|
|
===========
|
|
Encrypted: no
|
|
HD (hd seed available): yes
|
|
Keypool Size: 1
|
|
Transactions: 1
|
|
Address Book: 0
|
|
''')
|
|
self.assert_tool_output(out, '-wallet=wallet.dat', 'info')
|
|
|
|
out = textwrap.dedent('''\
|
|
Topping up keypool...
|
|
Wallet info
|
|
===========
|
|
Encrypted: no
|
|
HD (hd seed available): no
|
|
Keypool Size: 1000
|
|
Transactions: 0
|
|
Address Book: 0
|
|
''')
|
|
self.assert_tool_output(out, '-wallet=foo', 'create')
|
|
|
|
self.start_node(0, ['-wallet=foo'])
|
|
out = self.nodes[0].getwalletinfo()
|
|
self.stop_node(0)
|
|
|
|
assert_equal(0, out['txcount'])
|
|
assert_equal(1000, out['keypoolsize'])
|
|
|
|
if __name__ == '__main__':
|
|
ToolWalletTest().main()
|