diff --git a/test/functional/feature_governance.py b/test/functional/feature_governance.py index 2eb261572f..0a18328c92 100755 --- a/test/functional/feature_governance.py +++ b/test/functional/feature_governance.py @@ -8,6 +8,7 @@ import json from test_framework.messages import uint256_to_string 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 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 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): v20_state = self.nodes[0].getblockchaininfo()["softforks"]["v20"] assert_equal(v20_state["active"], v20_active) @@ -77,18 +55,6 @@ class DashGovernanceTest (DashTestFramework): 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): governance_info = self.nodes[0].getgovernanceinfo() assert_equal(governance_info['governanceminquorum'], 1) @@ -152,9 +118,9 @@ class DashGovernanceTest (DashTestFramework): self.p1_amount = satoshi_round("3.3") 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) - p1_collateral_prepare = self.prepare_object(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) + 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 = 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 = 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.bump_mocktime(6) @@ -348,7 +314,7 @@ class DashGovernanceTest (DashTestFramework): self.bump_mocktime(1) self.sync_blocks() # 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 self.nodes[0].generate(1) self.bump_mocktime(1) @@ -364,7 +330,7 @@ class DashGovernanceTest (DashTestFramework): self.sync_blocks() # Wait for new trigger and votes 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 self.nodes[0].generate(1) self.bump_mocktime(1) diff --git a/test/functional/feature_governance_cl.py b/test/functional/feature_governance_cl.py index 1076970976..b75b516cac 100755 --- a/test/functional/feature_governance_cl.py +++ b/test/functional/feature_governance_cl.py @@ -6,6 +6,7 @@ import json +from test_framework.governance import have_trigger_for_height from test_framework.messages import uint256_to_string from test_framework.test_framework import DashTestFramework from test_framework.util import assert_equal, force_finish_mnsync, satoshi_round @@ -37,20 +38,6 @@ class DashGovernanceTest (DashTestFramework): "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): sb_cycle = 20 @@ -123,7 +110,7 @@ class DashGovernanceTest (DashTestFramework): self.log.info("Wait for new trigger and votes on non-isolated nodes") 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 self.nodes[0].generate(1) self.bump_mocktime(156) diff --git a/test/functional/feature_governance_objects.py b/test/functional/feature_governance_objects.py index 5dae7e0beb..612123c6e3 100755 --- a/test/functional/feature_governance_objects.py +++ b/test/functional/feature_governance_objects.py @@ -4,9 +4,9 @@ # file COPYING or http://www.opensource.org/licenses/mit-license.php. """Tests around dash governance objects.""" -import json import time +from test_framework.governance import prepare_object from test_framework.messages import uint256_to_string from test_framework.test_framework import DashTestFramework 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"] assert_equal(prepared["data"], rpc_prepared["data"]) - class DashGovernanceTest (DashTestFramework): def set_test_params(self): self.set_dash_test_params(2, 1) def prepare_object(self, object_type, parent_hash, creation_time, revision, name, amount): - 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": 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, - } + payment_address = self.nodes[0].getnewaddress() + return prepare_object(self.nodes[0], object_type, parent_hash, creation_time, revision, name, amount, payment_address) def run_test(self): diff --git a/test/functional/test_framework/governance.py b/test/functional/test_framework/governance.py new file mode 100644 index 0000000000..2132fb3a27 --- /dev/null +++ b/test/functional/test_framework/governance.py @@ -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) +