github.com/okex/exchain@v1.8.0/libs/tendermint/lite2/example_test.go (about)

     1  package lite_test
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	stdlog "log"
     7  	"os"
     8  	"testing"
     9  	"time"
    10  
    11  	dbm "github.com/okex/exchain/libs/tm-db"
    12  
    13  	"github.com/okex/exchain/libs/tendermint/abci/example/kvstore"
    14  	lite "github.com/okex/exchain/libs/tendermint/lite2"
    15  	"github.com/okex/exchain/libs/tendermint/lite2/provider"
    16  	httpp "github.com/okex/exchain/libs/tendermint/lite2/provider/http"
    17  	dbs "github.com/okex/exchain/libs/tendermint/lite2/store/db"
    18  	rpctest "github.com/okex/exchain/libs/tendermint/rpc/test"
    19  )
    20  
    21  // Automatically getting new headers and verifying them.
    22  func ExampleClient_Update() {
    23  	// give Tendermint time to generate some blocks
    24  	time.Sleep(5 * time.Second)
    25  
    26  	dbDir, err := ioutil.TempDir("", "lite-client-example")
    27  	if err != nil {
    28  		stdlog.Fatal(err)
    29  	}
    30  	defer os.RemoveAll(dbDir)
    31  
    32  	var (
    33  		config  = rpctest.GetConfig()
    34  		chainID = config.ChainID()
    35  	)
    36  
    37  	primary, err := httpp.New(chainID, config.RPC.ListenAddress)
    38  	if err != nil {
    39  		stdlog.Fatal(err)
    40  	}
    41  
    42  	header, err := primary.SignedHeader(2)
    43  	if err != nil {
    44  		stdlog.Fatal(err)
    45  	}
    46  
    47  	db, err := dbm.NewGoLevelDB("lite-client-db", dbDir)
    48  	if err != nil {
    49  		stdlog.Fatal(err)
    50  	}
    51  
    52  	c, err := lite.NewClient(
    53  		chainID,
    54  		lite.TrustOptions{
    55  			Period: 504 * time.Hour, // 21 days
    56  			Height: 2,
    57  			Hash:   header.Hash(),
    58  		},
    59  		primary,
    60  		[]provider.Provider{primary}, // NOTE: primary should not be used here
    61  		dbs.New(db, chainID),
    62  		// Logger(log.TestingLogger()),
    63  	)
    64  	if err != nil {
    65  		stdlog.Fatal(err)
    66  	}
    67  	defer func() {
    68  		c.Cleanup()
    69  	}()
    70  
    71  	time.Sleep(2 * time.Second)
    72  
    73  	// XXX: 30 * time.Minute clock drift is needed because a) Tendermint strips
    74  	// monotonic component (see types/time/time.go) b) single instance is being
    75  	// run.
    76  	// https://github.com/tendermint/tendermint/issues/4489
    77  	h, err := c.Update(time.Now().Add(30 * time.Minute))
    78  	if err != nil {
    79  		stdlog.Fatal(err)
    80  	}
    81  
    82  	if h != nil && h.Height > 2 {
    83  		fmt.Println("successful update")
    84  	} else {
    85  		fmt.Println("update failed")
    86  	}
    87  	// Output: successful update
    88  }
    89  
    90  // Manually getting headers and verifying them.
    91  func ExampleClient_VerifyHeaderAtHeight() {
    92  	// give Tendermint time to generate some blocks
    93  	time.Sleep(5 * time.Second)
    94  
    95  	dbDir, err := ioutil.TempDir("", "lite-client-example")
    96  	if err != nil {
    97  		stdlog.Fatal(err)
    98  	}
    99  	defer os.RemoveAll(dbDir)
   100  
   101  	var (
   102  		config  = rpctest.GetConfig()
   103  		chainID = config.ChainID()
   104  	)
   105  
   106  	primary, err := httpp.New(chainID, config.RPC.ListenAddress)
   107  	if err != nil {
   108  		stdlog.Fatal(err)
   109  	}
   110  
   111  	header, err := primary.SignedHeader(2)
   112  	if err != nil {
   113  		stdlog.Fatal(err)
   114  	}
   115  
   116  	db, err := dbm.NewGoLevelDB("lite-client-db", dbDir)
   117  	if err != nil {
   118  		stdlog.Fatal(err)
   119  	}
   120  
   121  	c, err := lite.NewClient(
   122  		chainID,
   123  		lite.TrustOptions{
   124  			Period: 504 * time.Hour, // 21 days
   125  			Height: 2,
   126  			Hash:   header.Hash(),
   127  		},
   128  		primary,
   129  		[]provider.Provider{primary}, // NOTE: primary should not be used here
   130  		dbs.New(db, chainID),
   131  		// Logger(log.TestingLogger()),
   132  	)
   133  	if err != nil {
   134  		stdlog.Fatal(err)
   135  	}
   136  	defer func() {
   137  		c.Cleanup()
   138  	}()
   139  
   140  	_, err = c.VerifyHeaderAtHeight(3, time.Now())
   141  	if err != nil {
   142  		stdlog.Fatal(err)
   143  	}
   144  
   145  	h, err := c.TrustedHeader(3)
   146  	if err != nil {
   147  		stdlog.Fatal(err)
   148  	}
   149  
   150  	fmt.Println("got header", h.Height)
   151  	// Output: got header 3
   152  }
   153  
   154  func TestMain(m *testing.M) {
   155  	// start a tendermint node (and kvstore) in the background to test against
   156  	app := kvstore.NewApplication()
   157  	node := rpctest.StartTendermint(app, rpctest.SuppressStdout)
   158  
   159  	code := m.Run()
   160  
   161  	// and shut down proper at the end
   162  	rpctest.StopTendermint(node)
   163  	os.Exit(code)
   164  }