// wait for an event; do things that might trigger events, and check them when they are received // the check function takes an event id and the byte slice read off the ws func waitForEvent(t *testing.T, wsc *client.WSClient, eventid string, dieOnTimeout bool, f func(), check func(string, interface{}) error) { // go routine to wait for webscoket msg goodCh := make(chan interface{}) errCh := make(chan error) // Read message go func() { var err error LOOP: for { select { case r := <-wsc.ResultsCh: result := new(ctypes.TMResult) wire.ReadJSONPtr(result, r, &err) if err != nil { errCh <- err break LOOP } event, ok := (*result).(*ctypes.ResultEvent) if ok && event.Name == eventid { goodCh <- event.Data break LOOP } case err := <-wsc.ErrorsCh: errCh <- err break LOOP case <-wsc.Quit: break LOOP } } }() // do stuff (transactions) f() // wait for an event or timeout timeout := time.NewTimer(10 * time.Second) select { case <-timeout.C: if dieOnTimeout { wsc.Stop() t.Fatalf("%s event was not received in time", eventid) } // else that's great, we didn't hear the event // and we shouldn't have case eventData := <-goodCh: if dieOnTimeout { // message was received and expected // run the check if err := check(eventid, eventData); err != nil { t.Fatal(err) // Show the stack trace. } } else { wsc.Stop() t.Fatalf("%s event was not expected", eventid) } case err := <-errCh: t.Fatal(err) panic(err) // Show the stack trace. } }
// unsubscribe from an event func unsubscribe(t *testing.T, wsc *client.WSClient, eventid string) { if err := wsc.Unsubscribe(eventid); err != nil { t.Fatal(err) } }