forked from Team254/cheesy-arena
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnotifier_test.go
84 lines (74 loc) · 2.09 KB
/
notifier_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
// Copyright 2014 Team 254. All Rights Reserved.
// Author: [email protected] (Patrick Fairbank)
package main
import (
"github.com/stretchr/testify/assert"
"io/ioutil"
"log"
"testing"
)
func TestNotifier(t *testing.T) {
notifier := NewNotifier()
// Should do nothing when there are no listeners.
notifier.Notify("test message")
notifier.Notify(12345)
notifier.Notify(struct{}{})
listener := notifier.Listen()
notifier.Notify("test message")
assert.Equal(t, "test message", <-listener)
notifier.Notify(12345)
assert.Equal(t, 12345, <-listener)
// Should allow multiple messages without blocking.
notifier.Notify("message1")
notifier.Notify("message2")
notifier.Notify("message3")
assert.Equal(t, "message1", <-listener)
assert.Equal(t, "message2", <-listener)
assert.Equal(t, "message3", <-listener)
// 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.Notify(i)
}
var value interface{}
var lastValue interface{}
for lastValue == nil {
select {
case value = <-listener:
default:
lastValue = value
return
}
}
notifier.Notify("next message")
assert.True(t, lastValue.(int) < 10)
assert.Equal(t, "next message", <-listener)
}
func TestNotifyMultipleListeners(t *testing.T) {
notifier := NewNotifier()
listeners := [50]chan interface{}{}
for i := 0; i < len(listeners); i++ {
listeners[i] = notifier.Listen()
}
notifier.Notify("test message")
notifier.Notify(12345)
for listener, _ := range notifier.listeners {
assert.Equal(t, "test message", <-listener)
assert.Equal(t, 12345, <-listener)
}
// Should reap closed channels automatically.
close(listeners[4])
notifier.Notify("message1")
assert.Equal(t, 49, len(notifier.listeners))
for listener, _ := range notifier.listeners {
assert.Equal(t, "message1", <-listener)
}
close(listeners[16])
close(listeners[21])
close(listeners[49])
notifier.Notify("message2")
assert.Equal(t, 46, len(notifier.listeners))
for listener, _ := range notifier.listeners {
assert.Equal(t, "message2", <-listener)
}
}