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