mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 12:32:48 +01:00
d94092b60b
* Fix spork syncing issue in sporks tests https://github.com/dashpay/dash/pull/2522 caused an issue with sporks syncing in tests. The introduced time check in CMasternodeSync::ProcessTick causes masternode sync to never start when mocktime is enabled, so this commit disables mocktime for sporks.py. Disabling mocktime however leads to fInitialDownload never becoming false in CMasternodeSync::UpdatedBlockTip, so mnsync is never started. To fix this, the tests now create a block before connecting the last node. This however doesn't work because node1 will ignore the "getheaders" request from node2 as it has not finished mnsync yet...so we also have to force finish mnsync for node1. * Also respond with getdata for announced sporks while in IBD There was never a good reason to ignore spork announcements while in IBD. At the same time, this poses the risk of missing out on sporks while in IBD. This also fixes an issue in sporks testing, as nodes did not request for announced sporks. * Use wait_to_sync instead of custom loop
95 lines
3.2 KiB
Python
Executable File
95 lines
3.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# Copyright (c) 2018 The Dash Core developers
|
|
# Distributed under the MIT software license, see the accompanying
|
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
from test_framework.mininode import *
|
|
from test_framework.test_framework import BitcoinTestFramework
|
|
from test_framework.util import *
|
|
from time import *
|
|
|
|
'''
|
|
'''
|
|
|
|
class SporkTest(BitcoinTestFramework):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.num_nodes = 3
|
|
self.setup_clean_chain = True
|
|
self.is_network_split = False
|
|
|
|
def setup_network(self):
|
|
disable_mocktime()
|
|
self.nodes = []
|
|
self.nodes.append(start_node(0, self.options.tmpdir,
|
|
["-debug", "-sporkkey=cP4EKFyJsHT39LDqgdcB43Y3YXjNyjb5Fuas1GQSeAtjnZWmZEQK"]))
|
|
self.nodes.append(start_node(1, self.options.tmpdir,
|
|
["-debug"]))
|
|
self.nodes.append(start_node(2, self.options.tmpdir,
|
|
["-debug"]))
|
|
# connect only 2 first nodes at start
|
|
connect_nodes(self.nodes[0], 1)
|
|
|
|
def get_test_spork_state(self, node):
|
|
info = node.spork('active')
|
|
# use InstantSend spork for tests
|
|
return info['SPORK_2_INSTANTSEND_ENABLED']
|
|
|
|
def set_test_spork_state(self, node, state):
|
|
if state:
|
|
value = 0
|
|
else:
|
|
value = 4070908800
|
|
# use InstantSend spork for tests
|
|
node.spork('SPORK_2_INSTANTSEND_ENABLED', value)
|
|
|
|
def run_test(self):
|
|
# check test spork default state
|
|
assert(self.get_test_spork_state(self.nodes[0]))
|
|
assert(self.get_test_spork_state(self.nodes[1]))
|
|
assert(self.get_test_spork_state(self.nodes[2]))
|
|
|
|
# check spork propagation for connected nodes
|
|
self.set_test_spork_state(self.nodes[0], False)
|
|
start = time()
|
|
sent = False
|
|
while True:
|
|
if not self.get_test_spork_state(self.nodes[1]):
|
|
sent = True
|
|
break
|
|
if time() > start + 10:
|
|
break
|
|
sleep(0.1)
|
|
assert(sent)
|
|
|
|
# restart nodes to check spork persistence
|
|
stop_node(self.nodes[0], 0)
|
|
stop_node(self.nodes[1], 1)
|
|
self.nodes[0] = start_node(0, self.options.tmpdir, ["-debug"])
|
|
self.nodes[1] = start_node(1, self.options.tmpdir, ["-debug"])
|
|
assert(not self.get_test_spork_state(self.nodes[0]))
|
|
assert(not self.get_test_spork_state(self.nodes[1]))
|
|
|
|
# Force finish mnsync node as otherwise it will never send out headers to other peers
|
|
wait_to_sync(self.nodes[1], fast_mnsync=True)
|
|
|
|
# Generate one block to kick off masternode sync, which also starts sporks syncing for node2
|
|
self.nodes[1].generate(1)
|
|
|
|
# connect new node and check spork propagation after restoring from cache
|
|
connect_nodes(self.nodes[1], 2)
|
|
start = time()
|
|
sent = False
|
|
while True:
|
|
if not self.get_test_spork_state(self.nodes[2]):
|
|
sent = True
|
|
break
|
|
if time() > start + 10:
|
|
break
|
|
sleep(0.1)
|
|
assert(sent)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
SporkTest().main()
|