github.com/platonnetwork/platon-go@v0.7.6/cases/tests/conftest.py (about) 1 import time 2 from typing import List 3 import pytest 4 from copy import copy 5 from tests.lib import StakingConfig 6 from common.log import log 7 from tests.lib.client import Client, get_client_by_nodeid, get_clients_by_nodeid 8 from tests.lib.utils import get_pledge_list, wait_block_number, assert_code, upload_platon 9 10 11 @pytest.fixture() 12 def global_running_env(global_test_env): 13 cfg = global_test_env.cfg 14 genesis = global_test_env.genesis_config 15 backup_cfg = copy(cfg) 16 id_cfg = id(cfg) 17 if not global_test_env.running: 18 log.info("The environment is not running, redeploying the environment") 19 global_test_env.deploy_all() 20 yield global_test_env 21 if id_cfg != id(global_test_env.cfg) or id(genesis) != id(global_test_env.genesis_config): 22 log.info("Environment configuration changes, restore configuration files and redeploy") 23 global_test_env.set_cfg(backup_cfg) 24 global_test_env.deploy_all() 25 26 27 @pytest.fixture() 28 def staking_cfg(): 29 cfg = StakingConfig("externalId", "nodeName", "website", "details") 30 return cfg 31 32 33 def get_clients(env, cfg=None): 34 if cfg is None: 35 cfg = StakingConfig("externalId", "nodeName", "website", "details") 36 all_clients = [] 37 all_nodes = env.get_all_nodes() 38 for node_obj in all_nodes: 39 all_clients.append(Client(env, node_obj, cfg)) 40 return all_clients 41 42 43 @pytest.fixture() 44 def all_clients(global_running_env, staking_cfg) -> List[Client]: 45 """ 46 Get all node Node object list 47 """ 48 return get_clients(global_running_env, staking_cfg) 49 50 51 def get_consensus_clients(env, cfg): 52 clients_consensus = [] 53 consensus_nodes = env.consensus_node_list 54 for node in consensus_nodes: 55 clients_consensus.append(Client(env, node, cfg)) 56 return clients_consensus 57 58 59 @pytest.fixture() 60 def clients_consensus(global_running_env, staking_cfg) -> List[Client]: 61 """ 62 Get all consensus node Client object list 63 """ 64 return get_consensus_clients(global_running_env, staking_cfg) 65 66 67 def get_clients_noconsensus(env, cfg): 68 client_noconsensus = [] 69 noconsensus_nodes = env.normal_node_list 70 for node_obj in noconsensus_nodes: 71 client_noconsensus.append(Client(env, node_obj, cfg)) 72 return client_noconsensus 73 74 75 @pytest.fixture() 76 def clients_noconsensus(global_running_env, staking_cfg) -> List[Client]: 77 """ 78 Get all noconsensus node Client object list 79 """ 80 return get_clients_noconsensus(global_running_env, staking_cfg) 81 82 83 def get_client_consensus(env, cfg): 84 consensus_node = env.get_rand_node() 85 client_consensus = Client(env, consensus_node, cfg) 86 return client_consensus 87 88 89 @pytest.fixture() 90 def client_consensus(global_running_env, staking_cfg) -> Client: 91 """ 92 Get a consensus node Client object 93 """ 94 return get_client_consensus(global_running_env, staking_cfg) 95 96 97 @pytest.fixture() 98 def client_noconsensus(global_running_env, staking_cfg) -> Client: 99 """ 100 Get a noconsensus node Client object 101 """ 102 noconsensus_node = global_running_env.get_a_normal_node() 103 client_noconsensus = Client(global_running_env, noconsensus_node, staking_cfg) 104 return client_noconsensus 105 106 107 @pytest.fixture() 108 def client_verifier(global_running_env, staking_cfg) -> Client: 109 """ 110 Get a verifier node Client object 111 """ 112 all_clients = get_clients(global_running_env, staking_cfg) 113 verifier_list = get_pledge_list(all_clients[0].ppos.getVerifierList) 114 log.info('verifierlist{}'.format(verifier_list)) 115 for client in all_clients: 116 if client.node.node_id in verifier_list: 117 return client 118 raise Exception('Get a verifier node Client object ') 119 120 121 @pytest.fixture() 122 def clients_verifier(global_running_env, staking_cfg) -> List[Client]: 123 """ 124 Get verifier node Client object list 125 """ 126 all_clients = get_clients(global_running_env, staking_cfg) 127 verifier_list = get_pledge_list(all_clients[0].ppos.getVerifierList) 128 log.info('verifierlist{}'.format(verifier_list)) 129 return get_clients_by_nodeid(verifier_list, all_clients) 130 131 132 @pytest.fixture() 133 def client_new_node(global_running_env, staking_cfg) -> Client: 134 """ 135 Get a new node Client object list 136 """ 137 normal_node = global_running_env.get_a_normal_node() 138 for noconsensus_node in global_running_env.normal_node_list: 139 msg = noconsensus_node.ppos.getCandidateInfo(noconsensus_node.node_id) 140 log.info(noconsensus_node.node_id) 141 if msg["Code"] == 301204: 142 log.info("Current linked node: {}".format(noconsensus_node.node_mark)) 143 return Client(global_running_env, noconsensus_node, staking_cfg) 144 log.info('noconsensus node has been staked, restart the chain') 145 global_running_env.deploy_all() 146 log.info("Current linked node: {}".format(normal_node.node_mark)) 147 return Client(global_running_env, normal_node, staking_cfg) 148 149 150 @pytest.fixture() 151 def clients_new_node(global_test_env, staking_cfg) -> List[Client]: 152 """ 153 Get new node Client object list 154 """ 155 global_test_env.deploy_all() 156 return get_clients_noconsensus(global_test_env, staking_cfg) 157 158 159 @pytest.fixture() 160 def client_candidate(global_running_env, staking_cfg): 161 """ 162 Get a candidate node Client object 163 """ 164 client_consensus = get_client_consensus(global_running_env, staking_cfg) 165 all_clients = get_clients(global_running_env, staking_cfg) 166 clients_noconsensus = get_clients_noconsensus(global_running_env, staking_cfg) 167 if not client_consensus.staking.get_candidate_list_not_verifier(): 168 log.info('There is no candidate, node stake') 169 candidate_list = get_pledge_list(client_consensus.node.ppos.getCandidateList) 170 for client in clients_noconsensus: 171 if client.node.node_id not in candidate_list: 172 if client.node.program_version != client.pip.cfg.version0: 173 upload_platon(client.node, client.pip.cfg.PLATON_NEW_BIN0) 174 client.node.restart() 175 log.info('Node {} staking'.format(client.node.node_id)) 176 address, _ = client.economic.account.generate_account(client.node.web3, client.economic.create_staking_limit * 5) 177 result = client.staking.create_staking(0, address, address) 178 log.info('Node {} staking result :{}'.format(client.node.node_id, result)) 179 assert_code(result, 0) 180 client_consensus.economic.wait_settlement_blocknum(client_consensus.node) 181 node_id_list = client_consensus.staking.get_candidate_list_not_verifier() 182 log.info('Get candidate list no verifier {}'.format(node_id_list)) 183 if len(node_id_list) == 0: 184 raise Exception('Get candidate list no verifier failed') 185 return get_client_by_nodeid(node_id_list[0], all_clients) 186 187 188 @pytest.fixture() 189 def reset_environment(global_test_env): 190 log.info("case execution completed") 191 yield 192 global_test_env.deploy_all() 193 194 195 @pytest.fixture() 196 def new_genesis_env(global_test_env): 197 cfg = copy(global_test_env.cfg) 198 yield global_test_env 199 log.info("reset deploy.................") 200 global_test_env.set_cfg(cfg) 201 global_test_env.deploy_all() 202 203 204 def param_governance_verify(client, module, name, newvalue, effectiveflag=True): 205 """ 206 effectiveflag indicates whether it takes effect 207 """ 208 if isinstance(client, Client): 209 pip = client.pip 210 else: 211 raise Exception("client must Client class") 212 if pip.is_exist_effective_proposal_for_vote(pip.cfg.param_proposal) or \ 213 pip.is_exist_effective_proposal_for_vote(pip.cfg.version_proposal): 214 raise Exception('There is effective param proposal or version proposal') 215 result = pip.submitParam(pip.node.node_id, str(time.time()), module, name, newvalue, pip.node.staking_address, 216 transaction_cfg=pip.cfg.transaction_cfg) 217 log.info('submit param proposal result : {}'.format(result)) 218 assert_code(result, 0) 219 proposalinfo = pip.get_effect_proposal_info_of_vote(pip.cfg.param_proposal) 220 log.info('param proposalinfo : {}'.format(proposalinfo)) 221 all_clients = [] 222 for node_obj in pip.economic.env.get_all_nodes(): 223 all_clients.append(Client(pip.economic.env, node_obj, 224 StakingConfig("externalId", "nodeName", "website", "details"))) 225 client = get_client_by_nodeid(pip.node.node_id, all_clients) 226 verifier_list = get_pledge_list(client.ppos.getVerifierList) 227 log.info('verifierlist : {}'.format(verifier_list)) 228 clients_verifier = get_clients_by_nodeid(verifier_list, all_clients) 229 if effectiveflag: 230 blocknum = 0 231 for client in clients_verifier: 232 if client.node.block_number < blocknum and blocknum != 0: 233 wait_block_number(client.node, blocknum) 234 result = client.pip.vote(client.node.node_id, proposalinfo.get('ProposalID'), 235 client.pip.cfg.vote_option_yeas, 236 client.node.staking_address, transaction_cfg=client.pip.cfg.transaction_cfg) 237 log.info('Node {} vote proposal result : {}'.format(client.node.node_id, result)) 238 blocknum = client.node.block_number 239 wait_block_number(pip.node, proposalinfo.get('EndVotingBlock')) 240 if effectiveflag: 241 assert pip.get_status_of_proposal(proposalinfo.get('ProposalID')) == 2 242 log.info("blockNumber {}, the {} has become {}".format(proposalinfo.get('EndVotingBlock'), name, newvalue)) 243 else: 244 assert pip.get_status_of_proposal(proposalinfo.get('ProposalID')) == 3 245 log.info("{} retains the original value".format(name)) 246 247 248 def param_governance_verify_before_endblock(client, module, name, newvalue, effectiveflag=True): 249 """ 250 effectiveflag indicates whether it takes effect 251 :param client_obj: 252 :param module: 253 :param name: 254 :param newvalue: 255 :param effectiveflag: 256 :return: the EndVotingBlock of the param proposal 257 """ 258 if isinstance(client, Client): 259 pip = client.pip 260 else: 261 raise Exception("client must Client class") 262 if pip.is_exist_effective_proposal_for_vote(pip.cfg.param_proposal) or \ 263 pip.is_exist_effective_proposal_for_vote(pip.cfg.version_proposal): 264 raise Exception('There is effective param proposal or version proposal') 265 result = pip.submitParam(pip.node.node_id, str(time.time()), module, name, newvalue, pip.node.staking_address, 266 transaction_cfg=pip.cfg.transaction_cfg) 267 log.info('submit param proposal result : {}'.format(result)) 268 assert_code(result, 0) 269 proposalinfo = pip.get_effect_proposal_info_of_vote(pip.cfg.param_proposal) 270 log.info('param proposalinfo : {}'.format(proposalinfo)) 271 all_clients = [] 272 for node in pip.economic.env.get_all_nodes(): 273 all_clients.append(Client(pip.economic.env, node, 274 StakingConfig("externalId", "nodeName", "website", "details"))) 275 client = get_client_by_nodeid(pip.node.node_id, all_clients) 276 verifier_list = get_pledge_list(client.ppos.getVerifierList) 277 log.info('verifierlist : {}'.format(verifier_list)) 278 clients_verifier = get_clients_by_nodeid(verifier_list, all_clients) 279 if effectiveflag: 280 blocknum = 0 281 for client in clients_verifier: 282 if client.node.block_number < blocknum and blocknum != 0: 283 wait_block_number(client.node, blocknum) 284 result = client.pip.vote(client.node.node_id, proposalinfo.get('ProposalID'), 285 client.pip.cfg.vote_option_yeas, 286 client.node.staking_address, transaction_cfg=client.pip.cfg.transaction_cfg) 287 log.info('Node {} vote proposal result : {}'.format(client.node.node_id, result)) 288 blocknum = client.node.block_number 289 log.info('The proposal endvoting block is {}'.format(proposalinfo.get('EndVotingBlock'))) 290 return proposalinfo.get('EndVotingBlock')