Skip to content

Commit 8d99377

Browse files
committed
tests: add receiving functional test
1 parent 6030dc8 commit 8d99377

File tree

3 files changed

+125
-2
lines changed

3 files changed

+125
-2
lines changed

test/functional/test_framework/test_node.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -903,10 +903,10 @@ def __getattr__(self, name):
903903
def createwallet_passthrough(self, *args, **kwargs):
904904
return self.__getattr__("createwallet")(*args, **kwargs)
905905

906-
def createwallet(self, wallet_name, disable_private_keys=None, blank=None, passphrase='', avoid_reuse=None, descriptors=None, load_on_startup=None, external_signer=None):
906+
def createwallet(self, wallet_name, disable_private_keys=None, blank=None, passphrase='', avoid_reuse=None, descriptors=None, load_on_startup=None, external_signer=None, silent_payment=None):
907907
if descriptors is None:
908908
descriptors = self.descriptors
909-
return self.__getattr__('createwallet')(wallet_name, disable_private_keys, blank, passphrase, avoid_reuse, descriptors, load_on_startup, external_signer)
909+
return self.__getattr__('createwallet')(wallet_name, disable_private_keys, blank, passphrase, avoid_reuse, descriptors, load_on_startup, external_signer, silent_payment)
910910

911911
def importprivkey(self, privkey, label=None, rescan=None):
912912
wallet_info = self.getwalletinfo()

