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.
 
 
 
 
 
 

83 lines
2.2 KiB

package client_test
import (
"context"
"errors"
"strings"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/tendermint/tendermint/rpc/client"
"github.com/tendermint/tendermint/rpc/client/mock"
"github.com/tendermint/tendermint/rpc/coretypes"
)
func TestWaitForHeight(t *testing.T) {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// test with error result - immediate failure
m := &mock.StatusMock{
Call: mock.Call{
Error: errors.New("bye"),
},
}
r := mock.NewStatusRecorder(m)
// connection failure always leads to error
err := client.WaitForHeight(ctx, r, 8, nil)
require.Error(t, err)
require.Equal(t, "bye", err.Error())
// we called status once to check
require.Equal(t, 1, len(r.Calls))
// now set current block height to 10
m.Call = mock.Call{
Response: &coretypes.ResultStatus{SyncInfo: coretypes.SyncInfo{LatestBlockHeight: 10}},
}
// we will not wait for more than 10 blocks
err = client.WaitForHeight(ctx, r, 40, nil)
require.Error(t, err)
require.True(t, strings.Contains(err.Error(), "aborting"))
// we called status once more to check
require.Equal(t, 2, len(r.Calls))
// waiting for the past returns immediately
err = client.WaitForHeight(ctx, r, 5, nil)
require.NoError(t, err)
// we called status once more to check
require.Equal(t, 3, len(r.Calls))
// since we can't update in a background goroutine (test --race)
// we use the callback to update the status height
myWaiter := func(delta int64) error {
// update the height for the next call
m.Call.Response = &coretypes.ResultStatus{SyncInfo: coretypes.SyncInfo{LatestBlockHeight: 15}}
return client.DefaultWaitStrategy(delta)
}
// we wait for a few blocks
err = client.WaitForHeight(ctx, r, 12, myWaiter)
require.NoError(t, err)
// we called status once to check
require.Equal(t, 5, len(r.Calls))
pre := r.Calls[3]
require.Nil(t, pre.Error)
prer, ok := pre.Response.(*coretypes.ResultStatus)
require.True(t, ok)
assert.Equal(t, int64(10), prer.SyncInfo.LatestBlockHeight)
post := r.Calls[4]
require.Nil(t, post.Error)
postr, ok := post.Response.(*coretypes.ResultStatus)
require.True(t, ok)
assert.Equal(t, int64(15), postr.SyncInfo.LatestBlockHeight)
}