Skip to content

Commit 2e02ce3

Browse files
committed
Timeout mw: fix datarace in tests when we are getting data from buffer. Run each test in their own server so multiple tests cases will not cause datarace getting data out of logger buffer.
1 parent 6df1c35 commit 2e02ce3

File tree

1 file changed

+30
-32
lines changed

1 file changed

+30
-32
lines changed

middleware/timeout_test.go

Lines changed: 30 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -362,40 +362,38 @@ func TestTimeoutWithFullEchoStack(t *testing.T) {
362362
},
363363
}
364364

365-
e := echo.New()
366-
367-
buf := new(bytes.Buffer)
368-
e.Logger.SetOutput(buf)
369-
370-
// NOTE: timeout middleware is first as it changes Response.Writer and causes data race for logger middleware if it is not first
371-
// FIXME: I have no idea how to fix this without adding mutexes.
372-
e.Use(TimeoutWithConfig(TimeoutConfig{
373-
Timeout: 15 * time.Millisecond,
374-
}))
375-
e.Use(Logger())
376-
e.Use(Recover())
377-
378-
e.GET("/", func(c echo.Context) error {
379-
var delay time.Duration
380-
if err := echo.QueryParamsBinder(c).Duration("delay", &delay).BindError(); err != nil {
381-
return err
382-
}
383-
if delay > 0 {
384-
time.Sleep(delay)
385-
}
386-
return c.JSON(http.StatusTeapot, map[string]string{"message": "OK"})
387-
})
388-
389-
server, addr, err := startServer(e)
390-
if err != nil {
391-
assert.NoError(t, err)
392-
return
393-
}
394-
defer server.Close()
395-
396365
for _, tc := range testCases {
397366
t.Run(tc.name, func(t *testing.T) {
398-
buf.Reset() // this is design this can not be run in parallel
367+
e := echo.New()
368+
369+
buf := new(bytes.Buffer)
370+
e.Logger.SetOutput(buf)
371+
372+
// NOTE: timeout middleware is first as it changes Response.Writer and causes data race for logger middleware if it is not first
373+
// FIXME: I have no idea how to fix this without adding mutexes.
374+
e.Use(TimeoutWithConfig(TimeoutConfig{
375+
Timeout: 15 * time.Millisecond,
376+
}))
377+
e.Use(Logger())
378+
e.Use(Recover())
379+
380+
e.GET("/", func(c echo.Context) error {
381+
var delay time.Duration
382+
if err := echo.QueryParamsBinder(c).Duration("delay", &delay).BindError(); err != nil {
383+
return err
384+
}
385+
if delay > 0 {
386+
time.Sleep(delay)
387+
}
388+
return c.JSON(http.StatusTeapot, map[string]string{"message": "OK"})
389+
})
390+
391+
server, addr, err := startServer(e)
392+
if err != nil {
393+
assert.NoError(t, err)
394+
return
395+
}
396+
defer server.Close()
399397

400398
res, err := http.Get(fmt.Sprintf("http://%v%v", addr, tc.whenPath))
401399
if err != nil {

0 commit comments

Comments
 (0)