Skip to content

Commit 4f2cde7

Browse files
authored
Merge pull request #67 from go-tstr/fix/reverse-closing-order
Fix/reverse closing order
2 parents 99e78a6 + b032263 commit 4f2cde7

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

runner.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ func (t *Runner) Start() error {
5050
// Stop stops all started dependencies in the reverse order they were started.
5151
func (t *Runner) Stop() error {
5252
var err error
53-
for _, s := range t.stoppables {
53+
for i := len(t.stoppables) - 1; i >= 0; i-- {
54+
s := t.stoppables[i]
5455
err = errors.Join(err, s.Stop())
5556
}
5657
if err != nil {

runner_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
package tstr_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/go-tstr/tstr"
7+
"github.com/stretchr/testify/assert"
8+
"github.com/stretchr/testify/require"
9+
)
10+
11+
func TestRunnerOrder(t *testing.T) {
12+
const depCount = 3
13+
startCh := make(chan int, 5)
14+
readyCh := make(chan int, 5)
15+
stopCh := make(chan int, 5)
16+
17+
deps := make([]tstr.Dependency, 0, depCount)
18+
for i := range depCount {
19+
deps = append(deps, &MockDep{
20+
num: i,
21+
startCh: startCh,
22+
readyCh: readyCh,
23+
stopCh: stopCh,
24+
})
25+
}
26+
27+
r := tstr.NewRunner(deps...)
28+
require.NoError(t, r.Start())
29+
30+
startOrder := make([]int, 0, 3)
31+
for v := range startCh {
32+
startOrder = append(startOrder, v)
33+
if len(startOrder) == depCount {
34+
close(startCh)
35+
}
36+
}
37+
assert.Equal(t, []int{0, 1, 2}, startOrder, "wrong start order")
38+
39+
readyOrder := make([]int, 0, 3)
40+
for v := range readyCh {
41+
readyOrder = append(readyOrder, v)
42+
if len(readyOrder) == depCount {
43+
close(readyCh)
44+
}
45+
}
46+
assert.Equal(t, []int{0, 1, 2}, readyOrder, "wrong ready order")
47+
48+
require.NoError(t, r.Stop())
49+
50+
stopOrder := make([]int, 0, 3)
51+
for v := range stopCh {
52+
stopOrder = append(stopOrder, v)
53+
if len(stopOrder) == depCount {
54+
close(stopCh)
55+
}
56+
}
57+
assert.Equal(t, []int{2, 1, 0}, stopOrder, "wrong stop order")
58+
}
59+
60+
type MockDep struct {
61+
num int
62+
startCh chan int
63+
readyCh chan int
64+
stopCh chan int
65+
}
66+
67+
func (m *MockDep) Start() error {
68+
m.startCh <- m.num
69+
return nil
70+
}
71+
72+
func (m *MockDep) Ready() error {
73+
m.readyCh <- m.num
74+
return nil
75+
}
76+
77+
func (m *MockDep) Stop() error {
78+
m.stopCh <- m.num
79+
return nil
80+
}

0 commit comments

Comments
 (0)