🐛 Fix race condition in TestWaitForErrorFirstErrSet using synctest
This commit is contained in:
parent
d49f548618
commit
7a2583c8e4
1 changed files with 13 additions and 13 deletions
|
|
@ -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)
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue