TestValidatorChangesSaveLoad tests saving and loading a validator set with changes.
(t *testing.T)
| 257 | |
| 258 | // TestValidatorChangesSaveLoad tests saving and loading a validator set with changes. |
| 259 | func TestOneValidatorChangesSaveLoad(t *testing.T) { |
| 260 | tearDown, stateDB, state := setupTestCase(t) |
| 261 | defer tearDown(t) |
| 262 | stateStore := sm.NewStore(stateDB, sm.StoreOptions{ |
| 263 | DiscardABCIResponses: false, |
| 264 | }) |
| 265 | |
| 266 | // Change vals at these heights. |
| 267 | changeHeights := []int64{1, 2, 4, 5, 10, 15, 16, 17, 20} |
| 268 | N := len(changeHeights) |
| 269 | |
| 270 | // Build the validator history by running updateState |
| 271 | // with the right validator set for each height. |
| 272 | highestHeight := changeHeights[N-1] + 5 |
| 273 | changeIndex := 0 |
| 274 | _, val := state.Validators.GetByIndex(0) |
| 275 | power := val.VotingPower |
| 276 | var err error |
| 277 | var validatorUpdates []*types.Validator |
| 278 | for i := int64(1); i < highestHeight; i++ { |
| 279 | // When we get to a change height, use the next pubkey. |
| 280 | if changeIndex < len(changeHeights) && i == changeHeights[changeIndex] { |
| 281 | changeIndex++ |
| 282 | power++ |
| 283 | } |
| 284 | header, blockID, responses := makeHeaderPartsResponsesValPowerChange(state, power) |
| 285 | validatorUpdates, err = types.PB2TM.ValidatorUpdates(responses.EndBlock.ValidatorUpdates) |
| 286 | require.NoError(t, err) |
| 287 | state, err = sm.UpdateState(state, blockID, &header, responses, validatorUpdates) |
| 288 | require.NoError(t, err) |
| 289 | err := stateStore.Save(state) |
| 290 | require.NoError(t, err) |
| 291 | } |
| 292 | |
| 293 | // On each height change, increment the power by one. |
| 294 | testCases := make([]int64, highestHeight) |
| 295 | changeIndex = 0 |
| 296 | power = val.VotingPower |
| 297 | for i := int64(1); i < highestHeight+1; i++ { |
| 298 | // We get to the height after a change height use the next pubkey (note |
| 299 | // our counter starts at 0 this time). |
| 300 | if changeIndex < len(changeHeights) && i == changeHeights[changeIndex]+1 { |
| 301 | changeIndex++ |
| 302 | power++ |
| 303 | } |
| 304 | testCases[i-1] = power |
| 305 | } |
| 306 | |
| 307 | for i, power := range testCases { |
| 308 | v, err := stateStore.LoadValidators(int64(i + 1 + 1)) // +1 because vset changes delayed by 1 block. |
| 309 | assert.Nil(t, err, fmt.Sprintf("expected no err at height %d", i)) |
| 310 | assert.Equal(t, v.Size(), 1, "validator set size is greater than 1: %d", v.Size()) |
| 311 | _, val := v.GetByIndex(0) |
| 312 | |
| 313 | assert.Equal(t, val.VotingPower, power, fmt.Sprintf(`unexpected powerat |
| 314 | height %d`, i)) |
| 315 | } |
| 316 | } |
nothing calls this directly
no test coverage detected