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