Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: adapt e2e compatibility tests #2247

Merged
merged 3 commits into from
Sep 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/nightly-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
# Run compatibility tests for different consumer (-cv) and provider (-pv) versions.
# Combination of all provider versions with consumer versions are tested.
# For new versions to be tested add/modify -pc/-cv parameters.
run: go run ./tests/e2e/... --tc compatibility -pv latest -pv v4.3.1-lsm -pv v3.3.3-lsm -cv latest -cv v4.4.0 -cv v3.3.0
run: go run ./tests/e2e/... --tc compatibility -pv latest -cv latest -cv v5.2.0 -cv v4.4.0
happy-path-test:
runs-on: ubuntu-latest
timeout-minutes: 20
Expand Down
7 changes: 3 additions & 4 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ BRANCH := $(shell git rev-parse --abbrev-ref HEAD)
COMMIT := $(shell git log -1 --format='%H')
# Fetch tags and get the latest ICS version by filtering tags by vX.Y.Z and vX.Y.Z-lsm
# using lazy set to only execute commands when variable is used
# Note: v.5.0.0 is currently excluded from the list as it's a pre-release and will be added back once it's out of pre-release status
LATEST_RELEASE ?= $(shell git fetch; git tag -l --sort -v:refname 'v*.?' 'v*.?'-lsm 'v*.??' 'v*.??'-lsm --no-contains v5.0.0 | head -n 1)
LATEST_RELEASE ?= $(shell git fetch; git tag -l --sort -v:refname 'v*.?' 'v*.?'-lsm 'v*.??' 'v*.??'-lsm | head -n 1)

# don't override user values
ifeq (,$(VERSION))
Expand Down Expand Up @@ -98,9 +97,9 @@ test-e2e-multi-consumer:
test-e2e-parallel:
go run ./tests/e2e/... --include-multi-consumer --parallel

# run E2E compatibility tests against latest release
# run E2E compatibility tests against consumer running latest release
test-e2e-compatibility-tests-latest:
go run ./tests/e2e/... --tc compatibility -pv $(LATEST_RELEASE)
go run ./tests/e2e/... --tc compatibility -cv $(LATEST_RELEASE)

# run full E2E tests in sequence (including multiconsumer) using latest tagged gaia
test-gaia-e2e:
Expand Down
77 changes: 40 additions & 37 deletions tests/e2e/actions.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,11 @@ const (
V300 = "v3.0.0"
)

// type aliases
type (
AssignConsumerPubKeyAction = e2e.AssignConsumerPubKeyAction
)

