150 lines
2.8 KiB
Go
150 lines
2.8 KiB
Go
package bus_test
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/gopatchy/bus"
|
|
"github.com/gopatchy/metadata"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestBus(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
bus := bus.NewBus()
|
|
|
|
// Announce with no subscribers
|
|
bus.Announce("busTest1", &busTest{
|
|
Metadata: metadata.Metadata{
|
|
ID: "id-nosub",
|
|
},
|
|
})
|
|
|
|
// Complex subscription layout
|
|
c1a := bus.SubscribeKey("busTest1", "id-overlap", nil)
|
|
require.Nil(t, <-c1a)
|
|
|
|
defer bus.UnsubscribeKey("busTest1", "id-overlap", c1a)
|
|
|
|
c2a := bus.SubscribeKey("busTest2", "id-overlap", nil)
|
|
require.Nil(t, <-c2a)
|
|
|
|
defer bus.UnsubscribeKey("busTest2", "id-overlap", c2a)
|
|
|
|
c2b := bus.SubscribeKey("busTest2", "id-dupe", nil)
|
|
require.Nil(t, <-c2b)
|
|
|
|
defer bus.UnsubscribeKey("busTest2", "id-dupe", c2b)
|
|
|
|
c2c := bus.SubscribeKey("busTest2", "id-dupe", nil)
|
|
require.Nil(t, <-c2c)
|
|
|
|
defer bus.UnsubscribeKey("busTest2", "id-dupe", c2c)
|
|
|
|
ct1 := bus.SubscribeType("busTest1", nil)
|
|
require.Nil(t, <-ct1)
|
|
|
|
defer bus.UnsubscribeType("busTest1", ct1)
|
|
|
|
ct2 := bus.SubscribeType("busTest2", nil)
|
|
require.Nil(t, <-ct2)
|
|
|
|
defer bus.UnsubscribeType("busTest2", ct2)
|
|
|
|
// Overlapping IDs but not types
|
|
bus.Announce("busTest1", &busTest{
|
|
Metadata: metadata.Metadata{
|
|
ID: "id-overlap",
|
|
},
|
|
})
|
|
|
|
msg := <-c1a
|
|
require.Equal(t, "id-overlap", msg.(*busTest).ID)
|
|
|
|
msg = <-ct1
|
|
require.Equal(t, "id-overlap", msg.(*busTest).ID)
|
|
|
|
select {
|
|
case msg := <-c2a:
|
|
require.Fail(t, "unexpected message", msg)
|
|
case msg := <-ct2:
|
|
require.Fail(t, "unexpected message", msg)
|
|
default:
|
|
}
|
|
|
|
bus.Announce("busTest2", &busTest{
|
|
Metadata: metadata.Metadata{
|
|
ID: "id-overlap",
|
|
},
|
|
})
|
|
|
|
select {
|
|
case msg := <-c1a:
|
|
require.Fail(t, "unexpected message", msg)
|
|
case msg := <-ct1:
|
|
require.Fail(t, "unexpected message", msg)
|
|
default:
|
|
}
|
|
|
|
msg = <-c2a
|
|
require.Equal(t, "id-overlap", msg.(*busTest).ID)
|
|
|
|
msg = <-ct2
|
|
require.Equal(t, "id-overlap", msg.(*busTest).ID)
|
|
|
|
bus.Announce("busTest2", &busTest{
|
|
Metadata: metadata.Metadata{
|
|
ID: "id-dupe",
|
|
},
|
|
})
|
|
|
|
msg = <-c2b
|
|
require.Equal(t, "id-dupe", msg.(*busTest).ID)
|
|
|
|
msg = <-c2c
|
|
require.Equal(t, "id-dupe", msg.(*busTest).ID)
|
|
|
|
msg = <-ct2
|
|
require.Equal(t, "id-dupe", msg.(*busTest).ID)
|
|
}
|
|
|
|
func TestBusDelete(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
bus := bus.NewBus()
|
|
|
|
c := bus.SubscribeKey("busTest", "id1", nil)
|
|
require.Nil(t, <-c)
|
|
|
|
defer bus.UnsubscribeKey("busTest", "id1", c)
|
|
|
|
ct := bus.SubscribeType("busTest", nil)
|
|
require.Nil(t, <-ct)
|
|
|
|
defer bus.UnsubscribeType("busTest", ct)
|
|
|
|
bus.Announce("busTest", &busTest{
|
|
Metadata: metadata.Metadata{
|
|
ID: "id1",
|
|
},
|
|
})
|
|
|
|
msg := <-c
|
|
require.Equal(t, "id1", msg.(*busTest).ID)
|
|
|
|
msg = <-ct
|
|
require.Equal(t, "id1", msg.(*busTest).ID)
|
|
|
|
bus.Delete("busTest", "id1")
|
|
|
|
_, ok := <-c
|
|
require.False(t, ok)
|
|
|
|
id := (<-ct).(string)
|
|
require.Equal(t, "id1", id)
|
|
}
|
|
|
|
type busTest struct {
|
|
metadata.Metadata
|
|
}
|