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 }