github.com/okex/exchain@v1.8.0/libs/tendermint/rpc/client/event_test.go (about) 1 package client_test 2 3 import ( 4 "context" 5 "fmt" 6 "reflect" 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 abci "github.com/okex/exchain/libs/tendermint/abci/types" 14 cfg "github.com/okex/exchain/libs/tendermint/config" 15 tmrand "github.com/okex/exchain/libs/tendermint/libs/rand" 16 "github.com/okex/exchain/libs/tendermint/rpc/client" 17 ctypes "github.com/okex/exchain/libs/tendermint/rpc/core/types" 18 "github.com/okex/exchain/libs/tendermint/types" 19 ) 20 21 var waitForEventTimeout = 30 * time.Second 22 23 // MakeTxKV returns a text transaction, allong with expected key, value pair 24 func MakeTxKV() ([]byte, []byte, []byte) { 25 k := []byte(tmrand.Str(8)) 26 v := []byte(tmrand.Str(8)) 27 return k, v, append(k, append([]byte("="), v...)...) 28 } 29 30 func TestHeaderEvents(t *testing.T) { 31 setMocConfig(100) 32 for i, c := range GetClients() { 33 i, c := i, c // capture params 34 t.Run(reflect.TypeOf(c).String(), func(t *testing.T) { 35 // start for this test it if it wasn't already running 36 if !c.IsRunning() { 37 // if so, then we start it, listen, and stop it. 38 err := c.Start() 39 require.Nil(t, err, "%d: %+v", i, err) 40 defer c.Stop() 41 } 42 43 evtTyp := types.EventNewBlockHeader 44 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 45 require.Nil(t, err, "%d: %+v", i, err) 46 _, ok := evt.(types.EventDataNewBlockHeader) 47 require.True(t, ok, "%d: %#v", i, evt) 48 // TODO: more checks... 49 }) 50 } 51 } 52 53 func TestBlockEvents(t *testing.T) { 54 setMocConfig(100) 55 for i, c := range GetClients() { 56 i, c := i, c // capture params 57 t.Run(reflect.TypeOf(c).String(), func(t *testing.T) { 58 59 // start for this test it if it wasn't already running 60 if !c.IsRunning() { 61 // if so, then we start it, listen, and stop it. 62 err := c.Start() 63 require.Nil(t, err, "%d: %+v", i, err) 64 defer c.Stop() 65 } 66 67 // listen for a new block; ensure height increases by 1 68 var ( 69 firstBlockHeight int64 70 blockEvent types.CM40EventDataNewBlock 71 ok bool 72 ) 73 74 for j := 0; j < 3; j++ { 75 evtTyp := types.EventNewBlock 76 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 77 require.Nil(t, err, "%d: %+v", j, err) 78 79 if ed, oke := evt.(types.EventDataNewBlock); oke { 80 blockEvent = blockEvent.From(ed) 81 ok = true 82 } else { 83 blockEvent, ok = evt.(types.CM40EventDataNewBlock) 84 } 85 require.True(t, ok, "%d: %#v", j, evt) 86 87 block := blockEvent.Block 88 if j == 0 { 89 firstBlockHeight = block.IBCHeader.Height 90 continue 91 } 92 93 require.Equal(t, block.IBCHeader.Height, firstBlockHeight+int64(j)) 94 } 95 }) 96 } 97 } 98 99 func TestTxEventsSentWithBroadcastTxAsync(t *testing.T) { testTxEventsSent(t, "async") } 100 func TestTxEventsSentWithBroadcastTxSync(t *testing.T) { testTxEventsSent(t, "sync") } 101 102 func testTxEventsSent(t *testing.T, broadcastMethod string) { 103 setMocConfig(100) 104 for i, c := range GetClients() { 105 i, c := i, c // capture params 106 t.Run(reflect.TypeOf(c).String(), func(t *testing.T) { 107 108 // start for this test it if it wasn't already running 109 if !c.IsRunning() { 110 // if so, then we start it, listen, and stop it. 111 err := c.Start() 112 require.Nil(t, err, "%d: %+v", i, err) 113 defer c.Stop() 114 } 115 116 // make the tx 117 _, _, tx := MakeTxKV() 118 evtTyp := types.EventTx 119 120 // send 121 var ( 122 txres *ctypes.ResultBroadcastTx 123 err error 124 ) 125 switch broadcastMethod { 126 case "async": 127 txres, err = c.BroadcastTxAsync(tx) 128 case "sync": 129 txres, err = c.BroadcastTxSync(tx) 130 default: 131 panic(fmt.Sprintf("Unknown broadcastMethod %s", broadcastMethod)) 132 } 133 134 require.NoError(t, err) 135 require.Equal(t, txres.Code, abci.CodeTypeOK) 136 137 // and wait for confirmation 138 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 139 require.Nil(t, err, "%d: %+v", i, err) 140 // and make sure it has the proper info 141 txe, ok := evt.(types.EventDataTx) 142 require.True(t, ok, "%d: %#v", i, evt) 143 // make sure this is the proper tx 144 require.EqualValues(t, tx, txe.Tx) 145 require.True(t, txe.Result.IsOK()) 146 }) 147 } 148 } 149 150 // Test HTTPClient resubscribes upon disconnect && subscription error. 151 // Test Local client resubscribes upon subscription error. 152 func TestClientsResubscribe(t *testing.T) { 153 // TODO(melekes) 154 } 155 156 func TestHTTPReturnsErrorIfClientIsNotRunning(t *testing.T) { 157 setMocConfig(100) 158 c := getHTTPClient() 159 160 // on Subscribe 161 _, err := c.Subscribe(context.Background(), "TestHeaderEvents", 162 types.QueryForEvent(types.EventNewBlockHeader).String()) 163 assert.Error(t, err) 164 165 // on Unsubscribe 166 err = c.Unsubscribe(context.Background(), "TestHeaderEvents", 167 types.QueryForEvent(types.EventNewBlockHeader).String()) 168 assert.Error(t, err) 169 170 // on UnsubscribeAll 171 err = c.UnsubscribeAll(context.Background(), "TestHeaderEvents") 172 assert.Error(t, err) 173 } 174 175 func setMocConfig(clientNum int) { 176 moc := cfg.MockDynamicConfig{} 177 moc.SetMaxSubscriptionClients(100) 178 179 cfg.SetDynamicConfig(moc) 180 }