diff --git a/light/example_test.go b/light/example_test.go index a542b8d3d..0fd6640c4 100644 --- a/light/example_test.go +++ b/light/example_test.go @@ -93,7 +93,6 @@ func ExampleClient_Update() { } else { fmt.Println("update failed") } - // Output: successful update } // Manually getting light blocks and verifying them. @@ -169,5 +168,4 @@ func ExampleClient_VerifyLightBlockAtHeight() { } fmt.Println("got header", h.Height) - // Output: got header 3 } diff --git a/light/light_test.go b/light/light_test.go new file mode 100644 index 000000000..a224d71b2 --- /dev/null +++ b/light/light_test.go @@ -0,0 +1,138 @@ +package light_test + +import ( + "context" + "io/ioutil" + "os" + "testing" + "time" + + "github.com/stretchr/testify/require" + dbm "github.com/tendermint/tm-db" + + "github.com/tendermint/tendermint/abci/example/kvstore" + "github.com/tendermint/tendermint/libs/log" + "github.com/tendermint/tendermint/light" + "github.com/tendermint/tendermint/light/provider" + httpp "github.com/tendermint/tendermint/light/provider/http" + dbs "github.com/tendermint/tendermint/light/store/db" + rpctest "github.com/tendermint/tendermint/rpc/test" +) + +// NOTE: these are ports of the tests from example_test.go but +// rewritten as more conventional tests. + +// Automatically getting new headers and verifying them. +func TestClientIntegration_Update(t *testing.T) { + t.Parallel() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + conf := rpctest.CreateConfig(t.Name()) + + // Start a test application + app := kvstore.NewApplication() + _, closer, err := rpctest.StartTendermint(ctx, conf, app, rpctest.SuppressStdout) + require.NoError(t, err) + defer func() { require.NoError(t, closer(ctx)) }() + + // give Tendermint time to generate some blocks + time.Sleep(5 * time.Second) + + dbDir, err := ioutil.TempDir("", "light-client-test-update-example") + require.NoError(t, err) + defer os.RemoveAll(dbDir) + + chainID := conf.ChainID() + + primary, err := httpp.New(chainID, conf.RPC.ListenAddress) + require.NoError(t, err) + + block, err := primary.LightBlock(ctx, 2) + require.NoError(t, err) + + db, err := dbm.NewGoLevelDB("light-client-db", dbDir) + require.NoError(t, err) + + c, err := light.NewClient( + ctx, + chainID, + light.TrustOptions{ + Period: 504 * time.Hour, // 21 days + Height: 2, + Hash: block.Hash(), + }, + primary, + []provider.Provider{primary}, // NOTE: primary should not be used here + dbs.New(db), + light.Logger(log.TestingLogger()), + ) + require.NoError(t, err) + + defer func() { require.NoError(t, c.Cleanup()) }() + + time.Sleep(2 * time.Second) + + h, err := c.Update(ctx, time.Now()) + require.NoError(t, err) + require.NotNil(t, h) + + require.True(t, h.Height > 2) +} + +// Manually getting light blocks and verifying them. +func TestClientIntegration_VerifyLightBlockAtHeight(t *testing.T) { + t.Parallel() + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + conf := rpctest.CreateConfig(t.Name()) + + // Start a test application + app := kvstore.NewApplication() + + _, closer, err := rpctest.StartTendermint(ctx, conf, app, rpctest.SuppressStdout) + require.NoError(t, err) + defer func() { require.NoError(t, closer(ctx)) }() + + // give Tendermint time to generate some blocks + time.Sleep(5 * time.Second) + + dbDir, err := ioutil.TempDir("", "light-client-test-verify-example") + require.NoError(t, err) + defer os.RemoveAll(dbDir) + + chainID := conf.ChainID() + + primary, err := httpp.New(chainID, conf.RPC.ListenAddress) + require.NoError(t, err) + + block, err := primary.LightBlock(ctx, 2) + require.NoError(t, err) + + db, err := dbm.NewGoLevelDB("light-client-db", dbDir) + require.NoError(t, err) + + c, err := light.NewClient(ctx, + chainID, + light.TrustOptions{ + Period: 504 * time.Hour, // 21 days + Height: 2, + Hash: block.Hash(), + }, + primary, + []provider.Provider{primary}, // NOTE: primary should not be used here + dbs.New(db), + light.Logger(log.TestingLogger()), + ) + require.NoError(t, err) + + defer func() { require.NoError(t, c.Cleanup()) }() + + _, err = c.VerifyLightBlockAtHeight(ctx, 3, time.Now()) + require.NoError(t, err) + + h, err := c.TrustedLightBlock(3) + require.NoError(t, err) + + require.EqualValues(t, 3, h.Height) +}