Skip to content

Commit 04c8c97

Browse files
committed
test: move helper get_mnemonic to test_framework/util
1 parent 1e70ee8 commit 04c8c97

File tree

3 files changed

+41
-53
lines changed

3 files changed

+41
-53
lines changed

test/functional/test_framework/util.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,29 @@ def force_finish_mnsync(node):
536536
while not node.mnsync("status")['IsSynced']:
537537
node.mnsync("next")
538538

539+
540+
def get_mnemonic(node):
541+
"""
542+
Return mnemonic if known from legacy HD wallets and Descriptor Wallets
543+
Raises exception if there is none.
544+
"""
545+
if not node.getwalletinfo()['descriptors']:
546+
return node.dumphdinfo()["mnemonic"]
547+
548+
mnemonic = None
549+
descriptors = node.listdescriptors(True)['descriptors']
550+
for desc in descriptors:
551+
if desc['desc'][:4] == 'pkh(':
552+
if mnemonic is None:
553+
mnemonic = desc['mnemonic']
554+
else:
555+
assert_equal(mnemonic, desc['mnemonic'])
556+
elif desc['desc'][:6] == 'combo(':
557+
assert 'mnemonic' not in desc
558+
else:
559+
raise AssertionError(f"Unknown descriptor type: {desc['desc']}")
560+
return mnemonic
561+
539562
# Transaction/Block functions
540563
#############################
541564

test/functional/wallet_mnemonicbits.py

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from test_framework.test_framework import BitcoinTestFramework
88
from test_framework.util import (
99
assert_equal,
10+
get_mnemonic,
1011
)
1112

1213
class WalletMnemonicbitsTest(BitcoinTestFramework):
@@ -17,24 +18,6 @@ def set_test_params(self):
1718
def skip_test_if_missing_module(self):
1819
self.skip_if_no_wallet()
1920

20-
def get_mnemonic(self, node):
21-
if not self.options.descriptors:
22-
return node.dumphdinfo()["mnemonic"]
23-
24-
mnemonic = None
25-
descriptors = node.listdescriptors(True)['descriptors']
26-
for desc in descriptors:
27-
if desc['desc'][:4] == 'pkh(':
28-
if mnemonic is None:
29-
mnemonic = desc['mnemonic']
30-
else:
31-
assert_equal(mnemonic, desc['mnemonic'])
32-
elif desc['desc'][:6] == 'combo(':
33-
assert 'mnemonic' not in desc
34-
else:
35-
raise AssertionError(f"Unknown descriptor type: {desc['desc']}")
36-
return mnemonic
37-
3821
def run_test(self):
3922
self.log.info("Test -mnemonicbits")
4023

@@ -43,7 +26,7 @@ def run_test(self):
4326
self.nodes[0].assert_start_raises_init_error(['-mnemonicbits=123'], "Error: Invalid '-mnemonicbits'. Allowed values: 128, 160, 192, 224, 256.")
4427
self.start_node(0)
4528

46-
mnemonic_pre = self.get_mnemonic(self.nodes[0])
29+
mnemonic_pre = get_mnemonic(self.nodes[0])
4730

4831

4932
self.nodes[0].encryptwallet('pass')
@@ -91,11 +74,11 @@ def run_test(self):
9174
self.nodes[0].createwallet("wallet_256", blank=True, descriptors=self.options.descriptors) # blank wallet
9275
self.nodes[0].get_wallet_rpc("wallet_256").upgradetohd()
9376

