| package utils |
| |
| import ( |
| "testing" |
| "time" |
| ) |
| |
| func assertSubscribersCount(t *testing.T, q *JSONMessagePublisher, expected int) { |
| if q.SubscribersCount() != expected { |
| t.Fatalf("Expected %d registered subscribers, got %d", expected, q.SubscribersCount()) |
| } |
| } |
| |
| func TestJSONMessagePublisherSubscription(t *testing.T) { |
| q := NewJSONMessagePublisher() |
| l1 := make(chan JSONMessage) |
| l2 := make(chan JSONMessage) |
| |
| assertSubscribersCount(t, q, 0) |
| q.Subscribe(l1) |
| assertSubscribersCount(t, q, 1) |
| q.Subscribe(l2) |
| assertSubscribersCount(t, q, 2) |
| |
| q.Unsubscribe(l1) |
| q.Unsubscribe(l2) |
| assertSubscribersCount(t, q, 0) |
| } |
| |
| func TestJSONMessagePublisherPublish(t *testing.T) { |
| q := NewJSONMessagePublisher() |
| l1 := make(chan JSONMessage) |
| l2 := make(chan JSONMessage) |
| |
| go func() { |
| for { |
| select { |
| case <-l1: |
| close(l1) |
| l1 = nil |
| case <-l2: |
| close(l2) |
| l2 = nil |
| case <-time.After(1 * time.Second): |
| q.Unsubscribe(l1) |
| q.Unsubscribe(l2) |
| t.Fatal("Timeout waiting for broadcasted message") |
| } |
| } |
| }() |
| |
| q.Subscribe(l1) |
| q.Subscribe(l2) |
| q.Publish(JSONMessage{}) |
| } |
| |
| func TestJSONMessagePublishTimeout(t *testing.T) { |
| q := NewJSONMessagePublisher() |
| l := make(chan JSONMessage) |
| q.Subscribe(l) |
| |
| c := make(chan struct{}) |
| go func() { |
| q.Publish(JSONMessage{}) |
| close(c) |
| }() |
| |
| select { |
| case <-c: |
| case <-time.After(time.Second): |
| t.Fatal("Timeout publishing message") |
| } |
| } |