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  }