package v2 import ( "fmt" "testing" "time" "github.com/stretchr/testify/assert" ) type eventA struct{} type eventB struct{} var done = fmt.Errorf("done") func simpleHandler(event Event) (Events, error) { switch event.(type) { case eventA: return Events{eventB{}}, nil case eventB: return Events{routineFinished{}}, done } return Events{}, nil } func TestRoutine(t *testing.T) { routine := newRoutine("simpleRoutine", simpleHandler) assert.False(t, routine.isRunning(), "expected an initialized routine to not be running") go routine.run() go routine.feedback() for { if routine.isRunning() { break } time.Sleep(10 * time.Millisecond) } routine.send(eventA{}) routine.stop() } func TesRoutineSend(t *testing.T) { routine := newRoutine("simpleRoutine", simpleHandler) assert.False(t, routine.send(eventA{}), "expected sending to an unstarted routine to fail") go routine.run() go routine.feedback() for { if routine.isRunning() { break } time.Sleep(10 * time.Millisecond) } assert.True(t, routine.send(eventA{}), "expected sending to a running routine to succeed") routine.stop() assert.False(t, routine.send(eventA{}), "expected sending to a stopped routine to fail") } func genStatefulHandler(maxCount int) handleFunc { counter := 0 return func(event Event) (Events, error) { switch event.(type) { case eventA: counter += 1 if counter >= maxCount { return Events{}, done } return Events{eventA{}}, nil } return Events{}, nil } } func TestStatefulRoutine(t *testing.T) { handler := genStatefulHandler(10) routine := newRoutine("statefulRoutine", handler) go routine.run() go routine.feedback() for { if routine.isRunning() { break } time.Sleep(10 * time.Millisecond) } go routine.send(eventA{}) routine.stop() } func handleWithErrors(event Event) (Events, error) { switch event.(type) { case eventA: return Events{}, nil case errEvent: return Events{}, done } return Events{}, nil } func TestErrorSaturation(t *testing.T) { routine := newRoutine("errorRoutine", handleWithErrors) go routine.run() go func() { for { routine.send(eventA{}) time.Sleep(10 * time.Millisecond) } }() for { if routine.isRunning() { break } time.Sleep(10 * time.Millisecond) } assert.True(t, routine.send(errEvent{}), "expected send to succeed even when saturated") routine.wait() }