changeset 26724:9d8565ce78ae

[qa] Make import-rescan.py watchonly check reliable Send payments during the test from a different node than the node generating keys to be imported, so the spending node doesn't create transactions that inadvertently involve (spend funds from) the imported keys. Fixes #9826
author Russell Yanofsky <russ@yanofsky.org>
date Thu, 23 Feb 2017 13:05:40 -0500
parents f9e290155672
children f563b742362e
files qa/rpc-tests/import-rescan.py
diffstat 1 files changed, 18 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/qa/rpc-tests/import-rescan.py	Wed Feb 22 13:03:37 2017 +0100
+++ b/qa/rpc-tests/import-rescan.py	Thu Feb 23 13:05:40 2017 -0500
@@ -5,11 +5,11 @@
 """Test rescan behavior of importaddress, importpubkey, importprivkey, and
 importmulti RPCs with different types of keys and rescan options.
 
-In the first part of the test, node 0 creates an address for each type of
-import RPC call and sends BTC to it. Then other nodes import the addresses,
-and the test makes listtransactions and getbalance calls to confirm that the
-importing node either did or did not execute rescans picking up the send
-transactions.
+In the first part of the test, node 1 creates an address for each type of
+import RPC call and node 0 sends BTC to it. Then other nodes import the
+addresses, and the test makes listtransactions and getbalance calls to confirm
+that the importing node either did or did not execute rescans picking up the
+send transactions.
 
 In the second part of the test, node 0 sends more BTC to each address, and the
 test makes more listtransactions and getbalance calls to confirm that the
@@ -81,6 +81,12 @@
             assert_equal(tx["txid"], txid)
             assert_equal(tx["confirmations"], confirmations)
             assert_equal("trusted" not in tx, True)
+            # Verify the transaction is correctly marked watchonly depending on
+            # whether the transaction pays to an imported public key or
+            # imported private key. The test setup ensures that transaction
+            # inputs will not be from watchonly keys (important because
+            # involvesWatchonly will be true if either the transaction output
+            # or inputs are watchonly).
             if self.data != Data.priv:
                 assert_equal(tx["involvesWatchonly"], True)
             else:
@@ -106,11 +112,11 @@
 class ImportRescanTest(BitcoinTestFramework):
     def __init__(self):
         super().__init__()
-        self.num_nodes = 1 + len(IMPORT_NODES)
+        self.num_nodes = 2 + len(IMPORT_NODES)
 
     def setup_network(self):
         extra_args = [["-debug=1"] for _ in range(self.num_nodes)]
-        for i, import_node in enumerate(IMPORT_NODES, 1):
+        for i, import_node in enumerate(IMPORT_NODES, 2):
             if import_node.prune:
                 extra_args[i] += ["-prune=1"]
 
@@ -123,9 +129,9 @@
         # each possible type of wallet import RPC.
         for i, variant in enumerate(IMPORT_VARIANTS):
             variant.label = "label {} {}".format(i, variant)
-            variant.address = self.nodes[0].validateaddress(self.nodes[0].getnewaddress(variant.label))
-            variant.key = self.nodes[0].dumpprivkey(variant.address["address"])
-            variant.initial_amount = 25 - (i + 1) / 4.0
+            variant.address = self.nodes[1].validateaddress(self.nodes[1].getnewaddress(variant.label))
+            variant.key = self.nodes[1].dumpprivkey(variant.address["address"])
+            variant.initial_amount = 10 - (i + 1) / 4.0
             variant.initial_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.initial_amount)
 
         # Generate a block containing the initial transactions, then another
@@ -142,7 +148,7 @@
         for variant in IMPORT_VARIANTS:
             variant.expect_disabled = variant.rescan == Rescan.yes and variant.prune and variant.call == Call.single
             expect_rescan = variant.rescan == Rescan.yes and not variant.expect_disabled
-            variant.node = self.nodes[1 + IMPORT_NODES.index(ImportNode(variant.prune, expect_rescan))]
+            variant.node = self.nodes[2 + IMPORT_NODES.index(ImportNode(variant.prune, expect_rescan))]
             variant.do_import(timestamp)
             if expect_rescan:
                 variant.expected_balance = variant.initial_amount
@@ -156,7 +162,7 @@
         # Create new transactions sending to each address.
         fee = self.nodes[0].getnetworkinfo()["relayfee"]
         for i, variant in enumerate(IMPORT_VARIANTS):
-            variant.sent_amount = 25 - (2 * i + 1) / 8.0
+            variant.sent_amount = 10 - (2 * i + 1) / 8.0
             variant.sent_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.sent_amount)
 
         # Generate a block containing the new transactions.