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  }