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