mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 12:02:48 +01:00
refactor: move common duplicated code to test_framework/governance.py
This commit is contained in:
parent
f16b998632
commit
291716a8b4
@ -8,6 +8,7 @@ import json
|
|||||||
|
|
||||||
from test_framework.messages import uint256_to_string
|
from test_framework.messages import uint256_to_string
|
||||||
from test_framework.test_framework import DashTestFramework
|
from test_framework.test_framework import DashTestFramework
|
||||||
|
from test_framework.governance import have_trigger_for_height, prepare_object
|
||||||
from test_framework.util import assert_equal, satoshi_round, set_node_times, wait_until_helper
|
from test_framework.util import assert_equal, satoshi_round, set_node_times, wait_until_helper
|
||||||
|
|
||||||
class DashGovernanceTest (DashTestFramework):
|
class DashGovernanceTest (DashTestFramework):
|
||||||
@ -16,29 +17,6 @@ class DashGovernanceTest (DashTestFramework):
|
|||||||
# using adjusted v20 deployment params to test an edge case where superblock maturity window is equal to deployment window size
|
# using adjusted v20 deployment params to test an edge case where superblock maturity window is equal to deployment window size
|
||||||
self.set_dash_test_params(6, 5, [["-budgetparams=10:10:10", f"-vbparams=v20:{self.v20_start_time}:999999999999:0:10:8:6:5:0"]] * 6, fast_dip3_enforcement=True)
|
self.set_dash_test_params(6, 5, [["-budgetparams=10:10:10", f"-vbparams=v20:{self.v20_start_time}:999999999999:0:10:8:6:5:0"]] * 6, fast_dip3_enforcement=True)
|
||||||
|
|
||||||
def prepare_object(self, object_type, parent_hash, creation_time, revision, name, amount, payment_address):
|
|
||||||
proposal_rev = revision
|
|
||||||
proposal_time = int(creation_time)
|
|
||||||
proposal_template = {
|
|
||||||
"type": object_type,
|
|
||||||
"name": name,
|
|
||||||
"start_epoch": proposal_time,
|
|
||||||
"end_epoch": proposal_time + 24 * 60 * 60,
|
|
||||||
"payment_amount": float(amount),
|
|
||||||
"payment_address": payment_address,
|
|
||||||
"url": "https://dash.org"
|
|
||||||
}
|
|
||||||
proposal_hex = ''.join(format(x, '02x') for x in json.dumps(proposal_template).encode())
|
|
||||||
collateral_hash = self.nodes[0].gobject("prepare", parent_hash, proposal_rev, proposal_time, proposal_hex)
|
|
||||||
return {
|
|
||||||
"parentHash": parent_hash,
|
|
||||||
"collateralHash": collateral_hash,
|
|
||||||
"createdAt": proposal_time,
|
|
||||||
"revision": proposal_rev,
|
|
||||||
"hex": proposal_hex,
|
|
||||||
"data": proposal_template,
|
|
||||||
}
|
|
||||||
|
|
||||||
def check_superblockbudget(self, v20_active):
|
def check_superblockbudget(self, v20_active):
|
||||||
v20_state = self.nodes[0].getblockchaininfo()["softforks"]["v20"]
|
v20_state = self.nodes[0].getblockchaininfo()["softforks"]["v20"]
|
||||||
assert_equal(v20_state["active"], v20_active)
|
assert_equal(v20_state["active"], v20_active)
|
||||||
@ -77,18 +55,6 @@ class DashGovernanceTest (DashTestFramework):
|
|||||||
|
|
||||||
assert_equal(payments_found, 2)
|
assert_equal(payments_found, 2)
|
||||||
|
|
||||||
def have_trigger_for_height(self, sb_block_height):
|
|
||||||
count = 0
|
|
||||||
for node in self.nodes:
|
|
||||||
valid_triggers = node.gobject("list", "valid", "triggers")
|
|
||||||
for trigger in list(valid_triggers.values()):
|
|
||||||
if json.loads(trigger["DataString"])["event_block_height"] != sb_block_height:
|
|
||||||
continue
|
|
||||||
if trigger['AbsoluteYesCount'] > 0:
|
|
||||||
count = count + 1
|
|
||||||
break
|
|
||||||
return count == len(self.nodes)
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
governance_info = self.nodes[0].getgovernanceinfo()
|
governance_info = self.nodes[0].getgovernanceinfo()
|
||||||
assert_equal(governance_info['governanceminquorum'], 1)
|
assert_equal(governance_info['governanceminquorum'], 1)
|
||||||
@ -152,9 +118,9 @@ class DashGovernanceTest (DashTestFramework):
|
|||||||
self.p1_amount = satoshi_round("3.3")
|
self.p1_amount = satoshi_round("3.3")
|
||||||
self.p2_amount = self.expected_v20_budget - self.p1_amount
|
self.p2_amount = self.expected_v20_budget - self.p1_amount
|
||||||
|
|
||||||
p0_collateral_prepare = self.prepare_object(1, uint256_to_string(0), proposal_time, 1, "Proposal_0", self.p0_amount, self.p0_payout_address)
|
p0_collateral_prepare = prepare_object(self.nodes[0], 1, uint256_to_string(0), proposal_time, 1, "Proposal_0", self.p0_amount, self.p0_payout_address)
|
||||||
p1_collateral_prepare = self.prepare_object(1, uint256_to_string(0), proposal_time, 1, "Proposal_1", self.p1_amount, self.p1_payout_address)
|
p1_collateral_prepare = prepare_object(self.nodes[0], 1, uint256_to_string(0), proposal_time, 1, "Proposal_1", self.p1_amount, self.p1_payout_address)
|
||||||
p2_collateral_prepare = self.prepare_object(1, uint256_to_string(0), proposal_time, 1, "Proposal_2", self.p2_amount, self.p2_payout_address)
|
p2_collateral_prepare = prepare_object(self.nodes[0], 1, uint256_to_string(0), proposal_time, 1, "Proposal_2", self.p2_amount, self.p2_payout_address)
|
||||||
|
|
||||||
self.nodes[0].generate(6)
|
self.nodes[0].generate(6)
|
||||||
self.bump_mocktime(6)
|
self.bump_mocktime(6)
|
||||||
@ -348,7 +314,7 @@ class DashGovernanceTest (DashTestFramework):
|
|||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
self.sync_blocks()
|
self.sync_blocks()
|
||||||
# Wait for new trigger and votes
|
# Wait for new trigger and votes
|
||||||
self.wait_until(lambda: self.have_trigger_for_height(260))
|
self.wait_until(lambda: have_trigger_for_height(self.nodes, 260))
|
||||||
# Mine superblock
|
# Mine superblock
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
@ -364,7 +330,7 @@ class DashGovernanceTest (DashTestFramework):
|
|||||||
self.sync_blocks()
|
self.sync_blocks()
|
||||||
# Wait for new trigger and votes
|
# Wait for new trigger and votes
|
||||||
sb_block_height = 260 + (i + 1) * sb_cycle
|
sb_block_height = 260 + (i + 1) * sb_cycle
|
||||||
self.wait_until(lambda: self.have_trigger_for_height(sb_block_height))
|
self.wait_until(lambda: have_trigger_for_height(self.nodes, sb_block_height))
|
||||||
# Mine superblock
|
# Mine superblock
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
self.bump_mocktime(1)
|
self.bump_mocktime(1)
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
|
|
||||||
|
from test_framework.governance import have_trigger_for_height
|
||||||
from test_framework.messages import uint256_to_string
|
from test_framework.messages import uint256_to_string
|
||||||
from test_framework.test_framework import DashTestFramework
|
from test_framework.test_framework import DashTestFramework
|
||||||
from test_framework.util import assert_equal, force_finish_mnsync, satoshi_round
|
from test_framework.util import assert_equal, force_finish_mnsync, satoshi_round
|
||||||
@ -37,20 +38,6 @@ class DashGovernanceTest (DashTestFramework):
|
|||||||
"data": proposal_template,
|
"data": proposal_template,
|
||||||
}
|
}
|
||||||
|
|
||||||
def have_trigger_for_height(self, sb_block_height, nodes = None):
|
|
||||||
if nodes is None:
|
|
||||||
nodes = self.nodes
|
|
||||||
count = 0
|
|
||||||
for node in nodes:
|
|
||||||
valid_triggers = node.gobject("list", "valid", "triggers")
|
|
||||||
for trigger in list(valid_triggers.values()):
|
|
||||||
if json.loads(trigger["DataString"])["event_block_height"] != sb_block_height:
|
|
||||||
continue
|
|
||||||
if trigger['AbsoluteYesCount'] > 0:
|
|
||||||
count = count + 1
|
|
||||||
break
|
|
||||||
return count == len(nodes)
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
sb_cycle = 20
|
sb_cycle = 20
|
||||||
|
|
||||||
@ -123,7 +110,7 @@ class DashGovernanceTest (DashTestFramework):
|
|||||||
|
|
||||||
self.log.info("Wait for new trigger and votes on non-isolated nodes")
|
self.log.info("Wait for new trigger and votes on non-isolated nodes")
|
||||||
sb_block_height = self.nodes[0].getblockcount() + 1
|
sb_block_height = self.nodes[0].getblockcount() + 1
|
||||||
self.wait_until(lambda: self.have_trigger_for_height(sb_block_height, self.nodes[0:5]))
|
self.wait_until(lambda: have_trigger_for_height(self.nodes[0:5], sb_block_height))
|
||||||
# Mine superblock
|
# Mine superblock
|
||||||
self.nodes[0].generate(1)
|
self.nodes[0].generate(1)
|
||||||
self.bump_mocktime(156)
|
self.bump_mocktime(156)
|
||||||
|
@ -4,9 +4,9 @@
|
|||||||
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
"""Tests around dash governance objects."""
|
"""Tests around dash governance objects."""
|
||||||
|
|
||||||
import json
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
from test_framework.governance import prepare_object
|
||||||
from test_framework.messages import uint256_to_string
|
from test_framework.messages import uint256_to_string
|
||||||
from test_framework.test_framework import DashTestFramework
|
from test_framework.test_framework import DashTestFramework
|
||||||
from test_framework.util import assert_equal, assert_greater_than, assert_raises_rpc_error
|
from test_framework.util import assert_equal, assert_greater_than, assert_raises_rpc_error
|
||||||
@ -21,33 +21,13 @@ def validate_object(prepared, rpc_prepared):
|
|||||||
del rpc_prepared["data"]["hex"]
|
del rpc_prepared["data"]["hex"]
|
||||||
assert_equal(prepared["data"], rpc_prepared["data"])
|
assert_equal(prepared["data"], rpc_prepared["data"])
|
||||||
|
|
||||||
|
|
||||||
class DashGovernanceTest (DashTestFramework):
|
class DashGovernanceTest (DashTestFramework):
|
||||||
def set_test_params(self):
|
def set_test_params(self):
|
||||||
self.set_dash_test_params(2, 1)
|
self.set_dash_test_params(2, 1)
|
||||||
|
|
||||||
def prepare_object(self, object_type, parent_hash, creation_time, revision, name, amount):
|
def prepare_object(self, object_type, parent_hash, creation_time, revision, name, amount):
|
||||||
proposal_rev = revision
|
payment_address = self.nodes[0].getnewaddress()
|
||||||
proposal_time = int(creation_time)
|
return prepare_object(self.nodes[0], object_type, parent_hash, creation_time, revision, name, amount, payment_address)
|
||||||
proposal_template = {
|
|
||||||
"type": object_type,
|
|
||||||
"name": name,
|
|
||||||
"start_epoch": proposal_time,
|
|
||||||
"end_epoch": proposal_time + 24 * 60 * 60,
|
|
||||||
"payment_amount": amount,
|
|
||||||
"payment_address": self.nodes[0].getnewaddress(),
|
|
||||||
"url": "https://dash.org"
|
|
||||||
}
|
|
||||||
proposal_hex = ''.join(format(x, '02x') for x in json.dumps(proposal_template).encode())
|
|
||||||
collateral_hash = self.nodes[0].gobject("prepare", parent_hash, proposal_rev, proposal_time, proposal_hex)
|
|
||||||
return {
|
|
||||||
"parentHash": parent_hash,
|
|
||||||
"collateralHash": collateral_hash,
|
|
||||||
"createdAt": proposal_time,
|
|
||||||
"revision": proposal_rev,
|
|
||||||
"hex": proposal_hex,
|
|
||||||
"data": proposal_template,
|
|
||||||
}
|
|
||||||
|
|
||||||
def run_test(self):
|
def run_test(self):
|
||||||
|
|
||||||
|
43
test/functional/test_framework/governance.py
Normal file
43
test/functional/test_framework/governance.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# Copyright (c) 2018-2024 The Dash Core developers
|
||||||
|
# Distributed under the MIT software license, see the accompanying
|
||||||
|
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||||||
|
"""Utils for dash governance tests."""
|
||||||
|
|
||||||
|
import json
|
||||||
|
|
||||||
|
def prepare_object(node, object_type, parent_hash, creation_time, revision, name, amount, payment_address):
|
||||||
|
proposal_rev = revision
|
||||||
|
proposal_time = int(creation_time)
|
||||||
|
proposal_template = {
|
||||||
|
"type": object_type,
|
||||||
|
"name": name,
|
||||||
|
"start_epoch": proposal_time,
|
||||||
|
"end_epoch": proposal_time + 24 * 60 * 60,
|
||||||
|
"payment_amount": float(amount),
|
||||||
|
"payment_address": payment_address,
|
||||||
|
"url": "https://dash.org"
|
||||||
|
}
|
||||||
|
proposal_hex = ''.join(format(x, '02x') for x in json.dumps(proposal_template).encode())
|
||||||
|
collateral_hash = node.gobject("prepare", parent_hash, proposal_rev, proposal_time, proposal_hex)
|
||||||
|
return {
|
||||||
|
"parentHash": parent_hash,
|
||||||
|
"collateralHash": collateral_hash,
|
||||||
|
"createdAt": proposal_time,
|
||||||
|
"revision": proposal_rev,
|
||||||
|
"hex": proposal_hex,
|
||||||
|
"data": proposal_template,
|
||||||
|
}
|
||||||
|
|
||||||
|
def have_trigger_for_height(nodes, sb_block_height):
|
||||||
|
count = 0
|
||||||
|
for node in nodes:
|
||||||
|
valid_triggers = node.gobject("list", "valid", "triggers")
|
||||||
|
for trigger in list(valid_triggers.values()):
|
||||||
|
if json.loads(trigger["DataString"])["event_block_height"] != sb_block_height:
|
||||||
|
continue
|
||||||
|
if trigger['AbsoluteYesCount'] > 0:
|
||||||
|
count = count + 1
|
||||||
|
break
|
||||||
|
return count == len(nodes)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user