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(server/v2): Add system-test for store's command #21357

Merged
merged 19 commits into from
Sep 23, 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
5 changes: 4 additions & 1 deletion store/snapshots/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -388,8 +388,11 @@ func (m *Manager) doRestoreSnapshot(snapshot types.Snapshot, chChunks <-chan io.
return errorsmod.Wrapf(err, "extension %s restore", metadata.Name)
}

if nextItem.GetExtensionPayload() != nil {
payload := nextItem.GetExtensionPayload()
if payload != nil && len(payload.Payload) != 0 {
return fmt.Errorf("extension %s don't exhausted payload stream", metadata.Name)
} else {
break
}
}
return nil
Expand Down
5 changes: 4 additions & 1 deletion store/v2/snapshots/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -437,8 +437,11 @@ func (m *Manager) doRestoreSnapshot(snapshot types.Snapshot, chChunks <-chan io.
return errorsmod.Wrapf(err, "extension %s restore", metadata.Name)
}

if nextItem.GetExtensionPayload() != nil {
payload := nextItem.GetExtensionPayload()
if payload != nil && len(payload.Payload) != 0 {
return fmt.Errorf("extension %s don't exhausted payload stream", metadata.Name)
} else {
break
Comment on lines +440 to +444
Copy link
Contributor

Choose a reason for hiding this comment

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

Grammar correction needed in error message.

The error message in the condition check uses incorrect grammar. It should be corrected to maintain professionalism and clarity in the codebase. Here's the suggested correction:

- return fmt.Errorf("extension %s don't exhausted payload stream", metadata.Name)
+ return fmt.Errorf("extension %s has not exhausted the payload stream", metadata.Name)
Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
payload := nextItem.GetExtensionPayload()
if payload != nil && len(payload.Payload) != 0 {
return fmt.Errorf("extension %s don't exhausted payload stream", metadata.Name)
} else {
break
payload := nextItem.GetExtensionPayload()
if payload != nil && len(payload.Payload) != 0 {
return fmt.Errorf("extension %s has not exhausted the payload stream", metadata.Name)
} else {
break

}
}

Expand Down
7 changes: 7 additions & 0 deletions tests/systemtests/cli.go
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,13 @@ func (c CLIWrapper) RunAndWait(args ...string) string {
return txResult
}

// RunCommandWithArgs use for run cli command, not tx
func (c CLIWrapper) RunCommandWithArgs(args ...string) string {
c.t.Helper()
execOutput, _ := c.run(args)
return execOutput
}

// AwaitTxCommitted wait for tx committed on chain
// returns the server execution result and true when found within 3 blocks.
func (c CLIWrapper) AwaitTxCommitted(submitResp string, timeout ...time.Duration) (string, bool) {
Expand Down
98 changes: 98 additions & 0 deletions tests/systemtests/snapshots_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
//go:build system_test
Copy link
Member

Choose a reason for hiding this comment

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

As the commands are really different between simapp and simapp v2, shall we not split the test in two tests?
The multiple if conditions will make it harder to maintain.

We can then just skip the tests when we run with COSMOS_BUILD_OPTIONS v2 and vice versa

Wdyt? cc @tac0turtle

Copy link
Contributor Author

Choose a reason for hiding this comment

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

should we update the prefix, most diff is that v2 has store prefix and v1 has snapshots?


package systemtests

import (
"fmt"
"github.com/stretchr/testify/require"
"os"
"testing"
)

func TestSnapshots(t *testing.T) {

sut.ResetChain(t)
cli := NewCLIWrapper(t, sut, verbose)
sut.StartChain(t)

// Wait for chain produce some blocks
sut.AwaitNBlocks(t, 6)
// Stop all nodes
sut.StopChain()

var (
command string
restoreableDirs []string
)
node0Dir := sut.NodeDir(0)
if isV2() {
command = "store"
restoreableDirs = []string{fmt.Sprintf("%s/data/application.db", node0Dir), fmt.Sprintf("%s/data/ss", node0Dir)}
} else {
command = "snapshots"
restoreableDirs = []string{fmt.Sprintf("%s/data/application.db", node0Dir)}
}

// export snapshot at height 5
res := cli.RunCommandWithArgs(command, "export", "--height=5", fmt.Sprintf("--home=%s", node0Dir))
require.Contains(t, res, "Snapshot created at height 5")
require.DirExists(t, fmt.Sprintf("%s/data/snapshots/5/3", node0Dir))

// Check snapshots list
res = cli.RunCommandWithArgs(command, "list", fmt.Sprintf("--home=%s", node0Dir))
require.Contains(t, res, "height: 5")

// Dump snapshot
res = cli.RunCommandWithArgs(command, "dump", "5", "3", fmt.Sprintf("--home=%s", node0Dir), fmt.Sprintf("--output=%s/5-3.tar.gz", node0Dir))
// Check if output file exist
require.FileExists(t, fmt.Sprintf("%s/5-3.tar.gz", node0Dir))

// Delete snapshots
res = cli.RunCommandWithArgs(command, "delete", "5", "3", fmt.Sprintf("--home=%s", node0Dir))
require.NoDirExists(t, fmt.Sprintf("%s/data/snapshots/5/3", node0Dir))

// Load snapshot from file
res = cli.RunCommandWithArgs(command, "load", fmt.Sprintf("%s/5-3.tar.gz", node0Dir), fmt.Sprintf("--home=%s", node0Dir))
require.DirExists(t, fmt.Sprintf("%s/data/snapshots/5/3", node0Dir))

// Restore from snapshots
for _, dir := range restoreableDirs {
require.NoError(t, os.RemoveAll(dir))
}
// Remove database
err := os.RemoveAll(fmt.Sprintf("%s/data/application.db", node0Dir))
require.NoError(t, err)
if isV2() {
require.NoError(t, os.RemoveAll(fmt.Sprintf("%s/data/ss", node0Dir)))
}

res = cli.RunCommandWithArgs(command, "restore", "5", "3", fmt.Sprintf("--home=%s", node0Dir))
for _, dir := range restoreableDirs {
require.DirExists(t, dir)
}
}

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

sut.StartChain(t)

// Wait for chain produce some blocks
sut.AwaitNBlocks(t, 6)

// Stop all nodes
sut.StopChain()

node0Dir := sut.NodeDir(0)

// prune
var command []string
if isV2() {
command = []string{"store", "prune", "--keep-recent=1"}
} else {
command = []string{"prune", "everything"}
}
res := cli.RunCommandWithArgs(append(command, fmt.Sprintf("--home=%s", node0Dir))...)
require.Contains(t, res, "successfully pruned the application root multi stores")
}
14 changes: 13 additions & 1 deletion tests/systemtests/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -360,7 +360,13 @@ func (s *SystemUnderTest) PrintBuffer() {
})
}

