Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Create a new test suite ForwardingTestSuite #6785

Merged
merged 5 commits into from
Jul 9, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions modules/apps/transfer/keeper/keeper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,15 +30,13 @@ type KeeperTestSuite struct {
chainA *ibctesting.TestChain
chainB *ibctesting.TestChain
chainC *ibctesting.TestChain
chainD *ibctesting.TestChain
}

func (suite *KeeperTestSuite) SetupTest() {
suite.coordinator = ibctesting.NewCoordinator(suite.T(), 4)
suite.coordinator = ibctesting.NewCoordinator(suite.T(), 3)
suite.chainA = suite.coordinator.GetChain(ibctesting.GetChainID(1))
suite.chainB = suite.coordinator.GetChain(ibctesting.GetChainID(2))
suite.chainC = suite.coordinator.GetChain(ibctesting.GetChainID(3))
suite.chainD = suite.coordinator.GetChain(ibctesting.GetChainID(4))

queryHelper := baseapp.NewQueryServerTestHelper(suite.chainA.GetContext(), suite.chainA.GetSimApp().InterfaceRegistry())
types.RegisterQueryServer(queryHelper, suite.chainA.GetSimApp().TransferKeeper)
Expand Down
90 changes: 60 additions & 30 deletions modules/apps/transfer/keeper/relay_forwarding_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@ package keeper_test

import (
"fmt"
"testing"
"time"

"github.com/cosmos/gogoproto/proto"
testifysuite "github.com/stretchr/testify/suite"

sdkmath "cosmossdk.io/math"

Expand All @@ -19,39 +21,54 @@ import (
ibctesting "github.com/cosmos/ibc-go/v8/testing"
)

func (suite *KeeperTestSuite) setupForwardingPaths() (pathAtoB, pathBtoC *ibctesting.Path) {
pathAtoB = ibctesting.NewTransferPath(suite.chainA, suite.chainB)
pathBtoC = ibctesting.NewTransferPath(suite.chainB, suite.chainC)
pathAtoB.Setup()
pathBtoC.Setup()
return pathAtoB, pathBtoC
}

type amountType int

const (
escrow amountType = iota
balance
)

func (suite *KeeperTestSuite) assertAmountOnChain(chain *ibctesting.TestChain, balanceType amountType, amount sdkmath.Int, denom string) {
var total sdk.Coin
switch balanceType {
case escrow:
total = chain.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(chain.GetContext(), denom)
case balance:
total = chain.GetSimApp().BankKeeper.GetBalance(chain.GetContext(), chain.SenderAccounts[0].SenderAccount.GetAddress(), denom)
default:
suite.Fail("invalid amountType %s", balanceType)
type (
ForwardingTestSuite struct {
testifysuite.Suite
DimitrisJim marked this conversation as resolved.
Show resolved Hide resolved

coordinator *ibctesting.Coordinator

// testing chains used for convenience and readability
chainA *ibctesting.TestChain
chainB *ibctesting.TestChain
chainC *ibctesting.TestChain
chainD *ibctesting.TestChain
}
suite.Require().Equal(amount, total.Amount, fmt.Sprintf("Chain %s: got balance of %d, wanted %d", chain.Name(), total.Amount, amount))

amountType int
)

func TestForwardingTestSuite(t *testing.T) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for future reference since this also tripped me up in past, this function is needed else the tests will not even actually run! 😄

testifysuite.Run(t, new(ForwardingTestSuite))
}

func (suite *ForwardingTestSuite) SetupTest() {
suite.coordinator = ibctesting.NewCoordinator(suite.T(), 4)

suite.chainA = suite.coordinator.GetChain(ibctesting.GetChainID(1))
suite.chainB = suite.coordinator.GetChain(ibctesting.GetChainID(2))
suite.chainC = suite.coordinator.GetChain(ibctesting.GetChainID(3))
suite.chainD = suite.coordinator.GetChain(ibctesting.GetChainID(4))
}

func (suite *ForwardingTestSuite) setupForwardingPaths() (pathAtoB, pathBtoC *ibctesting.Path) {
pathAtoB = ibctesting.NewTransferPath(suite.chainA, suite.chainB)
pathBtoC = ibctesting.NewTransferPath(suite.chainB, suite.chainC)
pathAtoB.Setup()
pathBtoC.Setup()

return pathAtoB, pathBtoC
}

// TestStoredForwardedPacketAndEscrowAfterFirstHop tests that the forwarded packet
// from chain A to chain B is stored after when the packet is received on chain B
// and then forwarded to chain C, and checks the balance of the escrow accounts
// in chain A nad B.
func (suite *KeeperTestSuite) TestStoredForwardedPacketAndEscrowAfterFirstHop() {
func (suite *ForwardingTestSuite) TestStoredForwardedPacketAndEscrowAfterFirstHop() {
/*
Given the following topology:
chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-0) chain A
Expand Down Expand Up @@ -112,7 +129,7 @@ func (suite *KeeperTestSuite) TestStoredForwardedPacketAndEscrowAfterFirstHop()
}

// TestSuccessfulForward tests a successful transfer from A to C through B.
func (suite *KeeperTestSuite) TestSuccessfulForward() {
func (suite *ForwardingTestSuite) TestSuccessfulForward() {
/*
Given the following topology:
chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-0) chain C
Expand Down Expand Up @@ -225,7 +242,7 @@ func (suite *KeeperTestSuite) TestSuccessfulForward() {
}

// TestSuccessfulForwardWithMemo tests a successful transfer from A to C through B with a memo that should arrive at C.
func (suite *KeeperTestSuite) TestSuccessfulForwardWithMemo() {
func (suite *ForwardingTestSuite) TestSuccessfulForwardWithMemo() {
/*
Given the following topology:
chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-0) chain C
Expand Down Expand Up @@ -366,7 +383,7 @@ func (suite *KeeperTestSuite) TestSuccessfulForwardWithMemo() {

// TestSuccessfulForwardWithNonCosmosAccAddress tests that a packet is successfully forwarded with a non-Cosmos account address.
// The test stops before verifying the final receive, because we don't have a non-cosmos chain to test with.
func (suite *KeeperTestSuite) TestSuccessfulForwardWithNonCosmosAccAddress() {
func (suite *ForwardingTestSuite) TestSuccessfulForwardWithNonCosmosAccAddress() {
/*
Given the following topology:
chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-0) chain C
Expand Down Expand Up @@ -445,7 +462,7 @@ func (suite *KeeperTestSuite) TestSuccessfulForwardWithNonCosmosAccAddress() {

// TestSuccessfulUnwind tests unwinding of tokens sent from A -> B -> C by
// forwarding the tokens back from C -> B -> A.
func (suite *KeeperTestSuite) TestSuccessfulUnwind() {
func (suite *ForwardingTestSuite) TestSuccessfulUnwind() {
/*
Given the following topolgy:
chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-0) chain C
Expand Down Expand Up @@ -590,7 +607,7 @@ func (suite *KeeperTestSuite) TestSuccessfulUnwind() {
// middle chain is native source when receiving and sending the packet. In other words, the middle chain's native
// token has been sent to chain C, and the multi-hop transfer from C -> B -> A has chain B being the source of
// the token both when receiving and forwarding (sending).
func (suite *KeeperTestSuite) TestAcknowledgementFailureWithMiddleChainAsNativeTokenSource() {
func (suite *ForwardingTestSuite) TestAcknowledgementFailureWithMiddleChainAsNativeTokenSource() {
/*
Given the following topology:
chain A (channel 0) -> (channel-0) chain B (channel-1) -> (channel-0) chain C
Expand Down Expand Up @@ -758,7 +775,7 @@ func (suite *KeeperTestSuite) TestAcknowledgementFailureWithMiddleChainAsNativeT
// TestAcknowledgementFailureWithMiddleChainAsNotBeingTokenSource tests a failure in the last hop where the middle chain
// is not source of the token when receiving or sending the packet. In other words, the middle chain's is sent
// (and forwarding) someone else's native token (in this case chain C).
func (suite *KeeperTestSuite) TestAcknowledgementFailureWithMiddleChainAsNotBeingTokenSource() {
func (suite *ForwardingTestSuite) TestAcknowledgementFailureWithMiddleChainAsNotBeingTokenSource() {
/*
Given the following topology:
chain A (channel 0) <- (channel-0) chain B (channel-1) <- (channel-0) chain C
Expand Down Expand Up @@ -878,7 +895,7 @@ func (suite *KeeperTestSuite) TestAcknowledgementFailureWithMiddleChainAsNotBein
// TestOnTimeoutPacketForwarding tests the scenario in which a packet goes from
// A to C, using B as a forwarding hop. The packet times out when going to C
// from B and we verify that funds are properly returned to A.
func (suite *KeeperTestSuite) TestOnTimeoutPacketForwarding() {
func (suite *ForwardingTestSuite) TestOnTimeoutPacketForwarding() {
pathAtoB, pathBtoC := suite.setupForwardingPaths()

amount := sdkmath.NewInt(100)
Expand Down Expand Up @@ -1018,7 +1035,7 @@ func (suite *KeeperTestSuite) TestOnTimeoutPacketForwarding() {

// TestForwardingWithMoreThanOneHop tests the scenario in which we
// forward with more than one forwarding hop.
func (suite *KeeperTestSuite) TestForwardingWithMoreThanOneHop() {
func (suite *ForwardingTestSuite) TestForwardingWithMoreThanOneHop() {
// Setup A->B->C->D
coinOnA := ibctesting.TestCoin

Expand Down Expand Up @@ -1131,7 +1148,7 @@ func (suite *KeeperTestSuite) TestForwardingWithMoreThanOneHop() {
suite.Require().NoError(err)
}

func (suite *KeeperTestSuite) TestMultihopForwardingErrorAcknowledgement() {
func (suite *ForwardingTestSuite) TestMultihopForwardingErrorAcknowledgement() {
// Setup A->B->C->D
coinOnA := ibctesting.TestCoin

Expand Down Expand Up @@ -1267,3 +1284,16 @@ func parseAckFromTransferEvents(events []abci.Event) (string, error) {

return "", fmt.Errorf("acknowledgement event attribute not found")
}

func (suite *ForwardingTestSuite) assertAmountOnChain(chain *ibctesting.TestChain, balanceType amountType, amount sdkmath.Int, denom string) {
var total sdk.Coin
switch balanceType {
case escrow:
total = chain.GetSimApp().TransferKeeper.GetTotalEscrowForDenom(chain.GetContext(), denom)
case balance:
total = chain.GetSimApp().BankKeeper.GetBalance(chain.GetContext(), chain.SenderAccounts[0].SenderAccount.GetAddress(), denom)
default:
suite.Fail("invalid amountType %s", balanceType)
}
suite.Require().Equal(amount, total.Amount, fmt.Sprintf("Chain %s: got balance of %d, wanted %d", chain.Name(), total.Amount, amount))
}
Loading