package commands_test
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/tendermint/tendermint/cmd/tendermint/commands"
|
|
"github.com/tendermint/tendermint/libs/log"
|
|
"github.com/tendermint/tendermint/rpc/client/local"
|
|
rpctest "github.com/tendermint/tendermint/rpc/test"
|
|
e2e "github.com/tendermint/tendermint/test/e2e/app"
|
|
)
|
|
|
|
func TestRollbackIntegration(t *testing.T) {
|
|
var height int64
|
|
dir := t.TempDir()
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
cfg, err := rpctest.CreateConfig(t, t.Name())
|
|
require.NoError(t, err)
|
|
cfg.BaseConfig.DBBackend = "goleveldb"
|
|
|
|
app, err := e2e.NewApplication(e2e.DefaultConfig(dir))
|
|
require.NoError(t, err)
|
|
|
|
t.Run("First run", func(t *testing.T) {
|
|
ctx, cancel := context.WithCancel(ctx)
|
|
defer cancel()
|
|
require.NoError(t, err)
|
|
node, _, err := rpctest.StartTendermint(ctx, cfg, app, rpctest.SuppressStdout)
|
|
require.NoError(t, err)
|
|
require.True(t, node.IsRunning())
|
|
|
|
time.Sleep(3 * time.Second)
|
|
cancel()
|
|
node.Wait()
|
|
|
|
require.False(t, node.IsRunning())
|
|
})
|
|
t.Run("Rollback", func(t *testing.T) {
|
|
time.Sleep(time.Second)
|
|
require.NoError(t, app.Rollback())
|
|
height, _, err = commands.RollbackState(cfg)
|
|
require.NoError(t, err, "%d", height)
|
|
})
|
|
t.Run("Restart", func(t *testing.T) {
|
|
require.True(t, height > 0, "%d", height)
|
|
|
|
ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
|
|
defer cancel()
|
|
node2, _, err2 := rpctest.StartTendermint(ctx, cfg, app, rpctest.SuppressStdout)
|
|
require.NoError(t, err2)
|
|
|
|
logger := log.NewNopLogger()
|
|
|
|
client, err := local.New(logger, node2.(local.NodeService))
|
|
require.NoError(t, err)
|
|
|
|
ticker := time.NewTicker(200 * time.Millisecond)
|
|
for {
|
|
select {
|
|
case <-ctx.Done():
|
|
t.Fatalf("failed to make progress after 20 seconds. Min height: %d", height)
|
|
case <-ticker.C:
|
|
status, err := client.Status(ctx)
|
|
require.NoError(t, err)
|
|
|
|
if status.SyncInfo.LatestBlockHeight > height {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
})
|
|
|
|
}
|