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: migrate e2e/genutil to systemtest #22325

Merged
merged 16 commits into from
Oct 25, 2024
232 changes: 0 additions & 232 deletions tests/e2e/genutil/export_test.go

This file was deleted.

2 changes: 1 addition & 1 deletion tests/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ require (
// this version is not used as it is always replaced by the latest Cosmos SDK version
github.com/cosmos/cosmos-sdk v0.53.0
github.com/cosmos/gogoproto v1.7.0
github.com/spf13/cobra v1.8.1
github.com/spf13/cobra v1.8.1 // indirect
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Direct usage of github.com/spf13/cobra detected

The github.com/spf13/cobra dependency is still directly used in the codebase. Please review the dependency status to ensure it is correctly marked as indirect.

🔗 Analysis chain

Verify the indirect status of github.com/spf13/cobra

The github.com/spf13/cobra dependency is now marked as indirect. This suggests that it's no longer directly used in the code but is still required by other dependencies. Please verify that this change is intentional and doesn't affect any functionality.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for direct usage of cobra in the codebase
rg -i 'cobra\.' --type go

Length of output: 55686

github.com/stretchr/testify v1.9.0
go.uber.org/mock v0.5.0
google.golang.org/grpc v1.67.1
Expand Down
88 changes: 88 additions & 0 deletions tests/systemtests/export_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
//go:build system_test

package systemtests

import (
"fmt"
"os"
"testing"
"time"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/tidwall/gjson"
)

func TestExportCmd_WithHeight(t *testing.T) {
sut.ResetChain(t)
cli := NewCLIWrapper(t, sut, verbose)

sut.StartChain(t)

// Wait 10s for producing blocks
time.Sleep(10 * time.Second)
Comment on lines +22 to +23
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Replace hard-coded sleep with deterministic block height check

Using time.Sleep for block production can lead to flaky tests. Consider implementing a polling mechanism that checks for the desired block height.

Example implementation:

-// Wait 10s for producing blocks
-time.Sleep(10 * time.Second)
+// Wait for chain to produce some blocks
+require.Eventually(t, func() bool {
+    height, err := sut.QueryCurrentHeight()
+    return err == nil && height >= 5
+}, 30*time.Second, 100*time.Millisecond)

Committable suggestion was skipped due to low confidence.


sut.StopChain()

testCases := []struct {
name string
args []string
expZeroHeight bool
}{
{"should export correct height", []string{"genesis", "export", "--home", sut.nodePath(0)}, false},
{"should export correct height with --height", []string{"genesis", "export", "--height=5", "--home", sut.nodePath(0), "--log_level=disabled"}, false},
{"should export height 0 with --for-zero-height", []string{"genesis", "export", "--for-zero-height=true", "--home", sut.nodePath(0)}, true},
}

for _, tc := range testCases {
res := cli.RunCommandWithArgs(tc.args...)
height := gjson.Get(res, "initial_height").Int()
if tc.expZeroHeight {
require.Equal(t, height, int64(0))
} else {
require.Greater(t, height, int64(0))
}

// Check consensus params of exported state
maxGas := gjson.Get(res, "consensus.params.block.max_gas").Int()
require.Equal(t, maxGas, int64(MaxGas))
}
}

func TestExportCmd_WithFileFlag(t *testing.T) {
sut.ResetChain(t)
cli := NewCLIWrapper(t, sut, verbose)
exportFile := "foobar.json"

sut.StartChain(t)

// Wait 10s for producing blocks
time.Sleep(10 * time.Second)

sut.StopChain()

testCases := []struct {
name string
args []string
expErr bool
errMsg string
}{
{"invalid home dir", []string{"genesis", "export", "--home=foo"}, true, "no such file or directory"},
{"should export state to the specified file", []string{"genesis", "export", fmt.Sprintf("--output-document=%s", exportFile), "--home", sut.nodePath(0)}, false, ""},
}

for _, tc := range testCases {
if tc.expErr {
assertOutput := func(_ assert.TestingT, gotErr error, gotOutputs ...interface{}) bool {
require.Contains(t, gotOutputs[0], tc.errMsg)
return false
}
cli.WithRunErrorMatcher(assertOutput).RunCommandWithArgs(tc.args...)
} else {
cli.RunCommandWithArgs(tc.args...)
require.FileExists(t, exportFile)
err := os.Remove(exportFile)
require.NoError(t, err)
}
}
}
4 changes: 3 additions & 1 deletion tests/systemtests/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ var (

// ExecBinaryUnversionedRegExp regular expression to extract the unversioned binary name
ExecBinaryUnversionedRegExp = regexp.MustCompile(`^(\w+)-?.*$`)

MaxGas = 10_000_000
)

type TestnetInitializer interface {
Expand Down Expand Up @@ -130,7 +132,7 @@ func (s *SystemUnderTest) SetupChain() {
panic(fmt.Sprintf("failed to load genesis: %s", err))
}

genesisBz, err = sjson.SetRawBytes(genesisBz, "consensus.params.block.max_gas", []byte(fmt.Sprintf(`"%d"`, 10_000_000)))
genesisBz, err = sjson.SetRawBytes(genesisBz, "consensus.params.block.max_gas", []byte(fmt.Sprintf(`"%d"`, MaxGas)))
if err != nil {
panic(fmt.Sprintf("failed to set block max gas: %s", err))
}
Comment on lines +135 to 138
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codebase verification

Inconsistent Usage of Gas Limits Detected

Several hardcoded gas limits found alongside MaxGas usage may lead to inconsistencies.

  • x/simulation/simulate.go:40-45
  • types/tx/types.go:18-19,61-64
  • server/v2/cometbft/abci_test.go:37,335,374,638
  • baseapp/abci_utils.go:262,415
🔗 Analysis chain

Usage of MaxGas constant in SetupChain method

The MaxGas constant is now used to set the maximum gas limit in the genesis block configuration. This change improves code consistency and makes it easier to modify the gas limit across the system if needed.

However, to ensure this change doesn't have unintended consequences, we should verify its usage across the codebase.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for other occurrences of hardcoded gas limits that might need updating

# Search for potential hardcoded gas limits
rg -n '(?i)gas.*limit.*=.*\d{7,}' --type go

# Search for other uses of MaxGas to ensure consistent usage
rg -n 'MaxGas' --type go

Length of output: 5558

Expand Down
Loading