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 }