dash/test/functional/feature_governance_objects.py

84 lines
4.6 KiB
Python
Executable File

#!/usr/bin/env python3
# Copyright (c) 2018-2020 The Dash Core developers
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Tests around dash governance objects."""
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
def validate_object(prepared, rpc_prepared):
assert_equal(prepared["parentHash"], rpc_prepared["parentHash"])
assert_equal(prepared["collateralHash"], rpc_prepared["collateralHash"])
assert_equal(prepared["createdAt"], rpc_prepared["createdAt"])
assert_equal(prepared["revision"], rpc_prepared["revision"])
assert_equal(prepared["hex"], rpc_prepared["data"]["hex"])
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):
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):
time_start = time.time()
object_type = 1 # GOVERNANCE PROPOSAL
# At start there should be no prepared objects available
assert_equal(len(self.nodes[0].gobject("list-prepared")), 0)
# Create 5 proposals with different creation times and validate their ordered like expected
p1 = self.prepare_object(object_type, uint256_to_string(0), time_start, 0, "SortByTime1", 1)
p2 = self.prepare_object(object_type, uint256_to_string(0), time_start + 10, 1000, "SortByTime2", 10)
p3 = self.prepare_object(object_type, uint256_to_string(0), time_start - 10, 1000000000, "SortByTime3", 20)
p4 = self.prepare_object(object_type, uint256_to_string(0), time_start + 1, -20, "SortByTime4", 400)
p5 = self.prepare_object(object_type, uint256_to_string(0), time_start + 30, 1, "SortByTime5", 100000000)
rpc_list_prepared = self.nodes[0].gobject("list-prepared")
assert_equal(len(rpc_list_prepared), 5)
expected_order = [p3, p1, p4, p2, p5]
for i in range(len(expected_order)):
validate_object(expected_order[i], rpc_list_prepared[i])
# Create two more with the same time
self.prepare_object(object_type, uint256_to_string(0), time_start + 60, 1, "SameTime1", 2)
self.prepare_object(object_type, uint256_to_string(0), time_start + 60, 2, "SameTime2", 2)
# Query them with count=2
rpc_list_prepared = self.nodes[0].gobject("list-prepared", 2)
# And make sure it does only return 2 of the 7 available
assert_equal(len(rpc_list_prepared), 2)
# Since they have the same time they should be sorted by hex data, in this case, the second should be greater
assert_greater_than(rpc_list_prepared[1]["data"]["hex"], rpc_list_prepared[0]["data"]["hex"])
# Restart node0 and make sure it still contains all valid proposals after restart
rpc_full_list_pre_restart = self.nodes[0].gobject("list-prepared")
self.restart_node(0)
rpc_full_list_post_restart = self.nodes[0].gobject("list-prepared")
assert_equal(rpc_full_list_pre_restart, rpc_full_list_post_restart)
# Create more objects so that we have a total of 11
self.prepare_object(object_type, uint256_to_string(0), time_start, 0, "More1", 1)
self.prepare_object(object_type, uint256_to_string(0), time_start, 0, "More2", 1)
self.prepare_object(object_type, uint256_to_string(0), time_start, 0, "More3", 1)
self.prepare_object(object_type, uint256_to_string(0), time_start, 0, "More4", 1)
# Make sure default count is 10 while there are 11 in total
assert_equal(len(self.nodes[0].gobject("list-prepared")), 10)
assert_equal(len(self.nodes[0].gobject("list-prepared", 12)), 11)
# Make sure it returns 0 objects with count=0
assert_equal(len(self.nodes[0].gobject("list-prepared", 0)), 0)
# And test some invalid count values
assert_raises_rpc_error(-8, "Negative count", self.nodes[0].gobject, "list-prepared", -1)
assert_raises_rpc_error(-8, "Negative count", self.nodes[0].gobject, "list-prepared", -1000)
if __name__ == '__main__':
DashGovernanceTest().main()