type SendTokensAction struct {
Chain ChainID
From ValidatorID
Expand Down Expand Up @@ -1971,11 +1976,11 @@ func (tr Chain) relayPacketsHermes(
action RelayPacketsAction,
verbose bool,
) {
// Because `.app_state.provider.params.blocks_per_epoch` is set to 3 in the E2E tests, we wait 3 blocks
// Because `.app_state.provider.params.blocks_per_epoch` is set to 3 in the E2E tests, we wait 4 blocks
// before relaying the packets to guarantee that at least one epoch passes and hence any `VSCPacket`s get
// queued and are subsequently relayed.
tr.waitBlocks(action.ChainA, 3, 90*time.Second)
tr.waitBlocks(action.ChainB, 3, 90*time.Second)
tr.waitBlocks(action.ChainA, 4, 90*time.Second)
tr.waitBlocks(action.ChainB, 4, 90*time.Second)

// hermes clear packets ibc0 transfer channel-13
cmd := tr.target.ExecCommand("hermes", "clear", "packets",
Expand All @@ -1992,8 +1997,8 @@ func (tr Chain) relayPacketsHermes(
log.Fatal(err, "\n", string(bz))
}

tr.waitBlocks(action.ChainA, 1, 30*time.Second)
tr.waitBlocks(action.ChainB, 1, 30*time.Second)
tr.waitBlocks(action.ChainA, 2, 30*time.Second)
tr.waitBlocks(action.ChainB, 2, 30*time.Second)
}

type RelayRewardPacketsToProviderAction struct {
Expand Down Expand Up @@ -2349,7 +2354,7 @@ type UnjailValidatorAction struct {
// Sends an unjail transaction to the provider chain
func (tr Chain) unjailValidator(action UnjailValidatorAction, verbose bool) {
// wait until downtime_jail_duration has elapsed, to make sure the validator can be unjailed
tr.WaitTime(61 * time.Second)
tr.WaitTime(65 * time.Second)

cmd := tr.target.ExecCommand(
tr.testConfig.chainConfigs[action.Provider].BinaryName,
Expand Down Expand Up @@ -2611,7 +2616,7 @@ func (tr Chain) invokeDoublesignSlash(
if err != nil {
log.Fatal(err, "\n", string(bz))
}
tr.waitBlocks("provi", 20, 4*time.Minute)
tr.waitBlocks("provi", 25, 4*time.Minute)
} else { // tr.useCometMock
validatorPrivateKeyAddress := tr.GetValidatorPrivateKeyAddress(action.Chain, action.Validator)

Expand Down Expand Up @@ -2701,18 +2706,7 @@ func (tr Chain) lightClientAttack(
tr.waitBlocks(chain, 1, 10*time.Second)
}

type AssignConsumerPubKeyAction struct {
Chain ChainID
Validator ValidatorID
ConsumerPubkey string
// ReconfigureNode will change keys the node uses and restart
ReconfigureNode bool
// executing the action should raise an error
ExpectError bool
ExpectedError string
}

func (tr Chain) assignConsumerPubKey(action AssignConsumerPubKeyAction, verbose bool) {
func (tr Chain) assignConsumerPubKey(action e2e.AssignConsumerPubKeyAction, verbose bool) {
valCfg := tr.testConfig.validatorConfigs[action.Validator]

// Note: to get error response reported back from this command '--gas auto' needs to be set.
Expand All @@ -2722,28 +2716,12 @@ func (tr Chain) assignConsumerPubKey(action AssignConsumerPubKeyAction, verbose
gas = "9000000"
}

assignKey := fmt.Sprintf(
`%s tx provider assign-consensus-key %s '%s' --from validator%s --chain-id %s --home %s --node %s --gas %s --keyring-backend test -y -o json`,
tr.testConfig.chainConfigs[ChainID("provi")].BinaryName,
string(tr.testConfig.chainConfigs[action.Chain].ConsumerId),
action.ConsumerPubkey,
action.Validator,
tr.testConfig.chainConfigs[ChainID("provi")].ChainId,
bz, err := tr.target.AssignConsumerPubKey(action, gas,
tr.getValidatorHome(ChainID("provi"), action.Validator),
tr.getValidatorNode(ChainID("provi"), action.Validator),
gas,
verbose,
)

cmd := tr.target.ExecCommand(
"/bin/bash", "-c",
assignKey,
)

if verbose {
fmt.Println("assignConsumerPubKey cmd:", cmd.String())
}

bz, err := cmd.CombinedOutput()
if err != nil && !action.ExpectError {
log.Fatalf("unexpected error during key assignment - output: %s, err: %s", string(bz), err)
}
Expand Down Expand Up @@ -3112,3 +3090,28 @@ func (tr Chain) AdvanceTimeForChain(chain ChainID, duration time.Duration) {
// wait for 1 block of the chain to get a block with the advanced timestamp
tr.waitBlocks(chain, 1, time.Minute)
}

func (tr Commands) AssignConsumerPubKey(action e2e.AssignConsumerPubKeyAction, gas, home, node string, verbose bool) ([]byte, error) {
assignKey := fmt.Sprintf(
`%s tx provider assign-consensus-key %s '%s' --from validator%s --chain-id %s --home %s --node %s --gas %s --keyring-backend test -y -o json`,
tr.chainConfigs[ChainID("provi")].BinaryName,
string(tr.chainConfigs[action.Chain].ConsumerId),
action.ConsumerPubkey,
action.Validator,
tr.chainConfigs[ChainID("provi")].ChainId,
home,
node,
gas,
)

cmd := tr.target.ExecCommand(
"/bin/bash", "-c",
assignKey,
)

if verbose {
fmt.Println("assignConsumerPubKey cmd:", cmd.String())
}

return cmd.CombinedOutput()
}
115 changes: 0 additions & 115 deletions tests/e2e/state.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,121 +43,6 @@ type Chain struct {
testConfig *TestConfig
}

func (tr Chain) GetChainState(chain ChainID, modelState ChainState) ChainState {
chainState := ChainState{}

if modelState.ValBalances != nil {
valBalances := tr.GetBalances(chain, *modelState.ValBalances)
chainState.ValBalances = &valBalances
}

if modelState.Proposals != nil {
proposals := tr.GetProposals(chain, *modelState.Proposals)
chainState.Proposals = &proposals
}

if modelState.ProposedConsumerChains != nil {
proposedConsumerChains := tr.GetProposedConsumerChains(chain)
chainState.ProposedConsumerChains = &proposedConsumerChains
}

if modelState.ValPowers != nil {
tr.waitBlocks(chain, 1, 10*time.Second)
powers := tr.GetValPowers(chain, *modelState.ValPowers)
chainState.ValPowers = &powers
}

if modelState.StakedTokens != nil {
representPowers := tr.GetStakedTokens(chain, *modelState.StakedTokens)
chainState.StakedTokens = &representPowers
}

if modelState.IBCTransferParams != nil {
params := tr.target.GetIBCTransferParams(chain)
chainState.IBCTransferParams = &params
}

if modelState.Rewards != nil {
rewards := tr.GetRewards(chain, *modelState.Rewards)
chainState.Rewards = &rewards
}

if modelState.ConsumerChains != nil {
chains := tr.target.GetConsumerChains(chain)
chainState.ConsumerChains = &chains
}

if modelState.AssignedKeys != nil {
assignedKeys := tr.GetConsumerAddresses(chain, *modelState.AssignedKeys)
chainState.AssignedKeys = &assignedKeys
}

if modelState.ProviderKeys != nil {
providerKeys := tr.GetProviderAddresses(chain, *modelState.ProviderKeys)
chainState.ProviderKeys = &providerKeys
}

if modelState.RegisteredConsumerRewardDenoms != nil {
registeredConsumerRewardDenoms := tr.target.GetRegisteredConsumerRewardDenoms(chain)
chainState.RegisteredConsumerRewardDenoms = &registeredConsumerRewardDenoms
}

if modelState.ClientsFrozenHeights != nil {
chainClientsFrozenHeights := map[string]clienttypes.Height{}
for id := range *modelState.ClientsFrozenHeights {
chainClientsFrozenHeights[id] = tr.GetClientFrozenHeight(chain, id)
}
chainState.ClientsFrozenHeights = &chainClientsFrozenHeights
}

if modelState.HasToValidate != nil {
hasToValidate := map[ValidatorID][]ChainID{}
for validatorId := range *modelState.HasToValidate {
hasToValidate[validatorId] = tr.target.GetHasToValidate(validatorId)
}
chainState.HasToValidate = &hasToValidate
}

if modelState.InflationRateChange != nil {
// get the inflation rate now
inflationRateNow := tr.target.GetInflationRate(chain)

// wait a block
tr.waitBlocks(chain, 1, 10*time.Second)

// get the new inflation rate
inflationRateAfter := tr.target.GetInflationRate(chain)

// calculate the change
inflationRateChange := inflationRateAfter - inflationRateNow
var inflationRateChangeDirection int
if inflationRateChange > 0 {
inflationRateChangeDirection = 1
} else if inflationRateChange < 0 {
inflationRateChangeDirection = -1
} else {
inflationRateChangeDirection = 0
}
chainState.InflationRateChange = &inflationRateChangeDirection
}

if modelState.ConsumerCommissionRates != nil {
consumerCommissionRates := tr.GetConsumerCommissionRates(chain, *modelState.ConsumerCommissionRates)
chainState.ConsumerCommissionRates = &consumerCommissionRates
}

if modelState.ConsumerPendingPacketQueueSize != nil {
pendingPacketQueueSize := tr.target.GetPendingPacketQueueSize(chain)
chainState.ConsumerPendingPacketQueueSize = &pendingPacketQueueSize
}

if *verbose {
log.Println("Done getting chain state:\n" + pretty.Sprint(chainState))
}

return chainState
}

func (tr Chain) waitBlocks(chain ChainID, blocks uint, timeout time.Duration) {
if tr.testConfig.useCometmock {
// call advance_blocks method on cometmock
Expand Down
Loading
Loading