-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathstatus_test.go
220 lines (171 loc) · 4.34 KB
/
status_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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
package sarah
import (
"testing"
"time"
)
func TestCurrentStatus(t *testing.T) {
// Override the package scoped variable that holds *status instance.
// Copy of this status should be returned on CurrentStatus().
botType := BotType("dummy")
runnerStatus = &status{
bots: []*botStatus{
{
botType: botType,
finished: make(chan struct{}),
},
},
}
// Check initial state
currentStatus := CurrentStatus()
if currentStatus.Running {
t.Error("Status should not be Running at this point.")
}
if len(currentStatus.Bots) != 1 {
t.Fatalf("Unexpected number of BotStatus is returned: %d.", len(currentStatus.Bots))
}
if currentStatus.Bots[0].Type != botType {
t.Errorf("Expected BotType is not set. %#v", currentStatus.Bots[0])
}
}
func Test_status_start(t *testing.T) {
s := &status{}
// Initial call
err := s.start()
if err != nil {
t.Fatalf("Unexpected error is returned: %s.", err.Error())
}
if s.finished == nil {
t.Error("A channel to judge running status must be set.")
}
// Successive call should return an error
err = s.start()
if err == nil {
t.Fatalf("Expected error is not returned.")
}
if err != ErrRunnerAlreadyRunning {
t.Errorf("Returned error is not the expected one: %s", err.Error())
}
}
func Test_status_running(t *testing.T) {
s := &status{}
if s.running() {
t.Error("Status should not be Running at this point.")
}
s.finished = make(chan struct{})
if !s.running() {
t.Error("Status should be Running at this point.")
}
close(s.finished)
if s.running() {
t.Error("Status should not be Running at this point.")
}
}
func Test_status_stop(t *testing.T) {
s := &status{
finished: make(chan struct{}),
}
s.stop()
select {
case <-s.finished:
// O.K. Channel is closed.
case <-time.NewTimer(100 * time.Millisecond).C:
t.Error("A channel is not closed on status.stop.")
}
s.stop() // Multiple call to this method should not panic.
}
func Test_status_addBot(t *testing.T) {
botType := BotType("dummy")
bot := &DummyBot{BotTypeValue: botType}
s := &status{}
s.addBot(bot)
botStatuses := s.bots
if len(botStatuses) != 1 {
t.Fatal("Status for one and only one Bot should be set.")
}
bs := botStatuses[0]
if bs.botType != botType {
t.Errorf("Expected BotType is not set: %s.", bs.botType)
}
if !bs.running() {
t.Error("Bot status must be running at this point.")
}
}
func Test_status_stopBot(t *testing.T) {
botType := BotType("dummy")
bs := &botStatus{
botType: botType,
finished: make(chan struct{}),
}
s := &status{
bots: []*botStatus{bs},
}
bot := &DummyBot{BotTypeValue: botType}
s.stopBot(bot)
botStatuses := s.bots
if len(botStatuses) != 1 {
t.Fatal("Status for one and only one Bot should be set.")
}
stored := botStatuses[0]
if stored.botType != botType {
t.Errorf("Expected BotType is not set: %s.", bs.botType)
}
if stored.running() {
t.Error("Bot status must not be running at this point.")
}
}
func Test_status_snapshot(t *testing.T) {
botType := BotType("dummy")
bs := &botStatus{
botType: botType,
finished: make(chan struct{}),
}
s := &status{
bots: []*botStatus{bs},
finished: make(chan struct{}),
}
snapshot := s.snapshot()
if !snapshot.Running {
t.Error("Status.Running should be true at this point.")
}
if len(snapshot.Bots) != 1 {
t.Errorf("The number of registered Bot should be one, but was %d.", len(snapshot.Bots))
}
if !snapshot.Bots[0].Running {
t.Error("BotStatus.Running should be true at this point.")
}
close(bs.finished)
close(s.finished)
snapshot = s.snapshot()
if snapshot.Running {
t.Error("Status.Running should be false at this point.")
}
if snapshot.Bots[0].Running {
t.Error("BotStatus.Running should be false at this point.")
}
}
func Test_botStatus_running(t *testing.T) {
bs := &botStatus{
botType: "dummy",
finished: make(chan struct{}),
}
if !bs.running() {
t.Error("botStatus.running() should be true at this point.")
}
close(bs.finished)
if bs.running() {
t.Error("botStatus.running() should be false at this point.")
}
}
func Test_botStatus_stop(t *testing.T) {
bs := &botStatus{
finished: make(chan struct{}),
}
bs.stop()
select {
case <-bs.finished:
// O.K. Channel is closed.
case <-time.NewTimer(100 * time.Millisecond).C:
t.Error("A channel is not closed on botStatus.stop.")
}
bs.stop() // Multiple call to this method should not panic.
}