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.

76 lines
2.1 KiB

  1. package client_test
  2. import (
  3. "errors"
  4. "strings"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. "github.com/stretchr/testify/require"
  8. "github.com/tendermint/tendermint/rpc/client"
  9. "github.com/tendermint/tendermint/rpc/client/mock"
  10. ctypes "github.com/tendermint/tendermint/rpc/core/types"
  11. )
  12. func TestWaitForHeight(t *testing.T) {
  13. assert, require := assert.New(t), require.New(t)
  14. // test with error result - immediate failure
  15. m := &mock.StatusMock{
  16. Call: mock.Call{
  17. Error: errors.New("bye"),
  18. },
  19. }
  20. r := mock.NewStatusRecorder(m)
  21. // connection failure always leads to error
  22. err := client.WaitForHeight(r, 8, nil)
  23. require.NotNil(err)
  24. require.Equal("bye", err.Error())
  25. // we called status once to check
  26. require.Equal(1, len(r.Calls))
  27. // now set current block height to 10
  28. m.Call = mock.Call{
  29. Response: &ctypes.ResultStatus{SyncInfo: ctypes.SyncInfo{LatestBlockHeight: 10}},
  30. }
  31. // we will not wait for more than 10 blocks
  32. err = client.WaitForHeight(r, 40, nil)
  33. require.NotNil(err)
  34. require.True(strings.Contains(err.Error(), "aborting"))
  35. // we called status once more to check
  36. require.Equal(2, len(r.Calls))
  37. // waiting for the past returns immediately
  38. err = client.WaitForHeight(r, 5, nil)
  39. require.Nil(err)
  40. // we called status once more to check
  41. require.Equal(3, len(r.Calls))
  42. // since we can't update in a background goroutine (test --race)
  43. // we use the callback to update the status height
  44. myWaiter := func(delta int64) error {
  45. // update the height for the next call
  46. m.Call.Response = &ctypes.ResultStatus{SyncInfo: ctypes.SyncInfo{LatestBlockHeight: 15}}
  47. return client.DefaultWaitStrategy(delta)
  48. }
  49. // we wait for a few blocks
  50. err = client.WaitForHeight(r, 12, myWaiter)
  51. require.Nil(err)
  52. // we called status once to check
  53. require.Equal(5, len(r.Calls))
  54. pre := r.Calls[3]
  55. require.Nil(pre.Error)
  56. prer, ok := pre.Response.(*ctypes.ResultStatus)
  57. require.True(ok)
  58. assert.Equal(int64(10), prer.SyncInfo.LatestBlockHeight)
  59. post := r.Calls[4]
  60. require.Nil(post.Error)
  61. postr, ok := post.Response.(*ctypes.ResultStatus)
  62. require.True(ok)
  63. assert.Equal(int64(15), postr.SyncInfo.LatestBlockHeight)
  64. }