github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/event/emitter_test.go (about)

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