2017-02-24 17:51:19 +01:00
|
|
|
package client_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
2017-02-24 19:15:22 +01:00
|
|
|
"github.com/stretchr/testify/assert"
|
2017-02-24 17:51:19 +01:00
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
events "github.com/tendermint/go-events"
|
|
|
|
"github.com/tendermint/tendermint/types"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestEvents(t *testing.T) {
|
|
|
|
require := require.New(t)
|
|
|
|
for i, c := range GetClients() {
|
2017-02-24 19:15:22 +01:00
|
|
|
// for i, c := range []client.Client{getLocalClient()} {
|
2017-02-24 17:51:19 +01:00
|
|
|
// test if this client implements event switch as well.
|
|
|
|
evsw, ok := c.(types.EventSwitch)
|
2017-02-24 19:15:22 +01:00
|
|
|
if !assert.True(t, ok, "%d: %v", i, c) {
|
2017-02-24 17:51:19 +01:00
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
// start for this test it if it wasn't already running
|
|
|
|
if !evsw.IsRunning() {
|
|
|
|
// if so, then we start it, listen, and stop it.
|
|
|
|
st, err := evsw.Start()
|
|
|
|
require.Nil(err, "%d: %+v", i, err)
|
|
|
|
require.True(st, "%d", i)
|
2017-02-24 19:15:22 +01:00
|
|
|
defer evsw.Stop()
|
2017-02-24 17:51:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// let's wait for the next header...
|
|
|
|
listener := "fooz"
|
2017-02-24 19:15:22 +01:00
|
|
|
event, timeout := make(chan events.EventData, 10), make(chan bool, 1)
|
2017-02-24 17:51:19 +01:00
|
|
|
// start timeout count-down
|
|
|
|
go func() {
|
|
|
|
time.Sleep(1 * time.Second)
|
|
|
|
timeout <- true
|
|
|
|
}()
|
|
|
|
|
|
|
|
// register for the next header event
|
2017-02-24 19:15:22 +01:00
|
|
|
evtTyp := types.EventStringNewBlockHeader()
|
|
|
|
evsw.AddListenerForEvent(listener, evtTyp, func(data events.EventData) {
|
2017-02-24 17:51:19 +01:00
|
|
|
event <- data
|
|
|
|
})
|
|
|
|
// make sure to unregister after the test is over
|
2017-02-24 19:15:22 +01:00
|
|
|
// TODO: don't require both!
|
|
|
|
defer evsw.RemoveListenerForEvent(listener, evtTyp)
|
2017-02-24 17:51:19 +01:00
|
|
|
defer evsw.RemoveListener(listener)
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-timeout:
|
|
|
|
require.True(false, "%d: a timeout waiting for event", i)
|
|
|
|
case evt := <-event:
|
|
|
|
_, ok := evt.(types.EventDataNewBlockHeader)
|
|
|
|
require.True(ok, "%d: %#v", i, evt)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|