Skip to content

Commit ee3e183

Browse files
authored
common: improve robot level errors (#1180)
1 parent b53b403 commit ee3e183

File tree

4 files changed

+65
-29
lines changed

4 files changed

+65
-29
lines changed

connection.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gobot
22

33
import (
4+
"fmt"
45
"log"
56
"reflect"
67

@@ -41,7 +42,7 @@ func (c *Connections) Each(f func(Connection)) {
4142

4243
// Start calls Connect on each Connection in c
4344
func (c *Connections) Start() error {
44-
log.Println("Starting connections...")
45+
log.Printf("Starting %d connections...", len(*c))
4546
var err error
4647
for _, connection := range *c {
4748
info := "Starting connection " + connection.Name()
@@ -53,18 +54,19 @@ func (c *Connections) Start() error {
5354
log.Println(info + "...")
5455

5556
if cerr := connection.Connect(); cerr != nil {
56-
err = multierror.Append(err, cerr)
57+
err = multierror.Append(err, fmt.Errorf("'%s' connect error: %w", connection.Name(), cerr))
5758
}
5859
}
5960
return err
6061
}
6162

6263
// Finalize calls Finalize on each Connection in c
6364
func (c *Connections) Finalize() error {
65+
log.Printf("Finalize %d connections...", len(*c))
6466
var err error
6567
for _, connection := range *c {
6668
if cerr := connection.Finalize(); cerr != nil {
67-
err = multierror.Append(err, cerr)
69+
err = multierror.Append(err, fmt.Errorf("'%s' finalize error: %w", connection.Name(), cerr))
6870
}
6971
}
7072
return err

device.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package gobot
22

33
import (
4+
"fmt"
45
"log"
56
"reflect"
67

@@ -54,7 +55,7 @@ func (d *Devices) Each(f func(Device)) {
5455

5556
// Start calls Start on each Device in d
5657
func (d *Devices) Start() error {
57-
log.Println("Starting devices...")
58+
log.Printf("Starting %d devices...", d.Len())
5859
var err error
5960
for _, device := range *d {
6061
info := "Starting device " + device.Name()
@@ -65,18 +66,19 @@ func (d *Devices) Start() error {
6566

6667
log.Println(info + "...")
6768
if derr := device.Start(); derr != nil {
68-
err = multierror.Append(err, derr)
69+
err = multierror.Append(err, fmt.Errorf("'%s' start error: %w", device.Name(), derr))
6970
}
7071
}
7172
return err
7273
}
7374

7475
// Halt calls Halt on each Device in d
7576
func (d *Devices) Halt() error {
77+
log.Printf("Halt %d devices...", d.Len())
7678
var err error
7779
for _, device := range *d {
7880
if derr := device.Halt(); derr != nil {
79-
err = multierror.Append(err, derr)
81+
err = multierror.Append(err, fmt.Errorf("'%s' halt error: %w", device.Name(), derr))
8082
}
8183
}
8284
return err

manager_test.go

Lines changed: 50 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -88,64 +88,91 @@ func TestManagerStartAutoRun(t *testing.T) {
8888
}
8989

9090
func TestManagerStartDriverErrors(t *testing.T) {
91+
// arrange
9192
g := initTestManager1Robot()
92-
e := errors.New("driver start error 1")
93+
var ec int
94+
es := [4]error{
95+
nil,
96+
errors.New("driver start error 1"),
97+
errors.New("driver start error 2"),
98+
errors.New("driver start error 3"),
99+
}
93100
testDriverStart = func() error {
94-
return e
101+
ec++
102+
return es[ec]
95103
}
104+
defer func() { testDriverStart = func() error { return nil } }()
96105

97106
var want error
98-
want = multierror.Append(want, e)
99-
want = multierror.Append(want, e)
100-
want = multierror.Append(want, e)
107+
want = multierror.Append(want, fmt.Errorf("'Device1' start error: %w", es[1]))
108+
want = multierror.Append(want, fmt.Errorf("'Device2' start error: %w", es[2]))
109+
want = multierror.Append(want, fmt.Errorf("'' start error: %w", es[3]))
101110

111+
// act & assert
102112
assert.Equal(t, want, g.Start())
103113
require.NoError(t, g.Stop())
104-
105-
testDriverStart = func() error { return nil }
106114
}
107115

108116
func TestManagerHaltFromRobotDriverErrors(t *testing.T) {
117+
// arrange
109118
g := initTestManager1Robot()
119+
es := [4]error{
120+
nil,
121+
errors.New("driver halt error 1"),
122+
errors.New("driver halt error 2"),
123+
errors.New("driver halt error 3"),
124+
}
110125
var ec int
111126
testDriverHalt = func() error {
112127
ec++
113-
return fmt.Errorf("driver halt error %d", ec)
128+
return es[ec]
114129
}
115130
defer func() { testDriverHalt = func() error { return nil } }()
116131

117132
var want error
118-
for i := 1; i <= 3; i++ {
119-
e := fmt.Errorf("driver halt error %d", i)
120-
want = multierror.Append(want, e)
121-
}
133+
want = multierror.Append(want, fmt.Errorf("'Device1' halt error: %w", es[1]))
134+
want = multierror.Append(want, fmt.Errorf("'Device2' halt error: %w", es[2]))
135+
want = multierror.Append(want, fmt.Errorf("'' halt error: %w", es[3]))
122136

137+
// act & assert
123138
assert.Equal(t, want, g.Start())
124139
}
125140

126141
func TestManagerStartRobotAdaptorErrors(t *testing.T) {
142+
// arrange
127143
g := initTestManager1Robot()
144+
es := [4]error{
145+
nil,
146+
errors.New("adaptor start error 1"),
147+
errors.New("adaptor start error 2"),
148+
errors.New("adaptor start error 3"),
149+
}
128150
var ec int
129151
testAdaptorConnect = func() error {
130152
ec++
131-
return fmt.Errorf("adaptor start error %d", ec)
153+
return es[ec]
132154
}
133155
defer func() { testAdaptorConnect = func() error { return nil } }()
134156

135157
var want error
136-
for i := 1; i <= 3; i++ {
137-
e := fmt.Errorf("adaptor start error %d", i)
138-
want = multierror.Append(want, e)
139-
}
158+
want = multierror.Append(want, fmt.Errorf("'Connection1' connect error: %w", es[1]))
159+
want = multierror.Append(want, fmt.Errorf("'Connection2' connect error: %w", es[2]))
160+
want = multierror.Append(want, fmt.Errorf("'' connect error: %w", es[3]))
140161

162+
// act & assert
141163
assert.Equal(t, want, g.Start())
142164
require.NoError(t, g.Stop())
143-
144-
testAdaptorConnect = func() error { return nil }
145165
}
146166

147167
func TestManagerFinalizeErrors(t *testing.T) {
168+
// arrange
148169
g := initTestManager1Robot()
170+
es := [4]error{
171+
nil,
172+
errors.New("adaptor finalize error 1"),
173+
errors.New("adaptor finalize error 2"),
174+
errors.New("adaptor finalize error 3"),
175+
}
149176
var ec int
150177
testAdaptorFinalize = func() error {
151178
ec++
@@ -154,10 +181,10 @@ func TestManagerFinalizeErrors(t *testing.T) {
154181
defer func() { testAdaptorFinalize = func() error { return nil } }()
155182

156183
var want error
157-
for i := 1; i <= 3; i++ {
158-
e := fmt.Errorf("adaptor finalize error %d", i)
159-
want = multierror.Append(want, e)
160-
}
184+
want = multierror.Append(want, fmt.Errorf("'Connection1' finalize error: %w", es[1]))
185+
want = multierror.Append(want, fmt.Errorf("'Connection2' finalize error: %w", es[2]))
186+
want = multierror.Append(want, fmt.Errorf("'' finalize error: %w", es[3]))
161187

188+
// act & assert
162189
assert.Equal(t, want, g.Start())
163190
}

robot.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,11 @@ func (r *Robot) Stop() error {
218218
err = multierror.Append(err, e)
219219
}
220220

221+
if !r.Running() {
222+
// start was not successful, a full channel would block
223+
return err
224+
}
225+
221226
r.done <- true
222227
r.running.Store(false)
223228
return err

0 commit comments

Comments
 (0)