mirror of
https://github.com/Team254/cheesy-arena-lite.git
synced 2026-03-09 13:46:44 -04:00
Refactor websocket model to reduce duplicated code.
This commit is contained in:
90
websocket/notifier_test.go
Normal file
90
websocket/notifier_test.go
Normal file
@@ -0,0 +1,90 @@
|
||||
// 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"
|
||||
}
|
||||
Reference in New Issue
Block a user