94-
assert_equal(len(self.get_mnemonic(self.nodes[0].get_wallet_rpc(self.default_wallet_name)).split()), 12) # 12 words by default
95-
assert_equal(len(self.get_mnemonic(self.nodes[0].get_wallet_rpc("wallet_160")).split()), 15) # 15 words
96-
assert_equal(len(self.get_mnemonic(self.nodes[0].get_wallet_rpc("wallet_192")).split()), 18) # 18 words
97-
assert_equal(len(self.get_mnemonic(self.nodes[0].get_wallet_rpc("wallet_224")).split()), 21) # 21 words
98-
assert_equal(len(self.get_mnemonic(self.nodes[0].get_wallet_rpc("wallet_256")).split()), 24) # 24 words
77+
assert_equal(len(get_mnemonic(self.nodes[0].get_wallet_rpc(self.default_wallet_name)).split()), 12) # 12 words by default
78+
assert_equal(len(get_mnemonic(self.nodes[0].get_wallet_rpc("wallet_160")).split()), 15) # 15 words
79+
assert_equal(len(get_mnemonic(self.nodes[0].get_wallet_rpc("wallet_192")).split()), 18) # 18 words
80+
assert_equal(len(get_mnemonic(self.nodes[0].get_wallet_rpc("wallet_224")).split()), 21) # 21 words
81+
assert_equal(len(get_mnemonic(self.nodes[0].get_wallet_rpc("wallet_256")).split()), 24) # 24 words
9982

10083

10184
if __name__ == '__main__':

test/functional/wallet_upgradetohd.py

Lines changed: 11 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from test_framework.util import (
1616
assert_equal,
1717
assert_raises_rpc_error,
18+
get_mnemonic,
1819
)
1920

2021

@@ -32,25 +33,6 @@ def setup_network(self):
3233
self.nodes[0].createwallet(self.default_wallet_name, blank=True, load_on_startup=True)
3334
self.nodes[0].importprivkey(privkey=self.nodes[0].get_deterministic_priv_key().key, label='coinbase', rescan=True)
3435

35-
# TODO: remove duplicated code with wallet_mnemonicbits.py
36-
def get_mnemonic(self, node):
37-
if not self.options.descriptors:
38-
return node.dumphdinfo()["mnemonic"]
39-
40-
mnemonic = None
41-
descriptors = node.listdescriptors(True)['descriptors']
42-
for desc in descriptors:
43-
if desc['desc'][:4] == 'pkh(':
44-
if mnemonic is None:
45-
mnemonic = desc['mnemonic']
46-
else:
47-
assert_equal(mnemonic, desc['mnemonic'])
48-
elif desc['desc'][:6] == 'combo(':
49-
assert 'mnemonic' not in desc
50-
else:
51-
raise AssertionError(f"Unknown descriptor type: {desc['desc']}")
52-
return mnemonic
53-
5436
def recover_non_hd(self):
5537
self.log.info("Recover non-HD wallet to check different upgrade paths")
5638
node = self.nodes[0]
@@ -68,7 +50,7 @@ def run_test(self):
6850
assert 'hdchainid' not in node.getwalletinfo()
6951
balance_before = node.getbalance()
7052
assert node.upgradetohd()
71-
mnemonic = self.get_mnemonic(node)
53+
mnemonic = get_mnemonic(node)
7254
if not self.options.descriptors:
7355
chainid = node.getwalletinfo()['hdchainid']
7456
assert_equal(len(chainid), 64)
@@ -104,7 +86,7 @@ def run_test(self):
10486

10587
self.log.info("No mnemonic, no mnemonic passphrase, no wallet passphrase, should result in completely different keys")
10688
assert node.upgradetohd()
107-
assert mnemonic != self.get_mnemonic(node)
89+
assert mnemonic != get_mnemonic(node)
10890
if not self.options.descriptors:
10991
assert chainid != node.getwalletinfo()['hdchainid']
11092
assert_equal(balance_non_HD, node.getbalance())
@@ -119,7 +101,7 @@ def run_test(self):
119101
self.restart_node(0, extra_args=['-keypool=10'])
120102
assert node.upgradetohd("", "", "", True)
121103
# Completely different keys, no HD coins should be recovered
122-
assert mnemonic != self.get_mnemonic(node)
104+
assert mnemonic != get_mnemonic(node)
123105
if not self.options.descriptors:
124106
assert chainid != node.getwalletinfo()['hdchainid']
125107
assert_equal(balance_non_HD, node.getbalance())
@@ -129,7 +111,7 @@ def run_test(self):
129111
self.log.info("Same mnemonic, another mnemonic passphrase, no wallet passphrase, should result in a different set of keys")
130112
new_mnemonic_passphrase = "somewords"
131113
assert node.upgradetohd(mnemonic, new_mnemonic_passphrase)
132-
assert_equal(mnemonic, self.get_mnemonic(node))
114+
assert_equal(mnemonic, get_mnemonic(node))
133115
if not self.options.descriptors:
134116
new_chainid = node.getwalletinfo()['hdchainid']
135117
assert chainid != new_chainid
@@ -144,7 +126,7 @@ def run_test(self):
144126

