You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

79 lines
2.0 KiB

  1. package commands_test
  2. import (
  3. "context"
  4. "testing"
  5. "time"
  6. "github.com/stretchr/testify/require"
  7. "github.com/tendermint/tendermint/cmd/tendermint/commands"
  8. "github.com/tendermint/tendermint/libs/log"
  9. "github.com/tendermint/tendermint/rpc/client/local"
  10. rpctest "github.com/tendermint/tendermint/rpc/test"
  11. e2e "github.com/tendermint/tendermint/test/e2e/app"
  12. )
  13. func TestRollbackIntegration(t *testing.T) {
  14. var height int64
  15. dir := t.TempDir()
  16. ctx, cancel := context.WithCancel(context.Background())
  17. defer cancel()
  18. cfg, err := rpctest.CreateConfig(t, t.Name())
  19. require.NoError(t, err)
  20. cfg.BaseConfig.DBBackend = "goleveldb"
  21. app, err := e2e.NewApplication(e2e.DefaultConfig(dir))
  22. require.NoError(t, err)
  23. t.Run("First run", func(t *testing.T) {
  24. ctx, cancel := context.WithCancel(ctx)
  25. defer cancel()
  26. require.NoError(t, err)
  27. node, _, err := rpctest.StartTendermint(ctx, cfg, app, rpctest.SuppressStdout)
  28. require.NoError(t, err)
  29. require.True(t, node.IsRunning())
  30. time.Sleep(3 * time.Second)
  31. cancel()
  32. node.Wait()
  33. require.False(t, node.IsRunning())
  34. })
  35. t.Run("Rollback", func(t *testing.T) {
  36. time.Sleep(time.Second)
  37. require.NoError(t, app.Rollback())
  38. height, _, err = commands.RollbackState(cfg)
  39. require.NoError(t, err, "%d", height)
  40. })
  41. t.Run("Restart", func(t *testing.T) {
  42. require.True(t, height > 0, "%d", height)
  43. ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
  44. defer cancel()
  45. node2, _, err2 := rpctest.StartTendermint(ctx, cfg, app, rpctest.SuppressStdout)
  46. require.NoError(t, err2)
  47. t.Cleanup(node2.Wait)
  48. logger := log.NewNopLogger()
  49. client, err := local.New(logger, node2.(local.NodeService))
  50. require.NoError(t, err)
  51. ticker := time.NewTicker(200 * time.Millisecond)
  52. for {
  53. select {
  54. case <-ctx.Done():
  55. t.Fatalf("failed to make progress after 20 seconds. Min height: %d", height)
  56. case <-ticker.C:
  57. status, err := client.Status(ctx)
  58. require.NoError(t, err)
  59. if status.SyncInfo.LatestBlockHeight > height {
  60. return
  61. }
  62. }
  63. }
  64. })
  65. }