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