github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/light/provider/http/http_test.go (about)

     1  package http_test
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  	"testing"
     8  	"time"
     9  
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  
    13  	"github.com/line/ostracon/abci/example/kvstore"
    14  	"github.com/line/ostracon/light/provider"
    15  	lighthttp "github.com/line/ostracon/light/provider/http"
    16  	rpcclient "github.com/line/ostracon/rpc/client"
    17  	rpchttp "github.com/line/ostracon/rpc/client/http"
    18  	rpcjson "github.com/line/ostracon/rpc/jsonrpc/client"
    19  	rpctest "github.com/line/ostracon/rpc/test"
    20  	"github.com/line/ostracon/types"
    21  )
    22  
    23  func TestNewProvider(t *testing.T) {
    24  	c, err := lighthttp.New("chain-test", "192.168.0.1:26657")
    25  	require.NoError(t, err)
    26  	require.Equal(t, fmt.Sprintf("%s", c), "http{http://192.168.0.1:26657}")
    27  
    28  	c, err = lighthttp.New("chain-test", "http://153.200.0.1:26657")
    29  	require.NoError(t, err)
    30  	require.Equal(t, fmt.Sprintf("%s", c), "http{http://153.200.0.1:26657}")
    31  
    32  	c, err = lighthttp.New("chain-test", "153.200.0.1")
    33  	require.NoError(t, err)
    34  	require.Equal(t, fmt.Sprintf("%s", c), "http{http://153.200.0.1}")
    35  }
    36  
    37  func TestProvider(t *testing.T) {
    38  	app := kvstore.NewApplication()
    39  	app.RetainBlocks = 10
    40  	node := rpctest.StartOstracon(app)
    41  
    42  	cfg := rpctest.GetConfig()
    43  	defer os.RemoveAll(cfg.RootDir)
    44  	rpcAddr := cfg.RPC.ListenAddress
    45  	genDoc, err := types.GenesisDocFromFile(cfg.GenesisFile())
    46  	require.NoError(t, err)
    47  	chainID := genDoc.ChainID
    48  
    49  	jsonClient, err := rpcjson.HTTPClientForTest(rpcAddr)
    50  	require.Nil(t, err)
    51  	c, err := rpchttp.NewWithClient(rpcAddr, "/websocket", jsonClient)
    52  	require.Nil(t, err)
    53  
    54  	p := lighthttp.NewWithClient(chainID, c)
    55  	require.NoError(t, err)
    56  	require.NotNil(t, p)
    57  
    58  	// let it produce some blocks
    59  	err = rpcclient.WaitForHeight(c, 10, nil)
    60  	require.NoError(t, err)
    61  
    62  	// let's get the highest block
    63  	lb, err := p.LightBlock(context.Background(), 0)
    64  	require.NoError(t, err)
    65  	require.NotNil(t, lb)
    66  	assert.True(t, lb.Height < 1000)
    67  
    68  	// let's check this is valid somehow
    69  	assert.Nil(t, lb.ValidateBasic(chainID))
    70  
    71  	// historical queries now work :)
    72  	lower := lb.Height - 3
    73  	lb, err = p.LightBlock(context.Background(), lower)
    74  	require.NoError(t, err)
    75  	assert.Equal(t, lower, lb.Height)
    76  
    77  	// fetching missing heights (both future and pruned) should return appropriate errors
    78  	lb, err = p.LightBlock(context.Background(), 1000)
    79  	require.Error(t, err)
    80  	require.Nil(t, lb)
    81  	assert.Equal(t, provider.ErrHeightTooHigh, err)
    82  
    83  	_, err = p.LightBlock(context.Background(), 1)
    84  	require.Error(t, err)
    85  	require.Nil(t, lb)
    86  	assert.Equal(t, provider.ErrLightBlockNotFound, err)
    87  
    88  	// stop the full node and check that a no response error is returned
    89  	rpctest.StopOstracon(node)
    90  	time.Sleep(1 * time.Second) // depends on Transport.IdleConnTimeout
    91  	lb, err = p.LightBlock(context.Background(), lower+2)
    92  	// we should see a connection refused
    93  	require.Error(t, err)
    94  	require.Contains(t, err.Error(), "connection refused")
    95  	require.Nil(t, lb)
    96  }