98 lines
3.8 KiB
Python
98 lines
3.8 KiB
Python
|
import asyncio
|
||
|
import logging
|
||
|
from torba.testcase import IntegrationTestCase, WalletNode
|
||
|
from torba.client.constants import CENT
|
||
|
|
||
|
|
||
|
class SyncTests(IntegrationTestCase):
|
||
|
|
||
|
VERBOSITY = logging.INFO
|
||
|
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
super().__init__(*args, **kwargs)
|
||
|
self.api_port = 5280
|
||
|
self.started_nodes = []
|
||
|
|
||
|
async def asyncTearDown(self):
|
||
|
for node in self.started_nodes:
|
||
|
try:
|
||
|
await node.stop(cleanup=True)
|
||
|
except Exception as e:
|
||
|
print(e)
|
||
|
await super().asyncTearDown()
|
||
|
|
||
|
async def make_wallet_node(self, seed=None):
|
||
|
self.api_port += 1
|
||
|
wallet_node = WalletNode(
|
||
|
self.wallet_node.manager_class,
|
||
|
self.wallet_node.ledger_class,
|
||
|
api_port=self.api_port
|
||
|
)
|
||
|
await wallet_node.start(seed)
|
||
|
self.started_nodes.append(wallet_node)
|
||
|
return wallet_node
|
||
|
|
||
|
async def test_nodes_with_same_account_stay_in_sync(self):
|
||
|
# destination node/account for receiving TXs
|
||
|
node0 = await self.make_wallet_node()
|
||
|
account0 = node0.account
|
||
|
# main node/account creating TXs
|
||
|
node1 = self.wallet_node
|
||
|
account1 = self.wallet_node.account
|
||
|
# mirror node/account, expected to reflect everything in main node as it happens
|
||
|
node2 = await self.make_wallet_node(account1.seed)
|
||
|
account2 = node2.account
|
||
|
|
||
|
self.assertNotEqual(account0.id, account1.id)
|
||
|
self.assertEqual(account1.id, account2.id)
|
||
|
await self.assertBalance(account0, '0.0')
|
||
|
await self.assertBalance(account1, '0.0')
|
||
|
await self.assertBalance(account2, '0.0')
|
||
|
self.assertEqual(await account0.get_address_count(chain=0), 20)
|
||
|
self.assertEqual(await account1.get_address_count(chain=0), 20)
|
||
|
self.assertEqual(await account2.get_address_count(chain=0), 20)
|
||
|
self.assertEqual(await account1.get_address_count(chain=1), 6)
|
||
|
self.assertEqual(await account2.get_address_count(chain=1), 6)
|
||
|
|
||
|
# check that main node and mirror node generate 5 address to fill gap
|
||
|
fifth_address = (await account1.receiving.get_addresses())[4]
|
||
|
await self.blockchain.send_to_address(fifth_address, 1.00)
|
||
|
await asyncio.wait([
|
||
|
account1.ledger.on_address.first,
|
||
|
account2.ledger.on_address.first
|
||
|
])
|
||
|
self.assertEqual(await account1.get_address_count(chain=0), 25)
|
||
|
self.assertEqual(await account2.get_address_count(chain=0), 25)
|
||
|
await self.assertBalance(account1, '1.0')
|
||
|
await self.assertBalance(account2, '1.0')
|
||
|
|
||
|
await self.blockchain.generate(1)
|
||
|
|
||
|
# pay 0.01 from main node to receiving node, would have increased change addresses
|
||
|
address0 = (await account0.receiving.get_addresses())[0]
|
||
|
hash0 = self.ledger.address_to_hash160(address0)
|
||
|
tx = await account1.ledger.transaction_class.create(
|
||
|
[],
|
||
|
[self.ledger.transaction_class.output_class.pay_pubkey_hash(CENT, hash0)],
|
||
|
[account1], account1
|
||
|
)
|
||
|
await self.broadcast(tx)
|
||
|
await asyncio.wait([
|
||
|
account0.ledger.wait(tx),
|
||
|
account1.ledger.wait(tx),
|
||
|
account2.ledger.wait(tx),
|
||
|
])
|
||
|
self.assertEqual(await account0.get_address_count(chain=0), 21)
|
||
|
self.assertGreater(await account1.get_address_count(chain=1), 6)
|
||
|
self.assertGreater(await account2.get_address_count(chain=1), 6)
|
||
|
await self.assertBalance(account0, '0.01')
|
||
|
await self.assertBalance(account1, '0.989876')
|
||
|
await self.assertBalance(account2, '0.989876')
|
||
|
|
||
|
await self.blockchain.generate(1)
|
||
|
|
||
|
# create a new mirror node and see if it syncs to same balance from scratch
|
||
|
node3 = await self.make_wallet_node(account1.seed)
|
||
|
account3 = node3.account
|
||
|
await self.assertBalance(account3, '0.989876')
|