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')