mirror of
https://github.com/tendermint/tendermint.git
synced 2026-02-09 21:40:11 +00:00
Responses are constructed from requests using MakeResponse, MakeError, and MakeErrorf. This ensures the response is always paired with the correct ID, makes cases where there is no ID more explicit at the usage site, and consolidates the handling of error introspection across transports. The logic for unpacking errors and assigning JSON-RPC response types was previously duplicated in three places. Consolidate it in the types package for the RPC subsystem. * update test cases
110 lines
3.1 KiB
Go
110 lines
3.1 KiB
Go
package http_test
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/tendermint/tendermint/abci/example/kvstore"
|
|
"github.com/tendermint/tendermint/light/provider"
|
|
lighthttp "github.com/tendermint/tendermint/light/provider/http"
|
|
rpcclient "github.com/tendermint/tendermint/rpc/client"
|
|
rpchttp "github.com/tendermint/tendermint/rpc/client/http"
|
|
rpctest "github.com/tendermint/tendermint/rpc/test"
|
|
"github.com/tendermint/tendermint/types"
|
|
)
|
|
|
|
func TestNewProvider(t *testing.T) {
|
|
c, err := lighthttp.New("chain-test", "192.168.0.1:26657")
|
|
require.NoError(t, err)
|
|
require.Equal(t, c.ID(), "http{http://192.168.0.1:26657}")
|
|
|
|
c, err = lighthttp.New("chain-test", "http://153.200.0.1:26657")
|
|
require.NoError(t, err)
|
|
require.Equal(t, c.ID(), "http{http://153.200.0.1:26657}")
|
|
|
|
c, err = lighthttp.New("chain-test", "153.200.0.1")
|
|
require.NoError(t, err)
|
|
require.Equal(t, c.ID(), "http{http://153.200.0.1}")
|
|
}
|
|
|
|
func TestProvider(t *testing.T) {
|
|
ctx, cancel := context.WithCancel(context.Background())
|
|
defer cancel()
|
|
cfg, err := rpctest.CreateConfig(t.Name())
|
|
require.NoError(t, err)
|
|
|
|
// start a tendermint node in the background to test against
|
|
app := kvstore.NewApplication()
|
|
app.RetainBlocks = 9
|
|
_, closer, err := rpctest.StartTendermint(ctx, cfg, app)
|
|
require.NoError(t, err)
|
|
|
|
rpcAddr := cfg.RPC.ListenAddress
|
|
genDoc, err := types.GenesisDocFromFile(cfg.GenesisFile())
|
|
require.NoError(t, err)
|
|
|
|
chainID := genDoc.ChainID
|
|
t.Log("chainID:", chainID)
|
|
|
|
c, err := rpchttp.New(rpcAddr)
|
|
require.NoError(t, err)
|
|
|
|
p := lighthttp.NewWithClient(chainID, c)
|
|
require.NoError(t, err)
|
|
require.NotNil(t, p)
|
|
|
|
// let it produce some blocks
|
|
err = rpcclient.WaitForHeight(ctx, c, 10, nil)
|
|
require.NoError(t, err)
|
|
|
|
// let's get the highest block
|
|
lb, err := p.LightBlock(ctx, 0)
|
|
require.NoError(t, err)
|
|
assert.True(t, lb.Height < 9001, "height=%d", lb.Height)
|
|
|
|
// let's check this is valid somehow
|
|
assert.Nil(t, lb.ValidateBasic(chainID))
|
|
|
|
// historical queries now work :)
|
|
lower := lb.Height - 3
|
|
lb, err = p.LightBlock(ctx, lower)
|
|
require.NoError(t, err)
|
|
assert.Equal(t, lower, lb.Height)
|
|
|
|
// fetching missing heights (both future and pruned) should return appropriate errors
|
|
lb, err = p.LightBlock(ctx, 9001)
|
|
require.Error(t, err)
|
|
require.Nil(t, lb)
|
|
assert.ErrorIs(t, err, provider.ErrHeightTooHigh)
|
|
|
|
lb, err = p.LightBlock(ctx, 1)
|
|
require.Error(t, err)
|
|
require.Nil(t, lb)
|
|
assert.ErrorIs(t, err, provider.ErrLightBlockNotFound)
|
|
|
|
// if the provider is unable to provide four more blocks then we should return
|
|
// an unreliable peer error
|
|
for i := 0; i < 4; i++ {
|
|
_, err = p.LightBlock(ctx, 1)
|
|
}
|
|
assert.IsType(t, provider.ErrUnreliableProvider{}, err)
|
|
|
|
// shut down tendermint node
|
|
require.NoError(t, closer(ctx))
|
|
cancel()
|
|
|
|
time.Sleep(10 * time.Second)
|
|
lb, err = p.LightBlock(ctx, lower+2)
|
|
// Either the connection should be refused, or the context canceled.
|
|
require.Error(t, err)
|
|
require.Nil(t, lb)
|
|
if !errors.Is(err, provider.ErrConnectionClosed) && !errors.Is(err, context.Canceled) {
|
|
assert.Fail(t, "Incorrect error", "wanted connection closed or context canceled, got %v", err)
|
|
}
|
|
}
|