forked from voi-oss/svc
-
Notifications
You must be signed in to change notification settings - Fork 0
/
svc_test.go
116 lines (94 loc) · 2.44 KB
/
svc_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
package svc
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"go.uber.org/zap"
)
func TestWorkerInitOrder(t *testing.T) {
// Arrange
s, err := New("dummy-name", "dummy-version")
require.NoError(t, err)
var actualSeq []string
w1 := &WorkerMock{
InitFunc: func(*zap.Logger) error {
actualSeq = append(actualSeq, "w1Init")
return nil
},
RunFunc: func() error { return nil },
TerminateFunc: func() error { return nil },
}
w2 := &WorkerMock{
InitFunc: func(*zap.Logger) error {
actualSeq = append(actualSeq, "w2Init")
return nil
},
RunFunc: func() error { return nil },
TerminateFunc: func() error { return nil },
}
w3 := &WorkerMock{
InitFunc: func(*zap.Logger) error {
actualSeq = append(actualSeq, "w3Init")
return nil
},
RunFunc: func() error { return nil },
TerminateFunc: func() error { return nil },
}
// Act
s.AddWorker("w1", w1)
s.AddWorker("w2", w2)
s.AddWorker("w3", w3)
s.Run()
// Assert
expectedSeq := []string{
"w1Init",
"w2Init",
"w3Init",
}
assert.Equal(t, expectedSeq, actualSeq)
}
func TestShutdown(t *testing.T) {
// Arrange
termWorkerCh := make(chan struct{})
dummyWorker := &WorkerMock{
InitFunc: func(*zap.Logger) error { return nil },
RunFunc: func() error { <-termWorkerCh; return nil },
TerminateFunc: func() error { termWorkerCh <- struct{}{}; return nil },
}
s, err := New("dummy-service", "v0.0.0")
require.NoError(t, err)
s.AddWorker("dummy-worker", dummyWorker)
termSvcCh := make(chan struct{})
go func() { s.Run(); termSvcCh <- struct{}{} }()
s.Shutdown()
select {
case <-termSvcCh: // Success
case <-time.After(3 * time.Second): // time is arbitrary, just "long enough"
require.FailNow(t, "Service has not been shut down")
}
}
var _ Worker = (*WorkerMock)(nil)
type WorkerMock struct {
InitFunc func(*zap.Logger) error
RunFunc func() error
TerminateFunc func() error
}
func (w *WorkerMock) Init(l *zap.Logger) error {
if w.InitFunc == nil {
panic("WorkerMock: Init was called but InitFunc was not mocked!")
}
return w.InitFunc(l)
}
func (w *WorkerMock) Run() error {
if w.RunFunc == nil {
panic("WorkerMock: Run was called but RunFunc was not mocked!")
}
return w.RunFunc()
}
func (w *WorkerMock) Terminate() error {
if w.TerminateFunc == nil {
panic("WorkerMock: Terminate was called but TerminateFunc was not mocked!")
}
return w.TerminateFunc()
}