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 }