Skip to content

Commit

Permalink
v17 fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
fastfadingviolets committed May 13, 2024
1 parent 20023e8 commit bad88e7
Show file tree
Hide file tree
Showing 14 changed files with 193 additions and 120 deletions.
6 changes: 3 additions & 3 deletions .github/workflows/upgrade-gaia-v17-fresh-interchain.yml
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ jobs:
id: generate-tests
run: |
cd interchaintests
test_names=$(go test -list=. ./fresh | grep '^Test' | jq -c --raw-input --slurp 'split("\n") | map(select(. != ""))')
test_names=$(go test -list=. ./fresh/... | grep '^Test' | jq -c --raw-input --slurp 'split("\n") | map(select(. != ""))')
echo "$test_names" | tee ../tests.json
- name: Generate upgrade versions
id: generate-upgrade
Expand Down Expand Up @@ -105,7 +105,7 @@ jobs:
TEST_UPGRADE_VERSION: ${{ matrix.upgrade_version }}
TEST_TARGET_VERSION: ${{ env.TARGET_VERSION }}
TEST_DOCKER_REPOSITORY: "gaia"
CONTAINER_LOG_TAIL: "250"
CONTAINER_LOG_TAIL: "150"
run: |
cd interchaintests
go test -v -timeout 60m -run="^${{ matrix.test_name }}$" ./fresh/...
go test -failfast -p 1 -v -timeout 5h -run="^${{ matrix.test_name }}$" ./fresh/...
40 changes: 10 additions & 30 deletions interchaintests/fresh/baseline_consumer_chains_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/hyphacoop/cosmos-release-testing/interchaintests/fresh"
"github.com/stretchr/testify/require"
"golang.org/x/mod/semver"
)