145127
self.log.info("Same mnemonic, another mnemonic passphrase, no wallet passphrase, should result in a different set of keys (again)")
146128
assert node.upgradetohd(mnemonic, new_mnemonic_passphrase)
147-
assert_equal(mnemonic, self.get_mnemonic(node))
129+
assert_equal(mnemonic, get_mnemonic(node))
148130
if not self.options.descriptors:
149131
assert_equal(new_chainid, node.getwalletinfo()['hdchainid'])
150132
assert_equal(balance_non_HD, node.getbalance())
@@ -158,7 +140,7 @@ def run_test(self):
158140

159141
self.log.info("Same mnemonic, no mnemonic passphrase, no wallet passphrase, should recover all coins after rescan")
160142
assert node.upgradetohd(mnemonic)
161-
assert_equal(mnemonic, self.get_mnemonic(node))
143+
assert_equal(mnemonic, get_mnemonic(node))
162144
if not self.options.descriptors:
163145
assert_equal(chainid, node.getwalletinfo()['hdchainid'])
164146
node.keypoolrefill(5)
@@ -171,7 +153,7 @@ def run_test(self):
171153
self.log.info("Same mnemonic, no mnemonic passphrase, no wallet passphrase, large enough keepool, should recover all coins with no extra rescan")
172154
self.restart_node(0, extra_args=['-keypool=10'])
173155
assert node.upgradetohd(mnemonic)
174-
assert_equal(mnemonic, self.get_mnemonic(node))
156+
assert_equal(mnemonic, get_mnemonic(node))
175157
if not self.options.descriptors:
176158
assert_equal(chainid, node.getwalletinfo()['hdchainid'])
177159
# All coins should be recovered
@@ -182,7 +164,7 @@ def run_test(self):
182164
self.log.info("Same mnemonic, no mnemonic passphrase, no wallet passphrase, large enough keepool, rescan is skipped initially, should recover all coins after rescanblockchain")
183165
self.restart_node(0, extra_args=['-keypool=10'])
184166
assert node.upgradetohd(mnemonic, "", "", False)
185-
assert_equal(mnemonic, self.get_mnemonic(node))
167+
assert_equal(mnemonic, get_mnemonic(node))
186168
if not self.options.descriptors:
187169
assert_equal(chainid, node.getwalletinfo()['hdchainid'])
188170
assert balance_after != node.getbalance()
@@ -200,7 +182,7 @@ def run_test(self):
200182
self.start_node(0, extra_args=['-rescan'])
201183
assert_raises_rpc_error(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.", node.dumphdinfo)
202184
node.walletpassphrase(walletpass, 100)
203-
assert_equal(mnemonic, self.get_mnemonic(node))
185+
assert_equal(mnemonic, get_mnemonic(node))
204186
if not self.options.descriptors:
205187
assert_equal(chainid, node.getwalletinfo()['hdchainid'])
206188
# Note: wallet encryption results in additional keypool topup,
@@ -237,7 +219,7 @@ def run_test(self):
237219
else:
238220
assert_raises_rpc_error(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.", node.listdescriptors, True)
239221
node.walletpassphrase(walletpass, 100)
240-
assert_equal(mnemonic, self.get_mnemonic(node))
222+
assert_equal(mnemonic, get_mnemonic(node))
241223
if not self.options.descriptors:
242224
assert_equal(chainid, node.getwalletinfo()['hdchainid'])
243225
# Note: wallet encryption results in additional keypool topup,

0 commit comments

Comments
 (0)