github.com/Finschia/finschia-sdk@v0.48.1/x/upgrade/keeper/grpc_query_test.go (about) 1 package keeper_test 2 3 import ( 4 gocontext "context" 5 "fmt" 6 "testing" 7 8 "github.com/stretchr/testify/suite" 9 tmproto "github.com/tendermint/tendermint/proto/tendermint/types" 10 11 "github.com/Finschia/finschia-sdk/baseapp" 12 "github.com/Finschia/finschia-sdk/simapp" 13 sdk "github.com/Finschia/finschia-sdk/types" 14 "github.com/Finschia/finschia-sdk/types/module" 15 "github.com/Finschia/finschia-sdk/x/upgrade/types" 16 ) 17 18 type UpgradeTestSuite struct { 19 suite.Suite 20 21 app *simapp.SimApp 22 ctx sdk.Context 23 queryClient types.QueryClient 24 } 25 26 func (suite *UpgradeTestSuite) SetupTest() { 27 suite.app = simapp.Setup(false) 28 suite.ctx = suite.app.BaseApp.NewContext(false, tmproto.Header{}) 29 30 queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) 31 types.RegisterQueryServer(queryHelper, suite.app.UpgradeKeeper) 32 suite.queryClient = types.NewQueryClient(queryHelper) 33 } 34 35 func (suite *UpgradeTestSuite) TestQueryCurrentPlan() { 36 var ( 37 req *types.QueryCurrentPlanRequest 38 expResponse types.QueryCurrentPlanResponse 39 ) 40 41 testCases := []struct { 42 msg string 43 malleate func() 44 expPass bool 45 }{ 46 { 47 "without current upgrade plan", 48 func() { 49 req = &types.QueryCurrentPlanRequest{} 50 expResponse = types.QueryCurrentPlanResponse{} 51 }, 52 true, 53 }, 54 { 55 "with current upgrade plan", 56 func() { 57 plan := types.Plan{Name: "test-plan", Height: 5} 58 suite.app.UpgradeKeeper.ScheduleUpgrade(suite.ctx, plan) 59 60 req = &types.QueryCurrentPlanRequest{} 61 expResponse = types.QueryCurrentPlanResponse{Plan: &plan} 62 }, 63 true, 64 }, 65 } 66 67 for _, tc := range testCases { 68 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 69 suite.SetupTest() // reset 70 71 tc.malleate() 72 73 res, err := suite.queryClient.CurrentPlan(gocontext.Background(), req) 74 75 if tc.expPass { 76 suite.Require().NoError(err) 77 suite.Require().NotNil(res) 78 suite.Require().Equal(&expResponse, res) 79 } else { 80 suite.Require().Error(err) 81 } 82 }) 83 } 84 } 85 86 func (suite *UpgradeTestSuite) TestAppliedCurrentPlan() { 87 var ( 88 req *types.QueryAppliedPlanRequest 89 expHeight int64 90 ) 91 92 testCases := []struct { 93 msg string 94 malleate func() 95 expPass bool 96 }{ 97 { 98 "with non-existent upgrade plan", 99 func() { 100 req = &types.QueryAppliedPlanRequest{Name: "foo"} 101 }, 102 true, 103 }, 104 { 105 "with applied upgrade plan", 106 func() { 107 expHeight = 5 108 109 planName := "test-plan" 110 plan := types.Plan{Name: planName, Height: expHeight} 111 suite.app.UpgradeKeeper.ScheduleUpgrade(suite.ctx, plan) 112 113 suite.ctx = suite.ctx.WithBlockHeight(expHeight) 114 suite.app.UpgradeKeeper.SetUpgradeHandler(planName, func(ctx sdk.Context, plan types.Plan, vm module.VersionMap) (module.VersionMap, error) { 115 return vm, nil 116 }) 117 suite.app.UpgradeKeeper.ApplyUpgrade(suite.ctx, plan) 118 119 req = &types.QueryAppliedPlanRequest{Name: planName} 120 }, 121 true, 122 }, 123 } 124 125 for _, tc := range testCases { 126 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 127 suite.SetupTest() // reset 128 129 tc.malleate() 130 131 res, err := suite.queryClient.AppliedPlan(gocontext.Background(), req) 132 133 if tc.expPass { 134 suite.Require().NoError(err) 135 suite.Require().NotNil(res) 136 suite.Require().Equal(expHeight, res.Height) 137 } else { 138 suite.Require().Error(err) 139 } 140 }) 141 } 142 } 143 144 func (suite *UpgradeTestSuite) TestModuleVersions() { 145 testCases := []struct { 146 msg string 147 req types.QueryModuleVersionsRequest 148 single bool 149 expPass bool 150 }{ 151 { 152 msg: "test full query", 153 req: types.QueryModuleVersionsRequest{}, 154 single: false, 155 expPass: true, 156 }, 157 { 158 msg: "test single module", 159 req: types.QueryModuleVersionsRequest{ModuleName: "bank"}, 160 single: true, 161 expPass: true, 162 }, 163 { 164 msg: "test non-existent module", 165 req: types.QueryModuleVersionsRequest{ModuleName: "abcdefg"}, 166 single: true, 167 expPass: false, 168 }, 169 } 170 171 vm := suite.app.UpgradeKeeper.GetModuleVersionMap(suite.ctx) 172 mv := suite.app.UpgradeKeeper.GetModuleVersions(suite.ctx) 173 174 for _, tc := range testCases { 175 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 176 suite.SetupTest() // reset 177 178 res, err := suite.queryClient.ModuleVersions(gocontext.Background(), &tc.req) 179 180 if tc.expPass { 181 suite.Require().NoError(err) 182 suite.Require().NotNil(res) 183 184 if tc.single { 185 // test that the single module response is valid 186 suite.Require().Len(res.ModuleVersions, 1) 187 // make sure we got the right values 188 suite.Require().Equal(vm[tc.req.ModuleName], res.ModuleVersions[0].Version) 189 suite.Require().Equal(tc.req.ModuleName, res.ModuleVersions[0].Name) 190 } else { 191 // check that the full response is valid 192 suite.Require().NotEmpty(res.ModuleVersions) 193 suite.Require().Equal(len(mv), len(res.ModuleVersions)) 194 for i, v := range res.ModuleVersions { 195 suite.Require().Equal(mv[i].Version, v.Version) 196 suite.Require().Equal(mv[i].Name, v.Name) 197 } 198 } 199 } else { 200 suite.Require().Error(err) 201 } 202 }) 203 } 204 } 205 206 func TestUpgradeTestSuite(t *testing.T) { 207 suite.Run(t, new(UpgradeTestSuite)) 208 }