github.com/datachainlab/burrow@v0.25.0/event/emitter_test.go (about)

     1  package event
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  	"time"
     7  
     8  	"strings"
     9  
    10  	"github.com/hyperledger/burrow/event/query"
    11  	"github.com/hyperledger/burrow/logging"
    12  	"github.com/stretchr/testify/assert"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestEmitter(t *testing.T) {
    17  	em := NewEmitter()
    18  	em.SetLogger(logging.NewNoopLogger())
    19  	ctx := context.Background()
    20  
    21  	out, err := em.Subscribe(ctx, "TestEmitter", query.NewBuilder().AndStrictlyGreaterThan("foo", 10), 1)
    22  	require.NoError(t, err)
    23  
    24  	msgMiss := struct{ flob string }{"flib"}
    25  	err = em.Publish(ctx, msgMiss, query.TagMap{"foo": 10})
    26  	assert.NoError(t, err)
    27  
    28  	msgHit := struct{ blib string }{"blab"}
    29  	err = em.Publish(ctx, msgHit, query.TagMap{"foo": 11})
    30  	assert.NoError(t, err)
    31  
    32  	select {
    33  	case msg := <-out:
    34  		assert.Equal(t, msgHit, msg)
    35  	case <-time.After(time.Second):
    36  		t.Errorf("timed out before receiving message matching subscription query")
    37  	}
    38  }
    39  
    40  func TestOrdering(t *testing.T) {
    41  	em := NewEmitter()
    42  	em.SetLogger(logging.NewNoopLogger())
    43  	ctx := context.Background()
    44  
    45  	out1, err := em.Subscribe(ctx, "TestOrdering1", query.NewBuilder().AndEquals("foo", "bar"), 10)
    46  	require.NoError(t, err)
    47  
    48  	out2, err := em.Subscribe(ctx, "TestOrdering2", query.NewBuilder().AndEquals("foo", "baz"), 10)
    49  	require.NoError(t, err)
    50  
    51  	barTag := query.TagMap{"foo": "bar"}
    52  	bazTag := query.TagMap{"foo": "baz"}
    53  
    54  	msgs := [][]interface{}{
    55  		{"baz1", bazTag},
    56  		{"bar1", barTag},
    57  		{"bar2", barTag},
    58  		{"bar3", barTag},
    59  		{"baz2", bazTag},
    60  		{"baz3", bazTag},
    61  		{"bar4", barTag},
    62  	}
    63  
    64  	go func() {
    65  		for _, msg := range msgs {
    66  			em.Publish(ctx, msg[0], msg[1].(query.TagMap))
    67  		}
    68  		em.Publish(ctx, "stop", bazTag)
    69  	}()
    70  
    71  	for _, msg := range msgs {
    72  		str := msg[0].(string)
    73  		if strings.HasPrefix(str, "bar") {
    74  			assert.Equal(t, str, <-out1)
    75  		} else {
    76  			assert.Equal(t, str, <-out2)
    77  		}
    78  	}
    79  }