test/functional/test_runner.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,7 @@
203203
'mempool_reorg.py',
204204
'p2p_block_sync.py --v1transport',
205205
'p2p_block_sync.py --v2transport',
206+
'wallet_silentpayments_receiving.py --descriptors',
206207
'wallet_createwallet.py --legacy-wallet',
207208
'wallet_createwallet.py --usecli',
208209
'wallet_createwallet.py --descriptors',
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
#!/usr/bin/env python3
2+
3+
from test_framework.test_framework import BitcoinTestFramework
4+
from test_framework.util import (
5+
assert_approx,
6+
assert_equal,
7+
assert_raises_rpc_error,
8+
)
9+
10+
11+
class SilentPaymentsReceivingTest(BitcoinTestFramework):
12+
def add_options(self, parser):
13+
self.add_wallet_options(parser, legacy=False)
14+
15+
def set_test_params(self):
16+
self.setup_clean_chain = True
17+
self.num_nodes = 1
18+
19+
def skip_test_if_missing_module(self):
20+
self.skip_if_no_wallet()
21+
self.skip_if_no_sqlite()
22+
23+
def test_encrypt_and_decrypt(self):
24+
self.log.info("Check that a silent payments wallet can be encrypted and decrypted")
25+
self.log.info("Create encrypted wallet")
26+
self.nodes[0].createwallet(wallet_name="sp_encrypted", passphrase="unsigned integer", silent_payment=True)
27+
wallet = self.nodes[0].get_wallet_rpc("sp_encrypted")
28+
addr = wallet.getnewaddress(address_type="silent-payment")
29+
self.def_wallet.sendtoaddress(addr, 10)
30+
self.generate(self.nodes[0], 1)
31+
self.log.info("Check that we can scan without the wallet being unlocked")
32+
assert_equal(wallet.getbalance(), 10)
33+
self.log.info("Check that we get an error if trying to send with the wallet locked")
34+
assert_raises_rpc_error(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.", wallet.sendtoaddress, addr, 9)
35+
wallet.walletpassphrase(passphrase="unsigned integer", timeout=3)
36+
self.log.info("Unlock wallet and send")
37+
wallet.sendtoaddress(addr, 9)
38+
self.generate(self.nodes[0], 1)
39+
assert_approx(wallet.getbalance(), 10, 0.0001)
40+
41+
def test_encrypting_unencrypted(self):
42+
self.log.info("Check that a silent payments wallet can be encrypted after creation")
43+
self.log.info("Create un-encrypted wallet")
44+
self.nodes[0].createwallet(wallet_name="sp_unencrypted", silent_payment=True)
45+
wallet = self.nodes[0].get_wallet_rpc("sp_unencrypted")
46+
addr = wallet.getnewaddress(address_type="silent-payment")
47+
self.def_wallet.sendtoaddress(addr, 10)
48+
self.generate(self.nodes[0], 1)
49+
assert_equal(wallet.getbalance(), 10)
50+
self.log.info("Add a passphrase to the wallet")
51+
wallet.encryptwallet(passphrase="unsigned integer")
52+
self.log.info("Check that we get an error if trying to send with the wallet locked")
53+
assert_raises_rpc_error(-13, "Error: Please enter the wallet passphrase with walletpassphrase first.", wallet.sendtoaddress, addr, 9)
54+
wallet.walletpassphrase(passphrase="unsigned integer", timeout=3)
55+
self.log.info("Unlock wallet and send")
56+
wallet.sendtoaddress(addr, 9)
57+
self.generate(self.nodes[0], 1)
58+
assert_approx(wallet.getbalance(), 10, 0.0001)
59+
60+
def test_createwallet(self):
61+
self.log.info("Check createwallet silent payments option")
62+
63+
self.nodes[0].createwallet(wallet_name="sp", silent_payment=True)
64+
wallet = self.nodes[0].get_wallet_rpc("sp")
65+
addr = wallet.getnewaddress(address_type="silent-payment")
66+
assert addr.startswith("sp")
67+
68+
self.nodes[0].createwallet(wallet_name="non_sp", silent_payment=False)
69+
wallet = self.nodes[0].get_wallet_rpc("non_sp")
70+
assert_raises_rpc_error(-12, "Error: No silent-payment addresses available", wallet.getnewaddress, address_type="silent-payment")
71+
72+
if self.is_bdb_compiled():
73+
assert_raises_rpc_error(-4, "Wallet with silent payments must also be a descriptor wallet", self.nodes[0].createwallet, wallet_name="legacy_sp", descriptors=False, silent_payment=True)
74+
75+
self.nodes[0].createwallet(wallet_name="legacy_sp", descriptors=False)
76+
wallet = self.nodes[0].get_wallet_rpc("legacy_sp")
77+
assert_raises_rpc_error(-12, "Error: No silent-payment addresses available", wallet.getnewaddress, address_type="silent-payment")
78+
79+
def test_basic(self):
80+
self.log.info("Basic receive and send")
81+
82+
self.nodes[0].createwallet(wallet_name="basic", silent_payment=True)
83+
wallet = self.nodes[0].get_wallet_rpc("basic")
84+
85+
addr = wallet.getnewaddress(address_type="silent-payment")
86+
txid = self.def_wallet.sendtoaddress(addr, 10)
87+
self.generate(self.nodes[0], 1)
88+
89+
assert_equal(wallet.getbalance(), 10)
90+
wallet.gettransaction(txid)
91+
92+
self.log.info("Test getnewaddress returns new labelled address")
93+
new_addr = wallet.getnewaddress(address_type="silent-payment")
94+
assert new_addr != addr
95+
txid = self.def_wallet.sendtoaddress(new_addr, 10)
96+
self.generate(self.nodes[0], 1)
97+
98+
assert_equal(wallet.getbalance(), 20)
99+
wallet.gettransaction(txid)
100+
101+
self.log.info("Test self-transfer")
102+
txid = wallet.send({addr: 5})
103+
self.generate(self.nodes[0], 1)
104+
assert_approx(wallet.getbalance(), 20, 0.0001)
105+
106+
wallet.sendall([self.def_wallet.getnewaddress()])
107+
self.generate(self.nodes[0], 1)
108+
109+
assert_equal(wallet.getbalance(), 0)
110+
111+
def run_test(self):
112+
self.def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
113+
self.generate(self.nodes[0], 101)
114+
115+
self.test_createwallet()
116+
self.test_encrypt_and_decrypt()
117+
self.test_encrypting_unencrypted()
118+
self.test_basic()
119+
120+
121+
if __name__ == '__main__':
122+
SilentPaymentsReceivingTest().main()

0 commit comments

Comments
 (0)