diff --git a/modules/core/02-client/keeper/keeper.go b/modules/core/02-client/keeper/keeper.go index 750224e9735..c2404958006 100644 --- a/modules/core/02-client/keeper/keeper.go +++ b/modules/core/02-client/keeper/keeper.go @@ -501,7 +501,7 @@ func (k Keeper) GetLatestHeight(ctx sdk.Context, clientID string) types.Height { func (k Keeper) GetTimestampAtHeight(ctx sdk.Context, clientID string, height exported.Height) (uint64, error) { clientType, _, err := types.ParseClientIdentifier(clientID) if err != nil { - return 0, errorsmod.Wrapf(types.ErrClientNotFound, "clientID (%s)", clientID) + return 0, errorsmod.Wrapf(err, "clientID (%s)", clientID) } if !k.GetParams(ctx).IsAllowedClient(clientType) { diff --git a/modules/core/02-client/keeper/keeper_test.go b/modules/core/02-client/keeper/keeper_test.go index 84be6a7ac24..180bedc06a2 100644 --- a/modules/core/02-client/keeper/keeper_test.go +++ b/modules/core/02-client/keeper/keeper_test.go @@ -455,59 +455,130 @@ func (suite *KeeperTestSuite) TestIterateClientStates() { } } +func (suite *KeeperTestSuite) TestGetLatestHeight() { + var path *ibctesting.Path + + cases := []struct { + name string + malleate func() + expPass bool + }{ + { + "success", + func() {}, + true, + }, + { + "invalid client type", + func() { + path.EndpointA.ClientID = ibctesting.InvalidID + }, + false, + }, + { + "client type is not allowed", func() { + params := types.NewParams(exported.Localhost) + suite.chainA.GetSimApp().GetIBCKeeper().ClientKeeper.SetParams(suite.chainA.GetContext(), params) + }, + false, + }, + { + "client type is not registered on router", func() { + path.EndpointA.ClientID = types.FormatClientIdentifier("08-wasm", 0) + }, + false, + }, + } + + for _, tc := range cases { + suite.Run(tc.name, func() { + suite.SetupTest() // reset + + path = ibctesting.NewPath(suite.chainA, suite.chainB) + path.SetupConnections() + + tc.malleate() + + height := suite.chainA.App.GetIBCKeeper().ClientKeeper.GetLatestHeight(suite.chainA.GetContext(), path.EndpointA.ClientID) + + if tc.expPass { + suite.Require().Equal(suite.chainB.LatestCommittedHeader.GetHeight().(types.Height), height) + } else { + suite.Require().Equal(types.ZeroHeight(), height) + } + }) + } +} + func (suite *KeeperTestSuite) TestGetTimestampAtHeight() { var ( - clientID string - height exported.Height + height exported.Height + path *ibctesting.Path ) cases := []struct { - msg string + name string malleate func() - expPass bool + expError error }{ { - "verification success", + "success", + func() {}, + nil, + }, + { + "invalid client type", func() { - path := ibctesting.NewPath(suite.chainA, suite.chainB) - path.SetupConnections() - - clientID = path.EndpointA.ClientID - height = suite.chainB.LatestCommittedHeader.GetHeight() + path.EndpointA.ClientID = ibctesting.InvalidID }, - true, + host.ErrInvalidID, }, { - "client state not found", - func() {}, - false, + "client type is not allowed", func() { + params := types.NewParams(exported.Localhost) + suite.chainA.GetSimApp().GetIBCKeeper().ClientKeeper.SetParams(suite.chainA.GetContext(), params) + }, + types.ErrInvalidClientType, + }, + { + "client type is not registered on router", func() { + path.EndpointA.ClientID = types.FormatClientIdentifier("08-wasm", 0) + }, + types.ErrRouteNotFound, + }, + { + "client state not found", func() { + path.EndpointA.ClientID = types.FormatClientIdentifier(exported.Tendermint, 100) + }, + types.ErrClientNotFound, }, { "consensus state not found", func() { - path := ibctesting.NewPath(suite.chainA, suite.chainB) - path.SetupConnections() - clientID = path.EndpointA.ClientID height = suite.chainB.LatestCommittedHeader.GetHeight().Increment() }, - false, + types.ErrConsensusStateNotFound, }, } for _, tc := range cases { - suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { + suite.Run(tc.name, func() { suite.SetupTest() // reset + path = ibctesting.NewPath(suite.chainA, suite.chainB) + path.SetupConnections() + + height = suite.chainB.LatestCommittedHeader.GetHeight() + tc.malleate() - actualTimestamp, err := suite.chainA.App.GetIBCKeeper().ClientKeeper.GetTimestampAtHeight( - suite.chainA.GetContext(), clientID, height, - ) + actualTimestamp, err := suite.chainA.App.GetIBCKeeper().ClientKeeper.GetTimestampAtHeight(suite.chainA.GetContext(), path.EndpointA.ClientID, height) - if tc.expPass { + expPass := tc.expError == nil + if expPass { suite.Require().NoError(err) - suite.Require().EqualValues(uint64(suite.chainB.LatestCommittedHeader.GetTime().UnixNano()), actualTimestamp) + suite.Require().Equal(uint64(suite.chainB.LatestCommittedHeader.GetTime().UnixNano()), actualTimestamp) } else { - suite.Require().Error(err) + suite.Require().ErrorIs(err, tc.expError) } }) }