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 }