From 7ab85574d7daa70f8ba96d6fd29c8e0dde3370a9 Mon Sep 17 00:00:00 2001 From: Makram Kamaleddine Date: Fri, 31 Jan 2025 18:43:14 +0200 Subject: [PATCH 1/3] integration-tests/smoke/ccip: extract msging test case into pkg Extract the messaging test case structs and related functions to a separate package so that it can also be used from chainlink-deployments. --- .../testhelpers/messagingtest/helpers.go | 203 ++++++++++++++++++ .../smoke/ccip/ccip_messaging_test.go | 203 ++++-------------- 2 files changed, 243 insertions(+), 163 deletions(-) create mode 100644 deployment/ccip/changeset/testhelpers/messagingtest/helpers.go diff --git a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go new file mode 100644 index 00000000000..71db1b840aa --- /dev/null +++ b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go @@ -0,0 +1,203 @@ +package messagingtest + +import ( + "testing" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + chain_selectors "github.com/smartcontractkit/chain-selectors" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" + "github.com/smartcontractkit/chainlink/deployment" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" + "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" + "github.com/stretchr/testify/require" +) + +// Use this when testhelpers.DeployedEnv is available (usually in ephemeral test environments). +func NewTestSetupWithDeployedEnv( + t *testing.T, + depEnv testhelpers.DeployedEnv, + onchainState changeset.CCIPOnChainState, + sourceChain, + destChain uint64, + sender []byte, + testRouter, + validateResp bool, +) TestSetup { + return TestSetup{ + T: t, + Sender: sender, + Env: depEnv.Env, + DeployedEnv: depEnv, + OnchainState: onchainState, + SourceChain: sourceChain, + DestChain: destChain, + TestRouter: testRouter, + ValidateResp: validateResp, + } +} + +// Use this when testhelpers.DeployedEnv is not available (usually in long-running test environments like staging). +func NewTestSetup( + t *testing.T, + env deployment.Environment, + onchainState changeset.CCIPOnChainState, + sourceChain, + destChain uint64, + sender []byte, + testRouter, + validateResp bool, +) TestSetup { + return TestSetup{ + T: t, + Sender: sender, + Env: env, + // no DeployedEnv + OnchainState: onchainState, + SourceChain: sourceChain, + DestChain: destChain, + TestRouter: testRouter, + ValidateResp: validateResp, + } +} + +type TestSetup struct { + T *testing.T + Sender []byte + Env deployment.Environment + DeployedEnv testhelpers.DeployedEnv + OnchainState changeset.CCIPOnChainState + SourceChain uint64 + DestChain uint64 + TestRouter bool + ValidateResp bool +} + +type TestCase struct { + TestSetup + Replayed bool + Nonce uint64 +} + +type TestCaseOutput struct { + Replayed bool + Nonce uint64 + MsgSentEvent *onramp.OnRampCCIPMessageSent +} + +func sleepAndReplay(t *testing.T, e testhelpers.DeployedEnv, sourceChain, destChain uint64) { + time.Sleep(30 * time.Second) + replayBlocks := make(map[uint64]uint64) + replayBlocks[sourceChain] = 1 + replayBlocks[destChain] = 1 + + testhelpers.ReplayLogs(t, e.Env.Offchain, replayBlocks) +} + +func getLatestNonce(tc TestCase) uint64 { + family, err := chain_selectors.GetSelectorFamily(tc.DestChain) + require.NoError(tc.T, err) + + var latestNonce uint64 + switch family { + case chain_selectors.FamilyEVM: + latestNonce, err = tc.OnchainState.Chains[tc.DestChain].NonceManager.GetInboundNonce(&bind.CallOpts{ + Context: tests.Context(tc.T), + }, tc.SourceChain, tc.Sender) + require.NoError(tc.T, err) + case chain_selectors.FamilySolana: + // var nonceCounterAccount ccip_router.Nonce + // err = common.GetAccountDataBorshInto(ctx, solanaGoClient, nonceEvmPDA, config.DefaultCommitment, &nonceCounterAccount) + // require.NoError(t, err, "failed to get account info") + // require.Equal(t, uint64(1), nonceCounterAccount.Counter) + } + return latestNonce +} + +// Run runs a messaging test case. +func Run( + tc TestCase, + receiver common.Address, + msgData []byte, + extraArgs []byte, + expectedExecutionState int, + extraAssertions ...func(t *testing.T), +) (out TestCaseOutput) { + // check latest nonce + latestNonce := getLatestNonce(tc) + require.Equal(tc.T, tc.Nonce, latestNonce) + + startBlocks := make(map[uint64]*uint64) + msgSentEvent := testhelpers.TestSendRequest( + tc.T, + tc.Env, + tc.OnchainState, + tc.SourceChain, + tc.DestChain, + tc.TestRouter, + router.ClientEVM2AnyMessage{ + Receiver: common.LeftPadBytes(receiver.Bytes(), 32), + Data: msgData, + TokenAmounts: nil, + FeeToken: common.HexToAddress("0x0"), + ExtraArgs: extraArgs, + }) + expectedSeqNum := map[testhelpers.SourceDestPair]uint64{ + { + SourceChainSelector: tc.SourceChain, + DestChainSelector: tc.DestChain, + }: msgSentEvent.SequenceNumber, + } + expectedSeqNumExec := map[testhelpers.SourceDestPair][]uint64{ + { + SourceChainSelector: tc.SourceChain, + DestChainSelector: tc.DestChain, + }: {msgSentEvent.SequenceNumber}, + } + out.MsgSentEvent = msgSentEvent + + // hack + if !tc.Replayed { + require.NotNil(tc.T, tc.DeployedEnv) + sleepAndReplay(tc.T, tc.DeployedEnv, tc.SourceChain, tc.DestChain) + out.Replayed = true + } + + if tc.ValidateResp { + testhelpers.ConfirmCommitForAllWithExpectedSeqNums(tc.T, tc.Env, tc.OnchainState, expectedSeqNum, startBlocks) + execStates := testhelpers.ConfirmExecWithSeqNrsForAll(tc.T, tc.Env, tc.OnchainState, expectedSeqNumExec, startBlocks) + + require.Equalf( + tc.T, + expectedExecutionState, + execStates[testhelpers.SourceDestPair{ + SourceChainSelector: tc.SourceChain, + DestChainSelector: tc.DestChain, + }][msgSentEvent.SequenceNumber], + "wrong execution state for seq nr %d, expected %d, got %d", + msgSentEvent.SequenceNumber, + expectedExecutionState, + execStates[testhelpers.SourceDestPair{ + SourceChainSelector: tc.SourceChain, + DestChainSelector: tc.DestChain, + }][msgSentEvent.SequenceNumber], + ) + + // check the sender latestNonce on the dest, should be incremented + latestNonce = getLatestNonce(tc) + require.Equal(tc.T, tc.Nonce+1, latestNonce) + out.Nonce = latestNonce + tc.T.Logf("confirmed nonce bump for sender %x, latestNonce %d", tc.Sender, latestNonce) + + for _, assertion := range extraAssertions { + assertion(tc.T) + } + } else { + tc.T.Logf("skipping validation of sent message") + } + + return +} diff --git a/integration-tests/smoke/ccip/ccip_messaging_test.go b/integration-tests/smoke/ccip/ccip_messaging_test.go index 69900b29322..bb22d876e42 100644 --- a/integration-tests/smoke/ccip/ccip_messaging_test.go +++ b/integration-tests/smoke/ccip/ccip_messaging_test.go @@ -5,48 +5,23 @@ import ( "fmt" "math/big" "testing" - "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" "github.com/stretchr/testify/require" "golang.org/x/exp/maps" - chain_selectors "github.com/smartcontractkit/chain-selectors" - "github.com/smartcontractkit/chainlink-common/pkg/hashutil" "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" - "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" + mt "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers/messagingtest" testsetups "github.com/smartcontractkit/chainlink/integration-tests/testsetups/ccip" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/offramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" - "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" ) -type testCaseSetup struct { - t *testing.T - sender []byte - deployedEnv testhelpers.DeployedEnv - onchainState changeset.CCIPOnChainState - sourceChain, destChain uint64 -} - -type messagingTestCase struct { - testCaseSetup - replayed bool - nonce uint64 -} - -type messagingTestCaseOutput struct { - replayed bool - nonce uint64 - msgSentEvent *onramp.OnRampCCIPMessageSent -} - func Test_CCIPMessaging(t *testing.T) { // Setup 2 chains and a single lane. ctx := testhelpers.Context(t) @@ -72,22 +47,24 @@ func Test_CCIPMessaging(t *testing.T) { replayed bool nonce uint64 sender = common.LeftPadBytes(e.Env.Chains[sourceChain].DeployerKey.From.Bytes(), 32) - out messagingTestCaseOutput - setup = testCaseSetup{ - t: t, - sender: sender, - deployedEnv: e, - onchainState: state, - sourceChain: sourceChain, - destChain: destChain, - } + out mt.TestCaseOutput + setup = mt.NewTestSetupWithDeployedEnv( + t, + e, + state, + sourceChain, + destChain, + sender, + false, // testRouter + true, // validateResp + ) ) t.Run("data message to eoa", func(t *testing.T) { - out = runMessagingTestCase(messagingTestCase{ - testCaseSetup: setup, - replayed: replayed, - nonce: nonce, + out = mt.Run(mt.TestCase{ + TestSetup: setup, + Replayed: replayed, + Nonce: nonce, }, common.HexToAddress("0xdead"), []byte("hello eoa"), @@ -97,11 +74,11 @@ func Test_CCIPMessaging(t *testing.T) { }) t.Run("message to contract not implementing CCIPReceiver", func(t *testing.T) { - out = runMessagingTestCase( - messagingTestCase{ - testCaseSetup: setup, - replayed: out.replayed, - nonce: out.nonce, + out = mt.Run( + mt.TestCase{ + TestSetup: setup, + Replayed: out.Replayed, + Nonce: out.Nonce, }, state.Chains[destChain].FeeQuoter.Address(), []byte("hello FeeQuoter"), @@ -113,11 +90,11 @@ func Test_CCIPMessaging(t *testing.T) { t.Run("message to contract implementing CCIPReceiver", func(t *testing.T) { latestHead, err := e.Env.Chains[destChain].Client.HeaderByNumber(ctx, nil) require.NoError(t, err) - out = runMessagingTestCase( - messagingTestCase{ - testCaseSetup: setup, - replayed: out.replayed, - nonce: out.nonce, + out = mt.Run( + mt.TestCase{ + TestSetup: setup, + Replayed: out.Replayed, + Nonce: out.Nonce, }, state.Chains[destChain].Receiver.Address(), []byte("hello CCIPReceiver"), @@ -138,11 +115,11 @@ func Test_CCIPMessaging(t *testing.T) { t.Run("message to contract implementing CCIPReceiver with low exec gas", func(t *testing.T) { latestHead, err := e.Env.Chains[destChain].Client.HeaderByNumber(ctx, nil) require.NoError(t, err) - out = runMessagingTestCase( - messagingTestCase{ - testCaseSetup: setup, - replayed: out.replayed, - nonce: out.nonce, + out = mt.Run( + mt.TestCase{ + TestSetup: setup, + Replayed: out.Replayed, + Nonce: out.Nonce, }, state.Chains[destChain].Receiver.Address(), []byte("hello CCIPReceiver with low exec gas"), @@ -153,7 +130,7 @@ func Test_CCIPMessaging(t *testing.T) { manuallyExecute(ctx, t, latestHead.Number.Uint64(), state, destChain, out, sourceChain, e, sender) t.Logf("successfully manually executed message %x", - out.msgSentEvent.Message.Header.MessageId) + out.MsgSentEvent.Message.Header.MessageId) }) } @@ -163,7 +140,7 @@ func manuallyExecute( startBlock uint64, state changeset.CCIPOnChainState, destChain uint64, - out messagingTestCaseOutput, + out mt.TestCaseOutput, sourceChain uint64, e testhelpers.DeployedEnv, sender []byte, @@ -172,7 +149,7 @@ func manuallyExecute( ctx, t, state.Chains[destChain].OffRamp, - out.msgSentEvent.SequenceNumber, + out.MsgSentEvent.SequenceNumber, startBlock, ) messageHash := getMessageHash( @@ -180,8 +157,8 @@ func manuallyExecute( t, state.Chains[destChain].OffRamp, sourceChain, - out.msgSentEvent.SequenceNumber, - out.msgSentEvent.Message.Header.MessageId, + out.MsgSentEvent.SequenceNumber, + out.MsgSentEvent.Message.Header.MessageId, startBlock, ) tree, err := merklemulti.NewTree(hashutil.NewKeccak(), [][32]byte{messageHash}) @@ -198,11 +175,11 @@ func manuallyExecute( Messages: []offramp.InternalAny2EVMRampMessage{ { Header: offramp.InternalRampMessageHeader{ - MessageId: out.msgSentEvent.Message.Header.MessageId, + MessageId: out.MsgSentEvent.Message.Header.MessageId, SourceChainSelector: sourceChain, DestChainSelector: destChain, - SequenceNumber: out.msgSentEvent.SequenceNumber, - Nonce: out.msgSentEvent.Message.Header.Nonce, + SequenceNumber: out.MsgSentEvent.SequenceNumber, + Nonce: out.MsgSentEvent.Message.Header.Nonce, }, Sender: sender, Data: []byte("hello CCIPReceiver with low exec gas"), @@ -230,7 +207,7 @@ func manuallyExecute( _, err = deployment.ConfirmIfNoError(e.Env.Chains[destChain], tx, err) require.NoError(t, err, "failed to send/confirm manuallyExecute tx") - newExecutionState, err := state.Chains[destChain].OffRamp.GetExecutionState(&bind.CallOpts{Context: ctx}, sourceChain, out.msgSentEvent.SequenceNumber) + newExecutionState, err := state.Chains[destChain].OffRamp.GetExecutionState(&bind.CallOpts{Context: ctx}, sourceChain, out.MsgSentEvent.SequenceNumber) require.NoError(t, err) require.Equal(t, uint8(testhelpers.EXECUTION_STATE_SUCCESS), newExecutionState) } @@ -288,106 +265,6 @@ func getMessageHash( return iter.Event.MessageHash } -func sleepAndReplay(t *testing.T, e testhelpers.DeployedEnv, sourceChain, destChain uint64) { - time.Sleep(30 * time.Second) - replayBlocks := make(map[uint64]uint64) - replayBlocks[sourceChain] = 1 - replayBlocks[destChain] = 1 - testhelpers.ReplayLogs(t, e.Env.Offchain, replayBlocks) -} - -func getLatestNonce(tc messagingTestCase) uint64 { - family, err := chain_selectors.GetSelectorFamily(tc.destChain) - require.NoError(tc.t, err) - - var latestNonce uint64 - switch family { - case chain_selectors.FamilyEVM: - latestNonce, err = tc.onchainState.Chains[tc.destChain].NonceManager.GetInboundNonce(&bind.CallOpts{ - Context: tests.Context(tc.t), - }, tc.sourceChain, tc.sender) - require.NoError(tc.t, err) - case chain_selectors.FamilySolana: - // var nonceCounterAccount ccip_router.Nonce - // err = common.GetAccountDataBorshInto(ctx, solanaGoClient, nonceEvmPDA, config.DefaultCommitment, &nonceCounterAccount) - // require.NoError(t, err, "failed to get account info") - // require.Equal(t, uint64(1), nonceCounterAccount.Counter) - } - return latestNonce -} - -func runMessagingTestCase( - tc messagingTestCase, - receiver common.Address, - msgData []byte, - extraArgs []byte, - expectedExecutionState int, - extraAssertions ...func(t *testing.T), -) (out messagingTestCaseOutput) { - // check latest nonce - latestNonce := getLatestNonce(tc) - require.Equal(tc.t, tc.nonce, latestNonce) - - startBlocks := make(map[uint64]*uint64) - msgSentEvent := testhelpers.TestSendRequest(tc.t, tc.deployedEnv.Env, tc.onchainState, tc.sourceChain, tc.destChain, false, router.ClientEVM2AnyMessage{ - Receiver: common.LeftPadBytes(receiver.Bytes(), 32), - Data: msgData, - TokenAmounts: nil, - FeeToken: common.HexToAddress("0x0"), - ExtraArgs: extraArgs, - }) - expectedSeqNum := map[testhelpers.SourceDestPair]uint64{ - { - SourceChainSelector: tc.sourceChain, - DestChainSelector: tc.destChain, - }: msgSentEvent.SequenceNumber, - } - expectedSeqNumExec := map[testhelpers.SourceDestPair][]uint64{ - { - SourceChainSelector: tc.sourceChain, - DestChainSelector: tc.destChain, - }: {msgSentEvent.SequenceNumber}, - } - out.msgSentEvent = msgSentEvent - - // hack - if !tc.replayed { - sleepAndReplay(tc.t, tc.deployedEnv, tc.sourceChain, tc.destChain) - out.replayed = true - } - - testhelpers.ConfirmCommitForAllWithExpectedSeqNums(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNum, startBlocks) - execStates := testhelpers.ConfirmExecWithSeqNrsForAll(tc.t, tc.deployedEnv.Env, tc.onchainState, expectedSeqNumExec, startBlocks) - - require.Equalf( - tc.t, - expectedExecutionState, - execStates[testhelpers.SourceDestPair{ - SourceChainSelector: tc.sourceChain, - DestChainSelector: tc.destChain, - }][msgSentEvent.SequenceNumber], - "wrong execution state for seq nr %d, expected %d, got %d", - msgSentEvent.SequenceNumber, - expectedExecutionState, - execStates[testhelpers.SourceDestPair{ - SourceChainSelector: tc.sourceChain, - DestChainSelector: tc.destChain, - }][msgSentEvent.SequenceNumber], - ) - - // check the sender latestNonce on the dest, should be incremented - latestNonce = getLatestNonce(tc) - require.Equal(tc.t, tc.nonce+1, latestNonce) - out.nonce = latestNonce - tc.t.Logf("confirmed nonce bump for sender %x, latestNonce %d", tc.sender, latestNonce) - - for _, assertion := range extraAssertions { - assertion(tc.t) - } - - return -} - // boolsToBitFlags transforms a list of boolean flags to a *big.Int encoded number. func boolsToBitFlags(bools []bool) *big.Int { encodedFlags := big.NewInt(0) From f2b31abffac5b1c007277e0e5934b82a920d0054 Mon Sep 17 00:00:00 2001 From: Makram Kamaleddine Date: Fri, 31 Jan 2025 19:10:02 +0200 Subject: [PATCH 2/3] simplify testcase --- .../testhelpers/messagingtest/helpers.go | 30 ++++--- .../smoke/ccip/ccip_messaging_test.go | 81 ++++++++++--------- 2 files changed, 56 insertions(+), 55 deletions(-) diff --git a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go index 71db1b840aa..4c67f96e56a 100644 --- a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go +++ b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go @@ -78,8 +78,13 @@ type TestSetup struct { type TestCase struct { TestSetup - Replayed bool - Nonce uint64 + Replayed bool + Nonce uint64 + Receiver common.Address + MsgData []byte + ExtraArgs []byte + ExpectedExecutionState int + ExtraAssertions []func(t *testing.T) } type TestCaseOutput struct { @@ -118,14 +123,7 @@ func getLatestNonce(tc TestCase) uint64 { } // Run runs a messaging test case. -func Run( - tc TestCase, - receiver common.Address, - msgData []byte, - extraArgs []byte, - expectedExecutionState int, - extraAssertions ...func(t *testing.T), -) (out TestCaseOutput) { +func Run(tc TestCase) (out TestCaseOutput) { // check latest nonce latestNonce := getLatestNonce(tc) require.Equal(tc.T, tc.Nonce, latestNonce) @@ -139,11 +137,11 @@ func Run( tc.DestChain, tc.TestRouter, router.ClientEVM2AnyMessage{ - Receiver: common.LeftPadBytes(receiver.Bytes(), 32), - Data: msgData, + Receiver: common.LeftPadBytes(tc.Receiver.Bytes(), 32), + Data: tc.MsgData, TokenAmounts: nil, FeeToken: common.HexToAddress("0x0"), - ExtraArgs: extraArgs, + ExtraArgs: tc.ExtraArgs, }) expectedSeqNum := map[testhelpers.SourceDestPair]uint64{ { @@ -172,14 +170,14 @@ func Run( require.Equalf( tc.T, - expectedExecutionState, + tc.ExpectedExecutionState, execStates[testhelpers.SourceDestPair{ SourceChainSelector: tc.SourceChain, DestChainSelector: tc.DestChain, }][msgSentEvent.SequenceNumber], "wrong execution state for seq nr %d, expected %d, got %d", msgSentEvent.SequenceNumber, - expectedExecutionState, + tc.ExpectedExecutionState, execStates[testhelpers.SourceDestPair{ SourceChainSelector: tc.SourceChain, DestChainSelector: tc.DestChain, @@ -192,7 +190,7 @@ func Run( out.Nonce = latestNonce tc.T.Logf("confirmed nonce bump for sender %x, latestNonce %d", tc.Sender, latestNonce) - for _, assertion := range extraAssertions { + for _, assertion := range tc.ExtraAssertions { assertion(tc.T) } } else { diff --git a/integration-tests/smoke/ccip/ccip_messaging_test.go b/integration-tests/smoke/ccip/ccip_messaging_test.go index bb22d876e42..eb9b4bfd847 100644 --- a/integration-tests/smoke/ccip/ccip_messaging_test.go +++ b/integration-tests/smoke/ccip/ccip_messaging_test.go @@ -61,29 +61,30 @@ func Test_CCIPMessaging(t *testing.T) { ) t.Run("data message to eoa", func(t *testing.T) { - out = mt.Run(mt.TestCase{ - TestSetup: setup, - Replayed: replayed, - Nonce: nonce, - }, - common.HexToAddress("0xdead"), - []byte("hello eoa"), - nil, // default extraArgs - testhelpers.EXECUTION_STATE_SUCCESS, // success because offRamp won't call an EOA + out = mt.Run( + mt.TestCase{ + TestSetup: setup, + Replayed: replayed, + Nonce: nonce, + Receiver: common.HexToAddress("0xdead"), + MsgData: []byte("hello eoa"), + ExtraArgs: nil, // default extraArgs + ExpectedExecutionState: testhelpers.EXECUTION_STATE_SUCCESS, // success because offRamp won't call an EOA + }, ) }) t.Run("message to contract not implementing CCIPReceiver", func(t *testing.T) { out = mt.Run( mt.TestCase{ - TestSetup: setup, - Replayed: out.Replayed, - Nonce: out.Nonce, + TestSetup: setup, + Replayed: out.Replayed, + Nonce: out.Nonce, + Receiver: state.Chains[destChain].FeeQuoter.Address(), + MsgData: []byte("hello FeeQuoter"), + ExtraArgs: nil, // default extraArgs + ExpectedExecutionState: testhelpers.EXECUTION_STATE_SUCCESS, // success because offRamp won't call a contract not implementing CCIPReceiver }, - state.Chains[destChain].FeeQuoter.Address(), - []byte("hello FeeQuoter"), - nil, // default extraArgs - testhelpers.EXECUTION_STATE_SUCCESS, // success because offRamp won't call a contract not implementing CCIPReceiver ) }) @@ -92,22 +93,24 @@ func Test_CCIPMessaging(t *testing.T) { require.NoError(t, err) out = mt.Run( mt.TestCase{ - TestSetup: setup, - Replayed: out.Replayed, - Nonce: out.Nonce, - }, - state.Chains[destChain].Receiver.Address(), - []byte("hello CCIPReceiver"), - nil, // default extraArgs - testhelpers.EXECUTION_STATE_SUCCESS, - func(t *testing.T) { - iter, err := state.Chains[destChain].Receiver.FilterMessageReceived(&bind.FilterOpts{ - Context: ctx, - Start: latestHead.Number.Uint64(), - }) - require.NoError(t, err) - require.True(t, iter.Next()) - // MessageReceived doesn't emit the data unfortunately, so can't check that. + TestSetup: setup, + Replayed: out.Replayed, + Nonce: out.Nonce, + Receiver: state.Chains[destChain].Receiver.Address(), + MsgData: []byte("hello CCIPReceiver"), + ExtraArgs: nil, // default extraArgs + ExpectedExecutionState: testhelpers.EXECUTION_STATE_SUCCESS, + ExtraAssertions: []func(t *testing.T){ + func(t *testing.T) { + iter, err := state.Chains[destChain].Receiver.FilterMessageReceived(&bind.FilterOpts{ + Context: ctx, + Start: latestHead.Number.Uint64(), + }) + require.NoError(t, err) + require.True(t, iter.Next()) + // MessageReceived doesn't emit the data unfortunately, so can't check that. + }, + }, }, ) }) @@ -117,14 +120,14 @@ func Test_CCIPMessaging(t *testing.T) { require.NoError(t, err) out = mt.Run( mt.TestCase{ - TestSetup: setup, - Replayed: out.Replayed, - Nonce: out.Nonce, + TestSetup: setup, + Replayed: out.Replayed, + Nonce: out.Nonce, + Receiver: state.Chains[destChain].Receiver.Address(), + MsgData: []byte("hello CCIPReceiver with low exec gas"), + ExtraArgs: testhelpers.MakeEVMExtraArgsV2(1, false), // 1 gas is too low. + ExpectedExecutionState: testhelpers.EXECUTION_STATE_FAILURE, // state would be failed onchain due to low gas }, - state.Chains[destChain].Receiver.Address(), - []byte("hello CCIPReceiver with low exec gas"), - testhelpers.MakeEVMExtraArgsV2(1, false), // 1 gas is too low. - testhelpers.EXECUTION_STATE_FAILURE, // state would be failed onchain due to low gas ) manuallyExecute(ctx, t, latestHead.Number.Uint64(), state, destChain, out, sourceChain, e, sender) From 7b1a989d8cb7d2865c0961c7b21721d131d762d6 Mon Sep 17 00:00:00 2001 From: Makram Kamaleddine Date: Mon, 3 Feb 2025 14:01:51 +0200 Subject: [PATCH 3/3] goimports --- deployment/ccip/changeset/testhelpers/messagingtest/helpers.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go index 4c67f96e56a..36b03e576de 100644 --- a/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go +++ b/deployment/ccip/changeset/testhelpers/messagingtest/helpers.go @@ -7,13 +7,14 @@ import ( "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/common" chain_selectors "github.com/smartcontractkit/chain-selectors" + "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink/deployment" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset" "github.com/smartcontractkit/chainlink/deployment/ccip/changeset/testhelpers" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/onramp" "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/router" - "github.com/stretchr/testify/require" ) // Use this when testhelpers.DeployedEnv is available (usually in ephemeral test environments).