github.com/Finschia/finschia-sdk@v0.49.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 err := suite.app.UpgradeKeeper.ScheduleUpgrade(suite.ctx, plan) 59 suite.Require().NoError(err) 60 61 req = &types.QueryCurrentPlanRequest{} 62 expResponse = types.QueryCurrentPlanResponse{Plan: &plan} 63 }, 64 true, 65 }, 66 } 67 68 for _, tc := range testCases { 69 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 70 suite.SetupTest() // reset 71 72 tc.malleate() 73 74 res, err := suite.queryClient.CurrentPlan(gocontext.Background(), req) 75 76 if tc.expPass { 77 suite.Require().NoError(err) 78 suite.Require().NotNil(res) 79 suite.Require().Equal(&expResponse, res) 80 } else { 81 suite.Require().Error(err) 82 } 83 }) 84 } 85 } 86 87 func (suite *UpgradeTestSuite) TestAppliedCurrentPlan() { 88 var ( 89 req *types.QueryAppliedPlanRequest 90 expHeight int64 91 ) 92 93 testCases := []struct { 94 msg string 95 malleate func() 96 expPass bool 97 }{ 98 { 99 "with non-existent upgrade plan", 100 func() { 101 req = &types.QueryAppliedPlanRequest{Name: "foo"} 102 }, 103 true, 104 }, 105 { 106 "with applied upgrade plan", 107 func() { 108 expHeight = 5 109 110 planName := "test-plan" 111 plan := types.Plan{Name: planName, Height: expHeight} 112 err := suite.app.UpgradeKeeper.ScheduleUpgrade(suite.ctx, plan) 113 suite.Require().NoError(err) 114 115 suite.ctx = suite.ctx.WithBlockHeight(expHeight) 116 suite.app.UpgradeKeeper.SetUpgradeHandler(planName, func(ctx sdk.Context, plan types.Plan, vm module.VersionMap) (module.VersionMap, error) { 117 return vm, nil 118 }) 119 suite.app.UpgradeKeeper.ApplyUpgrade(suite.ctx, plan) 120 121 req = &types.QueryAppliedPlanRequest{Name: planName} 122 }, 123 true, 124 }, 125 } 126 127 for _, tc := range testCases { 128 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 129 suite.SetupTest() // reset 130 131 tc.malleate() 132 133 res, err := suite.queryClient.AppliedPlan(gocontext.Background(), req) 134 135 if tc.expPass { 136 suite.Require().NoError(err) 137 suite.Require().NotNil(res) 138 suite.Require().Equal(expHeight, res.Height) 139 } else { 140 suite.Require().Error(err) 141 } 142 }) 143 } 144 } 145 146 func (suite *UpgradeTestSuite) TestModuleVersions() { 147 testCases := []struct { 148 msg string 149 req types.QueryModuleVersionsRequest 150 single bool 151 expPass bool 152 }{ 153 { 154 msg: "test full query", 155 req: types.QueryModuleVersionsRequest{}, 156 single: false, 157 expPass: true, 158 }, 159 { 160 msg: "test single module", 161 req: types.QueryModuleVersionsRequest{ModuleName: "bank"}, 162 single: true, 163 expPass: true, 164 }, 165 { 166 msg: "test non-existent module", 167 req: types.QueryModuleVersionsRequest{ModuleName: "abcdefg"}, 168 single: true, 169 expPass: false, 170 }, 171 } 172 173 vm := suite.app.UpgradeKeeper.GetModuleVersionMap(suite.ctx) 174 mv := suite.app.UpgradeKeeper.GetModuleVersions(suite.ctx) 175 176 for _, tc := range testCases { 177 suite.Run(fmt.Sprintf("Case %s", tc.msg), func() { 178 suite.SetupTest() // reset 179 180 res, err := suite.queryClient.ModuleVersions(gocontext.Background(), &tc.req) 181 182 if tc.expPass { 183 suite.Require().NoError(err) 184 suite.Require().NotNil(res) 185 186 if tc.single { 187 // test that the single module response is valid 188 suite.Require().Len(res.ModuleVersions, 1) 189 // make sure we got the right values 190 suite.Require().Equal(vm[tc.req.ModuleName], res.ModuleVersions[0].Version) 191 suite.Require().Equal(tc.req.ModuleName, res.ModuleVersions[0].Name) 192 } else { 193 // check that the full response is valid 194 suite.Require().NotEmpty(res.ModuleVersions) 195 suite.Require().Equal(len(mv), len(res.ModuleVersions)) 196 for i, v := range res.ModuleVersions { 197 suite.Require().Equal(mv[i].Version, v.Version) 198 suite.Require().Equal(mv[i].Name, v.Name) 199 } 200 } 201 } else { 202 suite.Require().Error(err) 203 } 204 }) 205 } 206 } 207 208 func TestUpgradeTestSuite(t *testing.T) { 209 suite.Run(t, new(UpgradeTestSuite)) 210 }