Skip to content

Commit 738ef11

Browse files
authored
Fix flaky global ErrorHandler delegation test (open-telemetry#1829)
* Resolve flaky global ErrorHandler delegation test Remove multi-goroutine approach and just test what needs to be tested. * Assert instead of require where appropriate
1 parent e43d9c0 commit 738ef11

File tree

1 file changed

+9
-55
lines changed

1 file changed

+9
-55
lines changed

handler_test.go

+9-55
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@ package otel
1717
import (
1818
"bytes"
1919
"errors"
20-
"fmt"
2120
"log"
2221
"testing"
23-
"time"
2422

2523
"github.com/stretchr/testify/suite"
2624
)
@@ -72,70 +70,26 @@ func (s *HandlerTestSuite) TestGlobalHandler() {
7270
}
7371

7472
func (s *HandlerTestSuite) TestNoDropsOnDelegate() {
75-
// max time to wait for goroutine to Handle an error.
76-
pause := 10 * time.Millisecond
77-
78-
var sent int
79-
err := errors.New("")
80-
stop := make(chan struct{})
81-
beat := make(chan struct{})
82-
done := make(chan struct{})
83-
84-
// Wait for a error to be submitted from the following goroutine.
85-
wait := func(d time.Duration) error {
86-
timer := time.NewTimer(d)
87-
select {
88-
case <-timer.C:
89-
// We are about to fail, stop the spawned goroutine.
90-
stop <- struct{}{}
91-
return fmt.Errorf("no errors sent in %v", d)
92-
case <-beat:
93-
// Allow the timer to be reclaimed by GC.
94-
timer.Stop()
95-
return nil
96-
}
97-
}
98-
99-
go func() {
100-
// Slow down to speed up: do not overload the processor.
101-
ticker := time.NewTicker(100 * time.Microsecond)
102-
for {
103-
select {
104-
case <-stop:
105-
ticker.Stop()
106-
done <- struct{}{}
107-
return
108-
case <-ticker.C:
109-
sent++
110-
Handle(err)
111-
}
112-
113-
select {
114-
case beat <- struct{}{}:
115-
default:
116-
}
73+
causeErr := func() func() {
74+
err := errors.New("")
75+
return func() {
76+
Handle(err)
11777
}
11878
}()
11979

120-
// Wait for the spice to flow
121-
s.Require().NoError(wait(pause), "starting error stream")
80+
causeErr()
81+
s.Require().Len(s.errLogger.Got(), 1)
12282

12383
// Change to another Handler. We are testing this is loss-less.
12484
newErrLogger := new(errLogger)
12585
secondary := &loggingErrorHandler{
12686
l: log.New(newErrLogger, "", 0),
12787
}
12888
SetErrorHandler(secondary)
129-
s.Require().NoError(wait(pause), "switched to new Handler")
130-
131-
// Testing done, stop sending errors.
132-
stop <- struct{}{}
133-
// Ensure we do not lose any straglers.
134-
<-done
13589

136-
got := append(s.errLogger.Got(), newErrLogger.Got()...)
137-
s.Assert().Greater(len(got), 1, "at least 2 errors should have been sent")
138-
s.Assert().Len(got, sent)
90+
causeErr()
91+
s.Assert().Len(s.errLogger.Got(), 1, "original Handler used after delegation")
92+
s.Assert().Len(newErrLogger.Got(), 1, "new Handler not used after delegation")
13993
}
14094

14195
func TestHandlerTestSuite(t *testing.T) {

0 commit comments

Comments
 (0)