Files
rippled/bin/sidechain/python/tests/door_test.py
2022-03-15 15:36:04 -04:00

118 lines
4.4 KiB
Python

from typing import Dict
from app import App
from common import XRP
from sidechain import Params
import sidechain
import test_utils
import time
from transaction import Payment
import tst_common
batch_test_num_accounts = 200
def door_test(mc_app: App, sc_app: App, params: Params):
# setup, create accounts on both chains
for i in range(batch_test_num_accounts):
name = "m_" + str(i)
account_main = mc_app.create_account(name)
name = "s_" + str(i)
account_side = sc_app.create_account(name)
mc_app(
Payment(account=params.genesis_account,
dst=account_main,
amt=XRP(20_000)))
mc_app.maybe_ledger_accept()
account_main_last = mc_app.account_from_alias("m_" +
str(batch_test_num_accounts -
1))
test_utils.wait_for_balance_change(mc_app, account_main_last, XRP(0),
XRP(20_000))
# test
to_side_xrp = XRP(1000)
to_main_xrp = XRP(100)
last_tx_xrp = XRP(343)
with test_utils.test_context(mc_app, sc_app, True):
# send xchain payment to open accounts on sidechain
for i in range(batch_test_num_accounts):
name_main = "m_" + str(i)
account_main = mc_app.account_from_alias(name_main)
name_side = "s_" + str(i)
account_side = sc_app.account_from_alias(name_side)
memos = [{
'Memo': {
'MemoData': account_side.account_id_str_as_hex()
}
}]
mc_app(
Payment(account=account_main,
dst=params.mc_door_account,
amt=to_side_xrp,
memos=memos))
while 1:
federator_info = sc_app.federator_info()
should_loop = False
for v in federator_info.values():
for c in ['mainchain', 'sidechain']:
state = v['info'][c]['listener_info']['state']
if state != 'normal':
should_loop = True
if not should_loop:
break
time.sleep(1)
# wait some time for the door to change
door_closing = False
door_reopened = False
for i in range(batch_test_num_accounts * 2 + 40):
server_index = [0]
federator_info = sc_app.federator_info(server_index)
for v in federator_info.values():
door_status = v['info']['mainchain']['door_status']['status']
if not door_closing:
if door_status != 'open':
door_closing = True
else:
if door_status == 'open':
door_reopened = True
if not door_reopened:
time.sleep(1)
mc_app.maybe_ledger_accept()
else:
break
if not door_reopened:
raise ValueError('Expected door status changes did not happen')
# wait for accounts created on sidechain
for i in range(batch_test_num_accounts):
name_side = "s_" + str(i)
account_side = sc_app.account_from_alias(name_side)
test_utils.wait_for_balance_change(sc_app, account_side, XRP(0),
to_side_xrp)
# # try one xchain payment, each direction
name_main = "m_" + str(0)
account_main = mc_app.account_from_alias(name_main)
name_side = "s_" + str(0)
account_side = sc_app.account_from_alias(name_side)
pre_bal = mc_app.get_balance(account_main, XRP(0))
sidechain.side_to_main_transfer(mc_app, sc_app, account_side,
account_main, to_main_xrp, params)
test_utils.wait_for_balance_change(mc_app, account_main, pre_bal,
to_main_xrp)
pre_bal = sc_app.get_balance(account_side, XRP(0))
sidechain.main_to_side_transfer(mc_app, sc_app, account_main,
account_side, last_tx_xrp, params)
test_utils.wait_for_balance_change(sc_app, account_side, pre_bal,
last_tx_xrp)
def test_door_operations(configs_dirs_dict: Dict[int, str]):
tst_common.test_start(configs_dirs_dict, door_test)