// AwaitBlockHeight blocks until te target height is reached. An optional timeout parameter can be passed to abort early
// AwaitNBlocks blocks until the current height + n block is reached. An optional timeout parameter can be passed to abort early
func (s *SystemUnderTest) AwaitNBlocks(t *testing.T, n int64, timeout ...time.Duration) {
t.Helper()
s.AwaitBlockHeight(t, s.CurrentHeight()+n, timeout...)
}

// AwaitBlockHeight blocks until the target height is reached. An optional timeout parameter can be passed to abort early
func (s *SystemUnderTest) AwaitBlockHeight(t *testing.T, targetHeight int64, timeout ...time.Duration) {
t.Helper()
require.Greater(t, targetHeight, s.currentHeight.Load())
Expand Down Expand Up @@ -577,6 +583,7 @@ func (s *SystemUnderTest) startNodesAsync(t *testing.T, xargs ...string) {
})
}

// tracks the PID in state with a go routine waiting for the shutdown completion to unregister
func (s *SystemUnderTest) awaitProcessCleanup(cmd *exec.Cmd) {
pid := cmd.Process.Pid
s.pidsLock.Lock()
Expand All @@ -597,6 +604,11 @@ func (s *SystemUnderTest) withEachNodeHome(cb func(i int, home string)) {
}
}

// NodeDir returns the workdir and path to the node home folder.
func (s *SystemUnderTest) NodeDir(i int) string {
return filepath.Join(WorkDir, s.nodePath(i))
}

// nodePath returns the path of the node within the work dir. not absolute
func (s *SystemUnderTest) nodePath(i int) string {
return NodePath(i, s.outputDir, s.projectName)
Expand Down
22 changes: 20 additions & 2 deletions tests/systemtests/testnet_init.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,12 @@ import (
"github.com/creachadair/tomledit/parser"
)

// isV2 checks if the tests run with simapp v2
func isV2() bool {
buildOptions := os.Getenv("COSMOS_BUILD_OPTIONS")
return strings.Contains(buildOptions, "v2")
}

// SingleHostTestnetCmdInitializer default testnet cmd that supports the --single-host param
type SingleHostTestnetCmdInitializer struct {
execBinary string
Expand Down Expand Up @@ -53,10 +59,16 @@ func (s SingleHostTestnetCmdInitializer) Initialize() {
"--output-dir=" + s.outputDir,
"--validator-count=" + strconv.Itoa(s.initialNodesCount),
"--keyring-backend=test",
"--minimum-gas-prices=" + s.minGasPrice,
"--commit-timeout=" + s.commitTimeout.String(),
"--single-host",
}

if isV2() {
args = append(args, "--server.minimum-gas-prices="+s.minGasPrice)
} else {
args = append(args, "--minimum-gas-prices="+s.minGasPrice)
}

s.log(fmt.Sprintf("+++ %s %s\n", s.execBinary, strings.Join(args, " ")))
out, err := RunShellCmd(s.execBinary, args...)
if err != nil {
Expand Down Expand Up @@ -108,8 +120,14 @@ func (s ModifyConfigYamlInitializer) Initialize() {
"--output-dir=" + s.outputDir,
"--v=" + strconv.Itoa(s.initialNodesCount),
"--keyring-backend=test",
"--minimum-gas-prices=" + s.minGasPrice,
}

if isV2() {
args = append(args, "--server.minimum-gas-prices="+s.minGasPrice)
} else {
args = append(args, "--minimum-gas-prices="+s.minGasPrice)
}

s.log(fmt.Sprintf("+++ %s %s\n", s.execBinary, strings.Join(args, " ")))

out, err := RunShellCmd(s.execBinary, args...)
Expand Down
Loading