mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-18 22:14:35 +00:00
Update usage in tests. Co-authored-by: M. J. Fromberger <fromberger@interchain.io>
This commit is contained in:
co-authored by
M. J. Fromberger
parent
96dd4d08c3
commit
d6d3c172da
+11
-13
@@ -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
@@ -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")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user