github.com/evdatsion/aphelion-dpos-bft@v0.32.1/rpc/client/event_test.go (about) 1 package client_test 2 3 import ( 4 "fmt" 5 "reflect" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/require" 10 11 abci "github.com/evdatsion/aphelion-dpos-bft/abci/types" 12 cmn "github.com/evdatsion/aphelion-dpos-bft/libs/common" 13 "github.com/evdatsion/aphelion-dpos-bft/rpc/client" 14 ctypes "github.com/evdatsion/aphelion-dpos-bft/rpc/core/types" 15 "github.com/evdatsion/aphelion-dpos-bft/types" 16 ) 17 18 var waitForEventTimeout = 5 * time.Second 19 20 // MakeTxKV returns a text transaction, allong with expected key, value pair 21 func MakeTxKV() ([]byte, []byte, []byte) { 22 k := []byte(cmn.RandStr(8)) 23 v := []byte(cmn.RandStr(8)) 24 return k, v, append(k, append([]byte("="), v...)...) 25 } 26 27 func TestHeaderEvents(t *testing.T) { 28 for i, c := range GetClients() { 29 i, c := i, c // capture params 30 t.Run(reflect.TypeOf(c).String(), func(t *testing.T) { 31 // start for this test it if it wasn't already running 32 if !c.IsRunning() { 33 // if so, then we start it, listen, and stop it. 34 err := c.Start() 35 require.Nil(t, err, "%d: %+v", i, err) 36 defer c.Stop() 37 } 38 39 evtTyp := types.EventNewBlockHeader 40 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 41 require.Nil(t, err, "%d: %+v", i, err) 42 _, ok := evt.(types.EventDataNewBlockHeader) 43 require.True(t, ok, "%d: %#v", i, evt) 44 // TODO: more checks... 45 }) 46 } 47 } 48 49 func TestBlockEvents(t *testing.T) { 50 for i, c := range GetClients() { 51 i, c := i, c // capture params 52 t.Run(reflect.TypeOf(c).String(), func(t *testing.T) { 53 54 // start for this test it if it wasn't already running 55 if !c.IsRunning() { 56 // if so, then we start it, listen, and stop it. 57 err := c.Start() 58 require.Nil(t, err, "%d: %+v", i, err) 59 defer c.Stop() 60 } 61 62 // listen for a new block; ensure height increases by 1 63 var firstBlockHeight int64 64 for j := 0; j < 3; j++ { 65 evtTyp := types.EventNewBlock 66 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 67 require.Nil(t, err, "%d: %+v", j, err) 68 blockEvent, ok := evt.(types.EventDataNewBlock) 69 require.True(t, ok, "%d: %#v", j, evt) 70 71 block := blockEvent.Block 72 if j == 0 { 73 firstBlockHeight = block.Header.Height 74 continue 75 } 76 77 require.Equal(t, block.Header.Height, firstBlockHeight+int64(j)) 78 } 79 }) 80 } 81 } 82 83 func TestTxEventsSentWithBroadcastTxAsync(t *testing.T) { testTxEventsSent(t, "async") } 84 func TestTxEventsSentWithBroadcastTxSync(t *testing.T) { testTxEventsSent(t, "sync") } 85 86 func testTxEventsSent(t *testing.T, broadcastMethod string) { 87 for i, c := range GetClients() { 88 i, c := i, c // capture params 89 t.Run(reflect.TypeOf(c).String(), func(t *testing.T) { 90 91 // start for this test it if it wasn't already running 92 if !c.IsRunning() { 93 // if so, then we start it, listen, and stop it. 94 err := c.Start() 95 require.Nil(t, err, "%d: %+v", i, err) 96 defer c.Stop() 97 } 98 99 // make the tx 100 _, _, tx := MakeTxKV() 101 evtTyp := types.EventTx 102 103 // send 104 var ( 105 txres *ctypes.ResultBroadcastTx 106 err error 107 ) 108 switch broadcastMethod { 109 case "async": 110 txres, err = c.BroadcastTxAsync(tx) 111 case "sync": 112 txres, err = c.BroadcastTxSync(tx) 113 default: 114 panic(fmt.Sprintf("Unknown broadcastMethod %s", broadcastMethod)) 115 } 116 117 require.NoError(t, err) 118 require.Equal(t, txres.Code, abci.CodeTypeOK) 119 120 // and wait for confirmation 121 evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) 122 require.Nil(t, err, "%d: %+v", i, err) 123 // and make sure it has the proper info 124 txe, ok := evt.(types.EventDataTx) 125 require.True(t, ok, "%d: %#v", i, evt) 126 // make sure this is the proper tx 127 require.EqualValues(t, tx, txe.Tx) 128 require.True(t, txe.Result.IsOK()) 129 }) 130 } 131 } 132 133 // Test HTTPClient resubscribes upon disconnect && subscription error. 134 // Test Local client resubscribes upon subscription error. 135 func TestClientsResubscribe(t *testing.T) { 136 // TODO(melekes) 137 }