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) t.Cleanup(node2.Wait) 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 } } } }) }