Changeset View
Changeset View
Standalone View
Standalone View
test/functional/receivedby.py
#!/usr/bin/env python3 | #!/usr/bin/env python3 | ||||
# Copyright (c) 2014-2016 The Bitcoin Core developers | # Copyright (c) 2014-2016 The Bitcoin Core developers | ||||
# Distributed under the MIT software license, see the accompanying | # Distributed under the MIT software license, see the accompanying | ||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php. | # file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
# Exercise the listreceivedbyaddress API | """Test the listreceivedbyaddress RPC.""" | ||||
from decimal import Decimal | |||||
from test_framework.test_framework import BitcoinTestFramework | from test_framework.test_framework import BitcoinTestFramework | ||||
from test_framework.util import * | from test_framework.util import assert_array_result, assert_equal | ||||
def get_sub_array_from_array(object_array, to_match): | |||||
''' | |||||
Finds and returns a sub array from an array of arrays. | |||||
to_match should be a unique idetifier of a sub array | |||||
''' | |||||
for item in object_array: | |||||
all_match = True | |||||
for key, value in to_match.items(): | |||||
if item[key] != value: | |||||
all_match = False | |||||
if not all_match: | |||||
continue | |||||
return item | |||||
return [] | |||||
class ReceivedByTest(BitcoinTestFramework): | class ReceivedByTest(BitcoinTestFramework): | ||||
def set_test_params(self): | def set_test_params(self): | ||||
self.num_nodes = 2 | self.num_nodes = 2 | ||||
def run_test(self): | def run_test(self): | ||||
''' | # Generate block to get out of IBD | ||||
listreceivedbyaddress Test | self.nodes[0].generate(1) | ||||
''' | |||||
self.log.info("listreceivedbyaddress Test") | |||||
# Send from node 0 to 1 | # Send from node 0 to 1 | ||||
addr = self.nodes[1].getnewaddress() | addr = self.nodes[1].getnewaddress() | ||||
txid = self.nodes[0].sendtoaddress(addr, 0.1) | txid = self.nodes[0].sendtoaddress(addr, 0.1) | ||||
self.sync_all() | self.sync_all() | ||||
# Check not listed in listreceivedbyaddress because has 0 confirmations | # Check not listed in listreceivedbyaddress because has 0 confirmations | ||||
assert_array_result(self.nodes[1].listreceivedbyaddress(), | assert_array_result(self.nodes[1].listreceivedbyaddress(), | ||||
{"address": addr}, | {"address": addr}, | ||||
{}, | {}, | ||||
True) | True) | ||||
# Bury Tx under 10 block so it will be returned by | |||||
# listreceivedbyaddress | # Bury Tx under 10 block so it will be returned by listreceivedbyaddress | ||||
self.nodes[1].generate(10) | self.nodes[1].generate(10) | ||||
self.sync_all() | self.sync_all() | ||||
assert_array_result(self.nodes[1].listreceivedbyaddress(), | assert_array_result(self.nodes[1].listreceivedbyaddress(), | ||||
{"address": addr}, | {"address": addr}, | ||||
{"address": addr, "account": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]}) | {"address": addr, "account": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]}) | ||||
# With min confidence < 10 | # With min confidence < 10 | ||||
assert_array_result(self.nodes[1].listreceivedbyaddress(5), | assert_array_result(self.nodes[1].listreceivedbyaddress(5), | ||||
{"address": addr}, | {"address": addr}, | ||||
{"address": addr, "account": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]}) | {"address": addr, "account": "", "amount": Decimal("0.1"), "confirmations": 10, "txids": [txid, ]}) | ||||
# With min confidence > 10, should not find Tx | # With min confidence > 10, should not find Tx | ||||
assert_array_result( | assert_array_result(self.nodes[1].listreceivedbyaddress(11), { | ||||
self.nodes[1].listreceivedbyaddress(11), {"address": addr}, {}, True) | "address": addr}, {}, True) | ||||
# Empty Tx | # Empty Tx | ||||
addr = self.nodes[1].getnewaddress() | addr = self.nodes[1].getnewaddress() | ||||
assert_array_result(self.nodes[1].listreceivedbyaddress(0, True), | assert_array_result(self.nodes[1].listreceivedbyaddress(0, True), | ||||
{"address": addr}, | {"address": addr}, | ||||
{"address": addr, "account": "", "amount": 0, "confirmations": 0, "txids": []}) | {"address": addr, "account": "", "amount": 0, "confirmations": 0, "txids": []}) | ||||
''' | self.log.info("getreceivedbyaddress Test") | ||||
getreceivedbyaddress Test | |||||
''' | |||||
# Send from node 0 to 1 | # Send from node 0 to 1 | ||||
addr = self.nodes[1].getnewaddress() | addr = self.nodes[1].getnewaddress() | ||||
txid = self.nodes[0].sendtoaddress(addr, 0.1) | txid = self.nodes[0].sendtoaddress(addr, 0.1) | ||||
self.sync_all() | self.sync_all() | ||||
# Check balance is 0 because of 0 confirmations | # Check balance is 0 because of 0 confirmations | ||||
balance = self.nodes[1].getreceivedbyaddress(addr) | balance = self.nodes[1].getreceivedbyaddress(addr) | ||||
if balance != Decimal("0.0"): | assert_equal(balance, Decimal("0.0")) | ||||
raise AssertionError( | |||||
"Wrong balance returned by getreceivedbyaddress, %0.2f" % (balance)) | |||||
# Check balance is 0.1 | # Check balance is 0.1 | ||||
balance = self.nodes[1].getreceivedbyaddress(addr, 0) | balance = self.nodes[1].getreceivedbyaddress(addr, 0) | ||||
if balance != Decimal("0.1"): | assert_equal(balance, Decimal("0.1")) | ||||
raise AssertionError( | |||||
"Wrong balance returned by getreceivedbyaddress, %0.2f" % (balance)) | |||||
# Bury Tx under 10 block so it will be returned by the default | # Bury Tx under 10 block so it will be returned by the default getreceivedbyaddress | ||||
# getreceivedbyaddress | |||||
self.nodes[1].generate(10) | self.nodes[1].generate(10) | ||||
self.sync_all() | self.sync_all() | ||||
balance = self.nodes[1].getreceivedbyaddress(addr) | balance = self.nodes[1].getreceivedbyaddress(addr) | ||||
if balance != Decimal("0.1"): | assert_equal(balance, Decimal("0.1")) | ||||
raise AssertionError( | |||||
"Wrong balance returned by getreceivedbyaddress, %0.2f" % (balance)) | self.log.info("listreceivedbyaccount + getreceivedbyaccount Test") | ||||
''' | |||||
listreceivedbyaccount + getreceivedbyaccount Test | |||||
''' | |||||
# set pre-state | # set pre-state | ||||
addrArr = self.nodes[1].getnewaddress() | addrArr = self.nodes[1].getnewaddress() | ||||
account = self.nodes[1].getaccount(addrArr) | account = self.nodes[1].getaccount(addrArr) | ||||
received_by_account_json = get_sub_array_from_array( | received_by_account_json = [ | ||||
self.nodes[1].listreceivedbyaccount(), {"account": account}) | r for r in self.nodes[1].listreceivedbyaccount() if r["account"] == account][0] | ||||
if len(received_by_account_json) == 0: | |||||
raise AssertionError("No accounts found in node") | |||||
balance_by_account = self.nodes[1].getreceivedbyaccount(account) | balance_by_account = self.nodes[1].getreceivedbyaccount(account) | ||||
txid = self.nodes[0].sendtoaddress(addr, 0.1) | txid = self.nodes[0].sendtoaddress(addr, 0.1) | ||||
self.sync_all() | self.sync_all() | ||||
# listreceivedbyaccount should return received_by_account_json because | # listreceivedbyaccount should return received_by_account_json because | ||||
# of 0 confirmations | # of 0 confirmations | ||||
assert_array_result(self.nodes[1].listreceivedbyaccount(), | assert_array_result(self.nodes[1].listreceivedbyaccount(), | ||||
{"account": account}, | {"account": account}, | ||||
received_by_account_json) | received_by_account_json) | ||||
# getreceivedbyaddress should return same balance because of 0 | # getreceivedbyaddress should return same balance because of 0 | ||||
# confirmations | # confirmations | ||||
balance = self.nodes[1].getreceivedbyaccount(account) | balance = self.nodes[1].getreceivedbyaccount(account) | ||||
if balance != balance_by_account: | assert_equal(balance, balance_by_account) | ||||
raise AssertionError( | |||||
"Wrong balance returned by getreceivedbyaccount, %0.2f" % (balance)) | |||||
self.nodes[1].generate(10) | self.nodes[1].generate(10) | ||||
self.sync_all() | self.sync_all() | ||||
# listreceivedbyaccount should return updated account balance | # listreceivedbyaccount should return updated account balance | ||||
assert_array_result(self.nodes[1].listreceivedbyaccount(), | assert_array_result(self.nodes[1].listreceivedbyaccount(), | ||||
{"account": account}, | {"account": account}, | ||||
{"account": received_by_account_json["account"], "amount": (received_by_account_json["amount"] + Decimal("0.1"))}) | {"account": received_by_account_json["account"], "amount": (received_by_account_json["amount"] + Decimal("0.1"))}) | ||||
# getreceivedbyaddress should return updates balance | # getreceivedbyaddress should return updates balance | ||||
balance = self.nodes[1].getreceivedbyaccount(account) | balance = self.nodes[1].getreceivedbyaccount(account) | ||||
if balance != balance_by_account + Decimal("0.1"): | assert_equal(balance, balance_by_account + Decimal("0.1")) | ||||
raise AssertionError( | |||||
"Wrong balance returned by getreceivedbyaccount, %0.2f" % (balance)) | |||||
# Create a new account named "mynewaccount" that has a 0 balance | # Create a new account named "mynewaccount" that has a 0 balance | ||||
self.nodes[1].getaccountaddress("mynewaccount") | self.nodes[1].getaccountaddress("mynewaccount") | ||||
received_by_account_json = get_sub_array_from_array( | received_by_account_json = [r for r in self.nodes[1].listreceivedbyaccount( | ||||
self.nodes[1].listreceivedbyaccount(0, True), {"account": "mynewaccount"}) | 0, True) if r["account"] == "mynewaccount"][0] | ||||
if len(received_by_account_json) == 0: | |||||
raise AssertionError("No accounts found in node") | |||||
# Test includeempty of listreceivedbyaccount | # Test includeempty of listreceivedbyaccount | ||||
if received_by_account_json["amount"] != Decimal("0.0"): | assert_equal(received_by_account_json["amount"], Decimal("0.0")) | ||||
raise AssertionError("Wrong balance returned by listreceivedbyaccount, %0.2f" % | |||||
(received_by_account_json["amount"])) | |||||
# Test getreceivedbyaccount for 0 amount accounts | # Test getreceivedbyaccount for 0 amount accounts | ||||
balance = self.nodes[1].getreceivedbyaccount("mynewaccount") | balance = self.nodes[1].getreceivedbyaccount("mynewaccount") | ||||
if balance != Decimal("0.0"): | assert_equal(balance, Decimal("0.0")) | ||||
raise AssertionError( | |||||
"Wrong balance returned by getreceivedbyaccount, %0.2f" % (balance)) | |||||
if __name__ == '__main__': | if __name__ == '__main__': | ||||
ReceivedByTest().main() | ReceivedByTest().main() |