-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomposite_test.go
100 lines (87 loc) · 1.85 KB
/
composite_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
package supervisor_test
import (
"github.com/stretchr/testify/assert"
"sync"
"testing"
)
const compositeTestIterations = 50
type testingWatcher struct {
in chan string
wg sync.WaitGroup
res []string
}
func newTestingWatcher(expect int, components ...*testingComponent) (w *testingWatcher) {
w = &testingWatcher{
in: make(chan string),
}
for _, comp := range components {
comp.reportChan = w.in
}
w.wg.Add(expect)
go func() {
for m := range w.in {
//println(m)
w.res = append(w.res, m)
w.wg.Done()
}
}()
return
}
type testingComponent struct {
name string
errOpen error
errClose error
errWait error
eventsMu sync.Mutex
events []string
closedChan chan struct{}
reportChan chan string
}
func newTestingComponent(name string, errOpen, errClose, errWait error) (c *testingComponent) {
c = &testingComponent{
name: name,
errOpen: errOpen,
errClose: errClose,
errWait: errWait,
closedChan: make(chan struct{}),
}
return
}
func (c *testingComponent) appendEvent(e string) {
c.eventsMu.Lock()
defer c.eventsMu.Unlock()
c.events = append(c.events, e)
if c.reportChan != nil {
c.reportChan <- c.name + "-" + e
}
}
func (c *testingComponent) assertEvents(t *testing.T, events ...string) {
t.Helper()
c.eventsMu.Lock()
defer c.eventsMu.Unlock()
assert.Equal(t, events, c.events, c.name)
}
func (c *testingComponent) assertCycle(t *testing.T) {
t.Helper()
c.assertEvents(t, "open", "close", "done")
}
func (c *testingComponent) Open() (err error) {
err = c.errOpen
c.appendEvent("open")
//println("o", c.name)
return
}
func (c *testingComponent) Close() (err error) {
err = c.errClose
c.appendEvent("close")
close(c.closedChan)
//println("c", c.name)
return
}
func (c *testingComponent) Wait() (err error) {
err = c.errWait
<-c.closedChan
c.appendEvent("done")
//println("w", c.name)
return
}