@@ -174,7 +174,7 @@ func (suite *AnteTestSuite) createUpdateClientMessage() sdk.Msg {
174174 return msg
175175}
176176
177- func (suite * AnteTestSuite ) TestAnteDecorator () {
177+ func (suite * AnteTestSuite ) TestAnteDecoratorCheckTx () {
178178 testCases := []struct {
179179 name string
180180 malleate func (suite * AnteTestSuite ) []sdk.Msg
@@ -497,3 +497,81 @@ func (suite *AnteTestSuite) TestAnteDecorator() {
497497 })
498498 }
499499}
500+
501+ func (suite * AnteTestSuite ) TestAnteDecoratorReCheckTx () {
502+ testCases := []struct {
503+ name string
504+ malleate func (suite * AnteTestSuite ) []sdk.Msg
505+ expError error
506+ }{
507+ {
508+ "success on one new RecvPacket message" ,
509+ func (suite * AnteTestSuite ) []sdk.Msg {
510+ // the RecvPacket message has not been submitted to the chain yet, so it will succeed
511+ return []sdk.Msg {suite .createRecvPacketMessage (false )}
512+ },
513+ nil ,
514+ },
515+ {
516+ "success on one redundant and one new RecvPacket message" ,
517+ func (suite * AnteTestSuite ) []sdk.Msg {
518+ return []sdk.Msg {
519+ suite .createRecvPacketMessage (true ),
520+ suite .createRecvPacketMessage (false ),
521+ }
522+ },
523+ nil ,
524+ },
525+ {
526+ "success on invalid proof (proof checks occur in checkTx)" ,
527+ func (suite * AnteTestSuite ) []sdk.Msg {
528+ msg := suite .createRecvPacketMessage (false )
529+ msg .ProofCommitment = []byte ("invalid-proof" )
530+ return []sdk.Msg {msg }
531+ },
532+ nil ,
533+ },
534+ {
535+ "no success on one redundant RecvPacket message" ,
536+ func (suite * AnteTestSuite ) []sdk.Msg {
537+ return []sdk.Msg {suite .createRecvPacketMessage (true )}
538+ },
539+ channeltypes .ErrRedundantTx ,
540+ },
541+ }
542+
543+ for _ , tc := range testCases {
544+ tc := tc
545+
546+ suite .Run (tc .name , func () {
547+ // reset suite
548+ suite .SetupTest ()
549+
550+ k := suite .chainB .App .GetIBCKeeper ()
551+ decorator := ante .NewRedundantRelayDecorator (k )
552+
553+ msgs := tc .malleate (suite )
554+
555+ deliverCtx := suite .chainB .GetContext ().WithIsCheckTx (false )
556+ reCheckCtx := suite .chainB .GetContext ().WithIsReCheckTx (true )
557+
558+ // create multimsg tx
559+ txBuilder := suite .chainB .TxConfig .NewTxBuilder ()
560+ err := txBuilder .SetMsgs (msgs ... )
561+ suite .Require ().NoError (err )
562+ tx := txBuilder .GetTx ()
563+
564+ next := func (ctx sdk.Context , tx sdk.Tx , simulate bool ) (newCtx sdk.Context , err error ) { return ctx , nil }
565+
566+ _ , err = decorator .AnteHandle (deliverCtx , tx , false , next )
567+ suite .Require ().NoError (err , "antedecorator should not error on DeliverTx" )
568+
569+ _ , err = decorator .AnteHandle (reCheckCtx , tx , false , next )
570+ if tc .expError == nil {
571+ suite .Require ().NoError (err , "non-strict decorator did not pass as expected" )
572+ } else {
573+ suite .Require ().ErrorIs (err , tc .expError , "non-strict antehandler did not return error as expected" )
574+ }
575+ })
576+ }
577+ }
0 commit comments