github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/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/fibonacci-chain/fbc/libs/tendermint/abci/types" 14 tmrand "github.com/fibonacci-chain/fbc/libs/tendermint/libs/rand" 15 "github.com/fibonacci-chain/fbc/libs/tendermint/rpc/client" 16 ctypes "github.com/fibonacci-chain/fbc/libs/tendermint/rpc/core/types" 17 "github.com/fibonacci-chain/fbc/libs/tendermint/types" 18 ) 19 20 var waitForEventTimeout = 30 * 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 // capture params 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 defer c.Stop() 39 } 40 41 evtTyp := types.EventNewBlockHeader 42 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 43 require.Nil(t, err, "%d: %+v", i, err) 44 _, ok := evt.(types.EventDataNewBlockHeader) 45 require.True(t, ok, "%d: %#v", i, evt) 46 // TODO: more checks... 47 }) 48 } 49 } 50 51 func TestBlockEvents(t *testing.T) { 52 for i, c := range GetClients() { 53 i, c := i, c // capture params 54 t.Run(reflect.TypeOf(c).String(), func(t *testing.T) { 55 56 // start for this test it if it wasn't already running 57 if !c.IsRunning() { 58 // if so, then we start it, listen, and stop it. 59 err := c.Start() 60 require.Nil(t, err, "%d: %+v", i, err) 61 defer c.Stop() 62 } 63 64 // listen for a new block; ensure height increases by 1 65 var ( 66 firstBlockHeight int64 67 blockEvent types.CM40EventDataNewBlock 68 ok bool 69 ) 70 71 for j := 0; j < 3; j++ { 72 evtTyp := types.EventNewBlock 73 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 74 require.Nil(t, err, "%d: %+v", j, err) 75 76 if ed, oke := evt.(types.EventDataNewBlock); oke { 77 blockEvent = blockEvent.From(ed) 78 ok = true 79 } else { 80 blockEvent, ok = evt.(types.CM40EventDataNewBlock) 81 } 82 require.True(t, ok, "%d: %#v", j, evt) 83 84 block := blockEvent.Block 85 if j == 0 { 86 firstBlockHeight = block.IBCHeader.Height 87 continue 88 } 89 90 require.Equal(t, block.IBCHeader.Height, firstBlockHeight+int64(j)) 91 } 92 }) 93 } 94 } 95 96 func TestTxEventsSentWithBroadcastTxAsync(t *testing.T) { testTxEventsSent(t, "async") } 97 func TestTxEventsSentWithBroadcastTxSync(t *testing.T) { testTxEventsSent(t, "sync") } 98 99 func testTxEventsSent(t *testing.T, broadcastMethod string) { 100 for i, c := range GetClients() { 101 i, c := i, c // capture params 102 t.Run(reflect.TypeOf(c).String(), func(t *testing.T) { 103 104 // start for this test it if it wasn't already running 105 if !c.IsRunning() { 106 // if so, then we start it, listen, and stop it. 107 err := c.Start() 108 require.Nil(t, err, "%d: %+v", i, err) 109 defer c.Stop() 110 } 111 112 // make the tx 113 _, _, tx := MakeTxKV() 114 evtTyp := types.EventTx 115 116 // send 117 var ( 118 txres *ctypes.ResultBroadcastTx 119 err error 120 ) 121 switch broadcastMethod { 122 case "async": 123 txres, err = c.BroadcastTxAsync(tx) 124 case "sync": 125 txres, err = c.BroadcastTxSync(tx) 126 default: 127 panic(fmt.Sprintf("Unknown broadcastMethod %s", broadcastMethod)) 128 } 129 130 require.NoError(t, err) 131 require.Equal(t, txres.Code, abci.CodeTypeOK) 132 133 // and wait for confirmation 134 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 135 require.Nil(t, err, "%d: %+v", i, err) 136 // and make sure it has the proper info 137 txe, ok := evt.(types.EventDataTx) 138 require.True(t, ok, "%d: %#v", i, evt) 139 // make sure this is the proper tx 140 require.EqualValues(t, tx, txe.Tx) 141 require.True(t, txe.Result.IsOK()) 142 }) 143 } 144 } 145 146 // Test HTTPClient resubscribes upon disconnect && subscription error. 147 // Test Local client resubscribes upon subscription error. 148 func TestClientsResubscribe(t *testing.T) { 149 // TODO(melekes) 150 } 151 152 func TestHTTPReturnsErrorIfClientIsNotRunning(t *testing.T) { 153 c := getHTTPClient() 154 155 // on Subscribe 156 _, err := c.Subscribe(context.Background(), "TestHeaderEvents", 157 types.QueryForEvent(types.EventNewBlockHeader).String()) 158 assert.Error(t, err) 159 160 // on Unsubscribe 161 err = c.Unsubscribe(context.Background(), "TestHeaderEvents", 162 types.QueryForEvent(types.EventNewBlockHeader).String()) 163 assert.Error(t, err) 164 165 // on UnsubscribeAll 166 err = c.UnsubscribeAll(context.Background(), "TestHeaderEvents") 167 assert.Error(t, err) 168 }