rpc/client: rewrite the WaitForOneEvent helper (#7986) (#9550)

Update usage in tests.

Co-authored-by: M. J. Fromberger <fromberger@interchain.io>
This commit is contained in:
mmsqe
2022-11-03 10:19:41 +01:00
committed by GitHub
co-authored by M. J. Fromberger
parent 96dd4d08c3
commit d6d3c172da
2 changed files with 31 additions and 40 deletions
+11 -13
View File
@@ -41,12 +41,12 @@ func TestHeaderEvents(t *testing.T) {
} }
}) })
} }
ectx, cancel := context.WithTimeout(ctx, waitForEventTimeout)
evtTyp := types.EventNewBlockHeader defer cancel()
evt, err := client.WaitForOneEvent(c, evtTyp, waitForEventTimeout) query := types.QueryForEvent(types.EventNewBlockHeader).String()
var evt types.EventDataNewBlockHeader
err := client.WaitForOneEvent(ectx, c, query, &evt)
require.Nil(t, err, "%d: %+v", i, err) require.Nil(t, err, "%d: %+v", i, err)
_, ok := evt.(types.EventDataNewBlockHeader)
require.True(t, ok, "%d: %#v", i, evt)
// TODO: more checks... // TODO: more checks...
}) })
} }
@@ -141,17 +141,15 @@ func testTxEventsSent(t *testing.T, broadcastMethod string) {
} }
}() }()
// and wait for confirmation // Wait for the transaction we sent to be confirmed.
evt, err := client.WaitForOneEvent(c, types.EventTx, waitForEventTimeout) query := fmt.Sprintf(`tm.event = '%s' AND tx.hash = '%X'`, types.EventTx, types.Tx(tx).Hash())
var evt types.EventDataTx
err := client.WaitForOneEvent(ctx, c, query, &evt)
require.Nil(t, err) require.Nil(t, err)
// and make sure it has the proper info
txe, ok := evt.(types.EventDataTx)
require.True(t, ok)
// make sure this is the proper tx // make sure this is the proper tx
require.EqualValues(t, tx, txe.Tx) require.EqualValues(t, tx, evt.Tx)
require.True(t, txe.Result.IsOK()) require.True(t, evt.Result.IsOK())
}) })
} }
} }
+20 -27
View File
@@ -2,10 +2,11 @@ package client
import ( import (
"context" "context"
"errors" "encoding/json"
"fmt" "fmt"
"time" "time"
coretypes "github.com/tendermint/tendermint/rpc/core/types"
"github.com/tendermint/tendermint/types" "github.com/tendermint/tendermint/types"
) )
@@ -52,32 +53,24 @@ func WaitForHeight(c StatusClient, h int64, waiter Waiter) error {
return nil return nil
} }
// WaitForOneEvent subscribes to a websocket event for the given // WaitForOneEvent waits for the first event matching the given query on c, or
// event time and returns upon receiving it one time, or // until ctx ends. It reports an error if ctx ends before a matching event is
// when the timeout duration has expired. // received.
// func WaitForOneEvent(ctx context.Context, c EventsClient, query string, evt types.TMEventData) error {
// This handles subscribing and unsubscribing under the hood for {
func WaitForOneEvent(c SubscriptionClient, evtTyp string, timeout time.Duration) (types.TMEventData, error) { rsp, err := c.Events(ctx, &coretypes.RequestEvents{
const subscriber = "helpers" Filter: &coretypes.EventFilter{Query: query},
ctx, cancel := context.WithTimeout(context.Background(), timeout) MaxItems: 1,
defer cancel() WaitTime: 10 * time.Second, // duration doesn't matter, limited by ctx timeout
})
// register for the next event of this type if err != nil {
eventCh, err := c.Subscribe(ctx, subscriber, types.QueryForEvent(evtTyp).String()) return err
if err != nil { } else if len(rsp.Items) == 0 {
return nil, fmt.Errorf("failed to subscribe: %w", err) continue // continue polling until ctx expires
}
// make sure to unregister after the test is over
defer func() {
if deferErr := c.UnsubscribeAll(ctx, subscriber); deferErr != nil {
panic(deferErr)
} }
}() if err := json.Unmarshal(rsp.Items[0].Data, evt); err != nil {
return err
select { }
case event := <-eventCh: return nil
return event.Data, nil
case <-ctx.Done():
return nil, errors.New("timed out waiting for event")
} }
} }