func runConsumerChainTest(t *testing.T, otherChain, otherChainVersion string, shouldCopyProviderKey [fresh.NUM_VALIDATORS]bool) {
Expand All @@ -31,29 +32,33 @@ func runConsumerChainTest(t *testing.T, otherChain, otherChainVersion string, sh
fresh.CCVKeyAssignmentTest(ctx, t, provider, consumer, provider.Relayer, 1)
fresh.IBCTest(ctx, t, provider, consumer, provider.Relayer)

if semver.Compare(fresh.GetConfig(ctx).TargetVersion, "v17") >= 0 {
consumerConfig.TopN = 95
}

consumer2 := provider.AddConsumerChain(ctx, t, consumerConfig)
fresh.CCVKeyAssignmentTest(ctx, t, provider, consumer2, provider.Relayer, 1)
fresh.IBCTest(ctx, t, provider, consumer2, provider.Relayer)
fresh.RSValidatorsJailedTest(ctx, t, provider, consumer2)
}

func TestConsumerChainLaunchesAfterV16UpgradeICS40(t *testing.T) {
func TestConsumerChainLaunchesAfterUpgradeICS40(t *testing.T) {
runConsumerChainTest(t, "ics-consumer", "v4.0.0", fresh.NoProviderKeysCopied())
}

func TestConsumerChainLaunchesAfterV16UpgradeICS33AllKeysCopied(t *testing.T) {
func TestConsumerChainLaunchesAfterUpgradeICS33AllKeysCopied(t *testing.T) {
runConsumerChainTest(t, "ics-consumer", "v3.3.0", fresh.AllProviderKeysCopied())
}

func TestConsumerChainLaunchesAfterV16UpgradeICS33SomeKeysCopied(t *testing.T) {
func TestConsumerChainLaunchesAfterUpgradeICS33SomeKeysCopied(t *testing.T) {
runConsumerChainTest(t, "ics-consumer", "v3.3.0", fresh.SomeProviderKeysCopied())
}

func TestConsumerChainLaunchesAfterV16UpgradeICS33NoKeysCopied(t *testing.T) {
func TestConsumerChainLaunchesAfterUpgradeICS33NoKeysCopied(t *testing.T) {
runConsumerChainTest(t, "ics-consumer", "v3.3.0", fresh.NoProviderKeysCopied())
}

func TestMainnetConsumerChainsWithV16Upgrade(t *testing.T) {
func TestMainnetConsumerChainsAfterUpgrade(t *testing.T) {
ctx, err := fresh.NewTestContext(t)
require.NoError(t, err)
const neutronVersion = "v3.0.1"
Expand Down Expand Up @@ -91,28 +96,3 @@ func TestMainnetConsumerChainsWithV16Upgrade(t *testing.T) {
fresh.CCVKeyAssignmentTest(ctx, t, provider, stride, provider.Relayer, 1)
fresh.IBCTest(ctx, t, provider, stride, provider.Relayer)
}

func TestEpochsAfterV16(t *testing.T) {
ctx, err := fresh.NewTestContext(t)
require.NoError(t, err)

provider := fresh.CreateChain(ctx, t, fresh.GetConfig(ctx).StartVersion, true)
consumer := provider.AddConsumerChain(ctx, t, fresh.ConsumerConfig{
ChainName: "ics-consumer",
Version: "v4.0.0",
ShouldCopyProviderKey: fresh.AllProviderKeysCopied(),
Denom: fresh.CONSUMER_DENOM,
TopN: fresh.PSS_DISABLED,
})

fresh.CCVKeyAssignmentTest(ctx, t, provider, consumer, provider.Relayer, 1)

fresh.UpgradeChain(ctx, t, provider, fresh.GetConfig(ctx).TargetVersion, fresh.GetConfig(ctx).UpgradeVersion)
require.NoError(t, provider.Relayer.StopRelayer(ctx, fresh.GetRelayerExecReporter(ctx)))
require.NoError(t, provider.Relayer.StartRelayer(ctx, fresh.GetRelayerExecReporter(ctx)))

require.NoError(t, fresh.SetEpoch(ctx, provider, 20))
fresh.CCVKeyAssignmentTest(ctx, t, provider, consumer, provider.Relayer, 20)

require.Error(t, fresh.SetEpoch(ctx, provider, 0))
}
15 changes: 1 addition & 14 deletions interchaintests/fresh/baseline_lsm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/stretchr/testify/require"
)

func TestLSMWithV16Upgrade(t *testing.T) {
func TestLSMAfterUpgrade(t *testing.T) {
ctx, err := fresh.NewTestContext(t)
require.NoError(t, err)

Expand Down Expand Up @@ -41,16 +41,3 @@ func TestLSMWithV16Upgrade(t *testing.T) {
fresh.LSMHappyPathTest(ctx, t, provider, stride, provider.Relayer, lsmWallets)
fresh.ICADelegateHappyPathTest(ctx, t, provider, stride, provider.Relayer, icaAddr)
}

func TestLSMTokenizeVestedAfterV16Upgrade(t *testing.T) {
ctx, err := fresh.NewTestContext(t)
require.NoError(t, err)

provider := fresh.CreateChain(ctx, t, fresh.GetConfig(ctx).StartVersion, false)

fresh.TokenizeVestedAmountTest(ctx, t, provider, false)

fresh.UpgradeChain(ctx, t, provider, fresh.GetConfig(ctx).TargetVersion, fresh.GetConfig(ctx).UpgradeVersion)

fresh.TokenizeVestedAmountTest(ctx, t, provider, true)
}
2 changes: 1 addition & 1 deletion interchaintests/fresh/baseline_pfm_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/stretchr/testify/require"
)

func TestPFMAfterV16Upgrade(t *testing.T) {
func TestPFMAfterUpgrade(t *testing.T) {
ctx, err := fresh.NewTestContext(t)
require.NoError(t, err)
chains, relayer := fresh.CreateNLinkedChains(ctx, t, fresh.GetConfig(ctx).StartVersion, fresh.DEFAULT_CHANNEL_VERSION, 4)
Expand Down
2 changes: 1 addition & 1 deletion interchaintests/fresh/baseline_txs_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import (
"github.com/stretchr/testify/require"
)

func TestBaselineTXsAfterV16Upgrade(t *testing.T) {
func TestBaselineTXsAfterUpgrade(t *testing.T) {
t.Parallel()
ctx, err := fresh.NewTestContext(t)
require.NoError(t, err)
Expand Down
27 changes: 24 additions & 3 deletions interchaintests/fresh/chains.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"encoding/json"
"fmt"
"os"
"strconv"
"sync"
"testing"
Expand All @@ -20,6 +21,7 @@ import (
"github.com/strangelove-ventures/interchaintest/v7/testutil"
"github.com/stretchr/testify/require"
"github.com/tidwall/gjson"
"golang.org/x/mod/semver"
"golang.org/x/sync/errgroup"
)

Expand All @@ -45,7 +47,7 @@ func createConfigToml() testutil.Toml {
}

func createGaiaChainSpec(ctx context.Context, chainName, gaiaVersion string) *interchaintest.ChainSpec {
fullNodes := 1
fullNodes := NUM_FULL_NODES
validators := NUM_VALIDATORS
genesisOverrides := []cosmos.GenesisKV{
cosmos.NewGenesisKV("app_state.gov.params.voting_period", GOV_VOTING_PERIOD.String()),
Expand All @@ -57,6 +59,9 @@ func createGaiaChainSpec(ctx context.Context, chainName, gaiaVersion string) *in
cosmos.NewGenesisKV("app_state.provider.params.slash_meter_replenish_period", "2s"),
cosmos.NewGenesisKV("app_state.provider.params.slash_meter_replenish_fraction", "1.00"),
}
if semver.Compare(gaiaVersion, "v16") >= 0 {
genesisOverrides = append(genesisOverrides, cosmos.NewGenesisKV("app_state.provider.params.blocks_per_epoch", "1"))
}
return &interchaintest.ChainSpec{
Name: "gaia",
Version: gaiaVersion,
Expand Down Expand Up @@ -201,7 +206,9 @@ func CreateChain(ctx context.Context, t *testing.T, gaiaVersion string, withRela
setupRelayerKeys(ctx, t, relayer, relayerWallet, provider)
require.NoError(t, relayer.StartRelayer(ctx, GetRelayerExecReporter(ctx)))
t.Cleanup(func() {
_ = relayer.StopRelayer(ctx, GetRelayerExecReporter(ctx))
if os.Getenv("KEEP_CONTAINERS") == "" {
_ = relayer.StopRelayer(ctx, GetRelayerExecReporter(ctx))
}
})
}
return provider
Expand Down Expand Up @@ -263,9 +270,10 @@ func UpgradeChain(ctx context.Context, t *testing.T, chain Chain, upgradeName, v
require.NoError(t, err, "error fetching height after upgrade proposal passed")

// wait for the chain to halt. We're asking for blocks after the halt height, so we should time out.
timeoutCtx, timeoutCtxCancel := context.WithTimeout(ctx, (time.Duration(haltHeight-height)+6)*COMMIT_TIMEOUT)
timeoutCtx, timeoutCtxCancel := context.WithTimeout(ctx, (time.Duration(haltHeight-height)+10)*COMMIT_TIMEOUT)
defer timeoutCtxCancel()
err = testutil.WaitForBlocks(timeoutCtx, int(haltHeight-height)+3, chain)
require.Error(t, timeoutCtx.Err(), "chain should not produce blocks after halt height")
require.Error(t, err, "chain should not produce blocks after halt height")

height, err = chain.Height(ctx)
Expand Down Expand Up @@ -297,6 +305,10 @@ func UpgradeChain(ctx context.Context, t *testing.T, chain Chain, upgradeName, v
_, _, err := val.ExecBin(ctx, "keys", "list", "--keyring-backend", "test")
require.NoError(t, err)
}
if chain.Relayer != nil {
require.NoError(t, chain.Relayer.StopRelayer(ctx, GetRelayerExecReporter(ctx)))
require.NoError(t, chain.Relayer.StartRelayer(ctx, GetRelayerExecReporter(ctx)))
}
}

func GetChannelWithPort(ctx context.Context, relayer ibc.Relayer, chain, counterparty Chain, portID string) (*ibc.ChannelOutput, error) {
Expand Down Expand Up @@ -393,3 +405,12 @@ func SetEpoch(ctx context.Context, chain Chain, epoch int) error {
}
return chain.PassProposal(ctx, result.ProposalID)
}

func (c Chain) GetValidatorHex(ctx context.Context, val int) (string, error) {
json, err := c.Validators[val].ReadFile(ctx, "config/priv_validator_key.json")
if err != nil {
return "", err
}
providerHex := gjson.GetBytes(json, "address").String()
return providerHex, nil
}
1 change: 1 addition & 0 deletions interchaintests/fresh/const.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ const (
UPGRADE_DELTA = int64(30)
DENOM = "uatom"
NUM_VALIDATORS = 6
NUM_FULL_NODES = 0
VALIDATOR_FUNDS = 11_000_000_000
VALIDATOR_STAKE_STEP = 1_000_000
// This moniker is hardcoded into the chain's genesis process.
Expand Down
37 changes: 18 additions & 19 deletions interchaintests/fresh/ics.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import (
"github.com/tidwall/sjson"
)

type ConsumerBootstrapCb func(ctx context.Context, consumer ibc.Chain)
type ConsumerBootstrapCb func(ctx context.Context, consumer *cosmos.CosmosChain)

type ConsumerConfig struct {
ChainName string
Expand Down Expand Up @@ -139,9 +139,8 @@ func (p Chain) AddConsumerChain(ctx context.Context, t *testing.T, config Consum
})

if config.AfterSpawnTime != nil {
config.AfterSpawnTime(ctx, consumer)
config.AfterSpawnTime(ctx, consumer.CosmosChain)
}
// require.NoError(t, consumer.fundFullNode(ctx))

setupRelayerKeys(ctx, t, p.Relayer, relayerWallet, consumer)
rep := GetRelayerExecReporter(ctx)
Expand All @@ -156,7 +155,7 @@ func (p Chain) AddConsumerChain(ctx context.Context, t *testing.T, config Consum
}

func (p Chain) createConsumerChainSpec(ctx context.Context, chainID string, config ConsumerConfig, spawnTime time.Time, proposalWaiter *proposalWaiter) *interchaintest.ChainSpec {
fullNodes := 1
fullNodes := NUM_FULL_NODES
validators := NUM_VALIDATORS

chainType := config.ChainName
Expand Down Expand Up @@ -226,19 +225,19 @@ func (p Chain) createConsumerChainSpec(ctx context.Context, chainID string, conf
},
PreGenesis: func(consumer ibc.Chain) error {
if config.DuringDepositPeriod != nil {
config.DuringDepositPeriod(ctx, consumer)
config.DuringDepositPeriod(ctx, consumer.(*cosmos.CosmosChain))
}
proposalWaiter.allowDeposit()
proposalWaiter.waitForVotingPeriod()
if config.DuringVotingPeriod != nil {
config.DuringVotingPeriod(ctx, consumer)
config.DuringVotingPeriod(ctx, consumer.(*cosmos.CosmosChain))
}
proposalWaiter.allowVote()
proposalWaiter.waitForPassed()
tCtx, tCancel := context.WithDeadline(ctx, spawnTime)
defer tCancel()
if config.BeforeSpawnTime != nil {
config.BeforeSpawnTime(tCtx, consumer)
config.BeforeSpawnTime(tCtx, consumer.(*cosmos.CosmosChain))
}
// interchaintest will set up the validator keys right before PreGenesis.
// Now we just need to wait for the chain to spawn before interchaintest can get the ccv file.
Expand Down Expand Up @@ -371,19 +370,19 @@ func CheckIfValidatorJailed(ctx context.Context, t *testing.T, provider, consume
require.NoError(t, err)
valoper := wallets[validatorIdx].ValoperAddress
if shouldJail {
require.Eventually(t, func() bool {
require.Eventuallyf(t, func() bool {
return isValoperJailed(ctx, t, provider, valoper)
}, 30*COMMIT_TIMEOUT, COMMIT_TIMEOUT)
}, 30*COMMIT_TIMEOUT, COMMIT_TIMEOUT, "validator %d never jailed", validatorIdx)

require.NoError(t, consumer.Validators[validatorIdx].StartContainer(ctx))
time.Sleep(10 * COMMIT_TIMEOUT)
_, err = provider.Validators[validatorIdx].ExecTx(ctx, wallets[validatorIdx].Moniker, "slashing", "unjail")
require.NoError(t, err)
require.False(t, isValoperJailed(ctx, t, provider, valoper))
require.False(t, isValoperJailed(ctx, t, provider, valoper), "validator %d not unjailed", validatorIdx)
} else {
require.Never(t, func() bool {
require.Neverf(t, func() bool {
return isValoperJailed(ctx, t, provider, valoper)
}, 30*COMMIT_TIMEOUT, COMMIT_TIMEOUT)
}, 30*COMMIT_TIMEOUT, COMMIT_TIMEOUT, "validator %d jailed", validatorIdx)
}
}

Expand All @@ -396,7 +395,7 @@ func RSValidatorsJailedTest(ctx context.Context, t *testing.T, provider Chain, c
CheckIfValidatorJailed(ctx, t, provider, consumer, secondLastValidator, true)
}

func getPower(ctx context.Context, t *testing.T, chain Chain, hexaddr string) int64 {
func GetPower(ctx context.Context, t *testing.T, chain Chain, hexaddr string) int64 {
var power int64
CheckEndpoint(ctx, t, chain.GetHostRPCAddress()+"/validators", func(b []byte) error {
power = gjson.GetBytes(b, fmt.Sprintf("result.validators.#(address==\"%s\").voting_power", hexaddr)).Int()
Expand All @@ -420,7 +419,7 @@ func CCVKeyAssignmentTest(ctx context.Context, t *testing.T, provider, consumer
require.NoError(t, err)
consumerHex := gjson.GetBytes(json, "address").String()

providerPowerBefore := getPower(ctx, t, provider, providerHex)
providerPowerBefore := GetPower(ctx, t, provider, providerHex)

_, err = provider.Validators[0].ExecTx(ctx, providerAddress.Moniker,
"staking", "delegate",
Expand All @@ -429,17 +428,17 @@ func CCVKeyAssignmentTest(ctx context.Context, t *testing.T, provider, consumer
require.NoError(t, err)

if blocksPerEpoch > 1 {
require.Greater(t, getPower(ctx, t, provider, providerHex), providerPowerBefore)
require.NotEqual(t, getPower(ctx, t, provider, providerHex), getPower(ctx, t, consumer, consumerHex))
require.Greater(t, GetPower(ctx, t, provider, providerHex), providerPowerBefore)
require.NotEqual(t, GetPower(ctx, t, provider, providerHex), GetPower(ctx, t, consumer, consumerHex))
require.NoError(t, testutil.WaitForBlocks(ctx, blocksPerEpoch, provider))
}

require.Eventually(t, func() bool {
providerPower := getPower(ctx, t, provider, providerHex)
consumerPower := getPower(ctx, t, consumer, consumerHex)
providerPower := GetPower(ctx, t, provider, providerHex)
consumerPower := GetPower(ctx, t, consumer, consumerHex)
if providerPowerBefore >= providerPower {
return false
}
return providerPower == consumerPower
}, 10*time.Minute, COMMIT_TIMEOUT)
}, 15*time.Minute, COMMIT_TIMEOUT)
}
Loading

0 comments on commit bad88e7

Please sign in to comment.