github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/exec/event_test.go (about)

     1  package exec
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/hyperledger/burrow/binary"
     7  	"github.com/hyperledger/burrow/crypto"
     8  	"github.com/hyperledger/burrow/event"
     9  	"github.com/hyperledger/burrow/event/query"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  	"github.com/tmthrgd/go-hex"
    13  )
    14  
    15  func TestEventTagQueries(t *testing.T) {
    16  	ev := logEvent()
    17  
    18  	qb := query.NewBuilder().AndEquals(event.EventTypeKey, TypeLog.String())
    19  	qry, err := qb.Query()
    20  	require.NoError(t, err)
    21  	assert.True(t, qry.Matches(ev))
    22  	require.NoError(t, qry.MatchError())
    23  
    24  	qb = qb.AndContains(event.EventIDKey, "bar")
    25  	qry, err = qb.Query()
    26  	require.NoError(t, err)
    27  	assert.True(t, qry.Matches(ev))
    28  	require.NoError(t, qry.MatchError())
    29  
    30  	qb = qb.AndEquals(event.TxHashKey, hex.EncodeUpperToString(ev.Header.TxHash))
    31  	qry, err = qb.Query()
    32  	require.NoError(t, err)
    33  	assert.True(t, qry.Matches(ev))
    34  	require.NoError(t, qry.MatchError())
    35  
    36  	qb = qb.AndGreaterThanOrEqual(event.HeightKey, ev.Header.Height)
    37  	qry, err = qb.Query()
    38  	require.NoError(t, err)
    39  	assert.True(t, qry.Matches(ev))
    40  	require.NoError(t, qry.MatchError())
    41  
    42  	qb = qb.AndStrictlyLessThan(event.IndexKey, ev.Header.Index+1)
    43  	qry, err = qb.Query()
    44  	require.NoError(t, err)
    45  	assert.True(t, qry.Matches(ev))
    46  	require.NoError(t, qry.MatchError())
    47  
    48  	qb = qb.AndEquals(event.AddressKey, ev.Log.Address)
    49  	qry, err = qb.Query()
    50  	require.NoError(t, err)
    51  	assert.True(t, qry.Matches(ev))
    52  	require.NoError(t, qry.MatchError())
    53  
    54  	qb = qb.AndEquals(LogNTextKey(0), "marmot")
    55  	qry, err = qb.Query()
    56  	require.NoError(t, err)
    57  	assert.True(t, qry.Matches(ev))
    58  	require.NoError(t, qry.MatchError())
    59  }
    60  
    61  func BenchmarkMatching(b *testing.B) {
    62  	b.StopTimer()
    63  	ev := logEvent()
    64  	qb := query.NewBuilder().AndEquals(event.EventTypeKey, TypeLog.String()).
    65  		AndContains(event.EventIDKey, "bar").
    66  		AndEquals(event.TxHashKey, hex.EncodeUpperToString(ev.Header.TxHash)).
    67  		AndGreaterThanOrEqual(event.HeightKey, ev.Header.Height).
    68  		AndStrictlyLessThan(event.IndexKey, ev.Header.Index+1).
    69  		AndEquals(event.AddressKey, ev.Log.Address).
    70  		AndEquals(LogNTextKey(0), "marmot")
    71  	qry, err := qb.Query()
    72  	require.NoError(b, err)
    73  	b.StartTimer()
    74  	for i := 0; i < b.N; i++ {
    75  		qry.Matches(ev)
    76  	}
    77  }
    78  
    79  func logEvent() *Event {
    80  	return &Event{
    81  		Header: &Header{
    82  			EventType: TypeLog,
    83  			EventID:   "foo/bar",
    84  			TxHash:    []byte{2, 3, 4},
    85  			Height:    34,
    86  			Index:     2,
    87  		},
    88  		Log: &LogEvent{
    89  			Address: crypto.MustAddressFromHexString("DEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF"),
    90  			Topics:  []binary.Word256{binary.RightPadWord256([]byte("marmot"))},
    91  		},
    92  	}
    93  }