You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

multiwallet.py 3.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #!/usr/bin/env python3
  2. # Copyright (c) 2017 The Bitcoin Core developers
  3. # Distributed under the MIT software license, see the accompanying
  4. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
  5. """Test multiwallet.
  6. Verify that a bitcoind node can load multiple wallet files
  7. """
  8. import os
  9. import shutil
  10. from test_framework.test_framework import BitcoinTestFramework
  11. from test_framework.util import assert_equal, assert_raises_rpc_error
  12. class MultiWalletTest(BitcoinTestFramework):
  13. def set_test_params(self):
  14. self.setup_clean_chain = True
  15. self.num_nodes = 1
  16. self.extra_args = [['-wallet=w1', '-wallet=w2', '-wallet=w3']]
  17. def run_test(self):
  18. assert_equal(set(self.nodes[0].listwallets()), {"w1", "w2", "w3"})
  19. self.stop_node(0)
  20. # should not initialize if there are duplicate wallets
  21. self.assert_start_raises_init_error(0, ['-wallet=w1', '-wallet=w1'], 'Error loading wallet w1. Duplicate -wallet filename specified.')
  22. # should not initialize if wallet file is a directory
  23. os.mkdir(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w11'))
  24. self.assert_start_raises_init_error(0, ['-wallet=w11'], 'Error loading wallet w11. -wallet filename must be a regular file.')
  25. # should not initialize if one wallet is a copy of another
  26. shutil.copyfile(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w2'),
  27. os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w22'))
  28. self.assert_start_raises_init_error(0, ['-wallet=w2', '-wallet=w22'], 'duplicates fileid')
  29. # should not initialize if wallet file is a symlink
  30. os.symlink(os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w1'), os.path.join(self.options.tmpdir, 'node0', 'regtest', 'w12'))
  31. self.assert_start_raises_init_error(0, ['-wallet=w12'], 'Error loading wallet w12. -wallet filename must be a regular file.')
  32. self.start_node(0, self.extra_args[0])
  33. w1 = self.nodes[0].get_wallet_rpc("w1")
  34. w2 = self.nodes[0].get_wallet_rpc("w2")
  35. w3 = self.nodes[0].get_wallet_rpc("w3")
  36. wallet_bad = self.nodes[0].get_wallet_rpc("bad")
  37. w1.generate(1)
  38. # accessing invalid wallet fails
  39. assert_raises_rpc_error(-18, "Requested wallet does not exist or is not loaded", wallet_bad.getwalletinfo)
  40. # accessing wallet RPC without using wallet endpoint fails
  41. assert_raises_rpc_error(-19, "Wallet file not specified", self.nodes[0].getwalletinfo)
  42. # check w1 wallet balance
  43. w1_info = w1.getwalletinfo()
  44. assert_equal(w1_info['immature_balance'], 50)
  45. w1_name = w1_info['walletname']
  46. assert_equal(w1_name, "w1")
  47. # check w2 wallet balance
  48. w2_info = w2.getwalletinfo()
  49. assert_equal(w2_info['immature_balance'], 0)
  50. w2_name = w2_info['walletname']
  51. assert_equal(w2_name, "w2")
  52. w3_name = w3.getwalletinfo()['walletname']
  53. assert_equal(w3_name, "w3")
  54. assert_equal({"w1", "w2", "w3"}, {w1_name, w2_name, w3_name})
  55. w1.generate(101)
  56. assert_equal(w1.getbalance(), 100)
  57. assert_equal(w2.getbalance(), 0)
  58. assert_equal(w3.getbalance(), 0)
  59. w1.sendtoaddress(w2.getnewaddress(), 1)
  60. w1.sendtoaddress(w3.getnewaddress(), 2)
  61. w1.generate(1)
  62. assert_equal(w2.getbalance(), 1)
  63. assert_equal(w3.getbalance(), 2)
  64. if __name__ == '__main__':
  65. MultiWalletTest().main()