🐛 Fix race condition in TestWaitForErrorFirstErrSet using synctest

This commit is contained in:
Dan Jones 2025-11-13 16:01:53 -06:00
commit 7a2583c8e4

View file

@ -3,6 +3,7 @@ package waiterr_test
import (
"errors"
"testing"
"testing/synctest"
"github.com/nalgeon/be"
@ -104,22 +105,21 @@ func TestWaitForErrorPanic(t *testing.T) {
_ = we.WaitForError()
}
func TestWaitForErrorFirstErrSet(t *testing.T) {
func TestWaitForErrorFirstErrSet(tt *testing.T) {
we := new(waiterr.WaitErr)
expectedErr := errors.New("pre-set error")
// Manually set firstErr (requires reflection or a way to access unexported fields)
// For testing purposes, we can simulate this by calling Go with an error first
we.Go(func() error { return expectedErr })
we.Go(func() error { return errors.New("another error") })
we.Go(func() error { return nil })
synctest.Test(tt, func(t *testing.T) {
we.Go(func() error { return expectedErr })
// synctest.Wait ensures that the gorouting has finished before anything else.
synctest.Wait()
// Wait for a short period to ensure the first error is processed
// In a real scenario, this might be handled by a channel or more robust synchronization
// For this test, we'll rely on the Go routine scheduling to set firstErr quickly
_ = we.WaitForError() // Call once to ensure firstErr is set internally
we.Go(func() error { return errors.New("another error") })
synctest.Wait()
// Now call WaitForError again, expecting it to return the already set firstErr
actualErr := we.WaitForError()
be.Err(t, actualErr, expectedErr)
we.Go(func() error { return nil })
actualErr := we.WaitForError()
be.Err(t, actualErr, expectedErr)
})
}