github.com/ChainSafe/chainbridge-core@v1.4.2/chains/evm/executor/voter_test.go (about)

     1  package executor_test
     2  
     3  import (
     4  	"errors"
     5  	"testing"
     6  	"time"
     7  
     8  	"github.com/ChainSafe/chainbridge-core/chains/evm/executor"
     9  	mock_voter "github.com/ChainSafe/chainbridge-core/chains/evm/executor/mock"
    10  	"github.com/ChainSafe/chainbridge-core/chains/evm/executor/proposal"
    11  	"github.com/ChainSafe/chainbridge-core/relayer/message"
    12  	"github.com/ethereum/go-ethereum/common"
    13  	"github.com/golang/mock/gomock"
    14  	"github.com/stretchr/testify/suite"
    15  )
    16  
    17  type VoterTestSuite struct {
    18  	suite.Suite
    19  	voter              *executor.EVMVoter
    20  	mockMessageHandler *mock_voter.MockMessageHandler
    21  	mockClient         *mock_voter.MockChainClient
    22  	mockBridgeContract *mock_voter.MockBridgeContract
    23  }
    24  
    25  func TestRunVoterTestSuite(t *testing.T) {
    26  	suite.Run(t, new(VoterTestSuite))
    27  }
    28  
    29  func (s *VoterTestSuite) SetupSuite()    {}
    30  func (s *VoterTestSuite) TearDownSuite() {}
    31  func (s *VoterTestSuite) SetupTest() {
    32  	gomockController := gomock.NewController(s.T())
    33  	s.mockMessageHandler = mock_voter.NewMockMessageHandler(gomockController)
    34  	s.mockClient = mock_voter.NewMockChainClient(gomockController)
    35  	s.mockBridgeContract = mock_voter.NewMockBridgeContract(gomockController)
    36  	s.voter = executor.NewVoter(
    37  		s.mockMessageHandler,
    38  		s.mockClient,
    39  		s.mockBridgeContract,
    40  	)
    41  	executor.Sleep = func(d time.Duration) {}
    42  }
    43  func (s *VoterTestSuite) TearDownTest() {}
    44  
    45  func (s *VoterTestSuite) TestExecute_HandleMessageError() {
    46  	s.mockMessageHandler.EXPECT().HandleMessage(gomock.Any()).Return(nil, errors.New("error"))
    47  
    48  	err := s.voter.Execute(&message.Message{})
    49  
    50  	s.NotNil(err)
    51  }
    52  
    53  func (s *VoterTestSuite) TestExecute_SimulateVoteProposalError() {
    54  	s.mockMessageHandler.EXPECT().HandleMessage(gomock.Any()).Return(&proposal.Proposal{
    55  		Source:       0,
    56  		DepositNonce: 0,
    57  	}, nil)
    58  	s.mockClient.EXPECT().RelayerAddress().Return(common.Address{})
    59  
    60  	s.mockBridgeContract.EXPECT().IsProposalVotedBy(gomock.Any(), gomock.Any()).Return(false, nil)
    61  	s.mockBridgeContract.EXPECT().ProposalStatus(gomock.Any()).Return(message.ProposalStatus{Status: message.ProposalStatusActive}, nil)
    62  	s.mockBridgeContract.EXPECT().GetThreshold().Return(uint8(1), nil)
    63  	s.mockBridgeContract.EXPECT().SimulateVoteProposal(gomock.Any()).Times(6).Return(errors.New("error"))
    64  
    65  	err := s.voter.Execute(&message.Message{})
    66  
    67  	s.NotNil(err)
    68  }
    69  
    70  func (s *VoterTestSuite) TestExecute_SimulateVoteProposal() {
    71  	s.mockMessageHandler.EXPECT().HandleMessage(gomock.Any()).Return(&proposal.Proposal{
    72  		Source:       0,
    73  		DepositNonce: 0,
    74  	}, nil)
    75  	s.mockClient.EXPECT().RelayerAddress().Return(common.Address{})
    76  
    77  	s.mockBridgeContract.EXPECT().IsProposalVotedBy(gomock.Any(), gomock.Any()).Return(false, nil)
    78  	s.mockBridgeContract.EXPECT().ProposalStatus(gomock.Any()).Return(message.ProposalStatus{Status: message.ProposalStatusActive}, nil)
    79  	s.mockBridgeContract.EXPECT().GetThreshold().Return(uint8(1), nil)
    80  	s.mockBridgeContract.EXPECT().SimulateVoteProposal(gomock.Any()).Times(1).Return(nil)
    81  	s.mockBridgeContract.EXPECT().VoteProposal(gomock.Any(), gomock.Any()).Return(&common.Hash{}, nil)
    82  
    83  	err := s.voter.Execute(&message.Message{})
    84  
    85  	s.Nil(err)
    86  }
    87  
    88  func (s *VoterTestSuite) TestExecute_IsProposalVotedByError() {
    89  	s.mockMessageHandler.EXPECT().HandleMessage(gomock.Any()).Return(&proposal.Proposal{
    90  		Source:       0,
    91  		DepositNonce: 0,
    92  	}, nil)
    93  	s.mockClient.EXPECT().RelayerAddress().Return(common.Address{})
    94  	s.mockBridgeContract.EXPECT().IsProposalVotedBy(gomock.Any(), gomock.Any()).Return(false, errors.New("error"))
    95  
    96  	err := s.voter.Execute(&message.Message{})
    97  
    98  	s.NotNil(err)
    99  }
   100  
   101  func (s *VoterTestSuite) TestExecute_ProposalAlreadyVoted() {
   102  	s.mockMessageHandler.EXPECT().HandleMessage(gomock.Any()).Return(&proposal.Proposal{
   103  		Source:       0,
   104  		DepositNonce: 0,
   105  	}, nil)
   106  	s.mockClient.EXPECT().RelayerAddress().Return(common.Address{})
   107  	s.mockBridgeContract.EXPECT().IsProposalVotedBy(gomock.Any(), gomock.Any()).Return(true, nil)
   108  
   109  	err := s.voter.Execute(&message.Message{})
   110  
   111  	s.Nil(err)
   112  }
   113  
   114  func (s *VoterTestSuite) TestExecute_ProposalStatusFail() {
   115  	s.mockMessageHandler.EXPECT().HandleMessage(gomock.Any()).Return(&proposal.Proposal{
   116  		Source:       0,
   117  		DepositNonce: 0,
   118  	}, nil)
   119  	s.mockClient.EXPECT().RelayerAddress().Return(common.Address{})
   120  	s.mockBridgeContract.EXPECT().IsProposalVotedBy(gomock.Any(), gomock.Any()).Return(false, nil)
   121  	s.mockBridgeContract.EXPECT().ProposalStatus(gomock.Any()).Return(message.ProposalStatus{}, errors.New("error"))
   122  
   123  	err := s.voter.Execute(&message.Message{})
   124  
   125  	s.NotNil(err)
   126  }
   127  
   128  func (s *VoterTestSuite) TestExecute_ExecutedProposal() {
   129  	s.mockMessageHandler.EXPECT().HandleMessage(gomock.Any()).Return(&proposal.Proposal{
   130  		Source:       0,
   131  		DepositNonce: 0,
   132  	}, nil)
   133  	s.mockClient.EXPECT().RelayerAddress().Return(common.Address{})
   134  	s.mockBridgeContract.EXPECT().IsProposalVotedBy(gomock.Any(), gomock.Any()).Return(false, nil)
   135  	s.mockBridgeContract.EXPECT().ProposalStatus(gomock.Any()).Return(message.ProposalStatus{Status: message.ProposalStatusExecuted}, nil)
   136  
   137  	err := s.voter.Execute(&message.Message{})
   138  
   139  	s.Nil(err)
   140  }
   141  
   142  func (s *VoterTestSuite) TestExecute_GetThresholdFail() {
   143  	s.mockMessageHandler.EXPECT().HandleMessage(gomock.Any()).Return(&proposal.Proposal{
   144  		Source:       0,
   145  		DepositNonce: 0,
   146  	}, nil)
   147  	s.mockClient.EXPECT().RelayerAddress().Return(common.Address{})
   148  	s.mockBridgeContract.EXPECT().IsProposalVotedBy(gomock.Any(), gomock.Any()).Return(false, nil)
   149  	s.mockBridgeContract.EXPECT().ProposalStatus(gomock.Any()).Return(message.ProposalStatus{Status: message.ProposalStatusActive}, nil)
   150  	s.mockBridgeContract.EXPECT().GetThreshold().Return(uint8(0), errors.New("error"))
   151  
   152  	err := s.voter.Execute(&message.Message{})
   153  
   154  	s.NotNil(err)
   155  }