Files
cheesy-arena-lite/websocket/notifier_test.go
2018-09-01 22:13:27 -07:00

91 lines
2.5 KiB
Go

// Copyright 2014 Team 254. All Rights Reserved.
// Author: pat@patfairbank.com (Patrick Fairbank)
package websocket
import (
"github.com/stretchr/testify/assert"
"io/ioutil"
"log"
"testing"
)
func TestNotifier(t *testing.T) {
notifier := NewNotifier("testMessageType", generateTestMessage)
// Should do nothing when there are no listeners.
notifier.Notify()
notifier.NotifyWithMessage(12345)
notifier.NotifyWithMessage(struct{}{})
listener := notifier.listen()
notifier.Notify()
message := <-listener
assert.Equal(t, "testMessageType", message.messageType)
assert.Equal(t, "test message", message.messageBody)
notifier.NotifyWithMessage(12345)
assert.Equal(t, 12345, (<-listener).messageBody)
// Should allow multiple messages without blocking.
notifier.NotifyWithMessage("message1")
notifier.NotifyWithMessage("message2")
notifier.Notify()
assert.Equal(t, "message1", (<-listener).messageBody)
assert.Equal(t, "message2", (<-listener).messageBody)
assert.Equal(t, "test message", (<-listener).messageBody)
// Should stop sending messages and not block once the buffer is full.
log.SetOutput(ioutil.Discard) // Silence noisy log output.
for i := 0; i < 20; i++ {
notifier.NotifyWithMessage(i)
}
var value messageEnvelope
var lastValue interface{}
for lastValue == nil {
select {
case value = <-listener:
default:
lastValue = value.messageBody
return
}
}
notifier.NotifyWithMessage("next message")
assert.True(t, lastValue.(int) < 10)
assert.Equal(t, "next message", (<-listener).messageBody)
}
func TestNotifyMultipleListeners(t *testing.T) {
notifier := NewNotifier("testMessageType2", nil)
listeners := [50]chan messageEnvelope{}
for i := 0; i < len(listeners); i++ {
listeners[i] = notifier.listen()
}
notifier.Notify()
notifier.NotifyWithMessage(12345)
for listener := range notifier.listeners {
assert.Equal(t, nil, (<-listener).messageBody)
assert.Equal(t, 12345, (<-listener).messageBody)
}
// Should reap closed channels automatically.
close(listeners[4])
notifier.NotifyWithMessage("message1")
assert.Equal(t, 49, len(notifier.listeners))
for listener := range notifier.listeners {
assert.Equal(t, "message1", (<-listener).messageBody)
}
close(listeners[16])
close(listeners[21])
close(listeners[49])
notifier.NotifyWithMessage("message2")
assert.Equal(t, 46, len(notifier.listeners))
for listener := range notifier.listeners {
assert.Equal(t, "message2", (<-listener).messageBody)
}
}
func generateTestMessage() interface{} {
return "test message"
}