mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-24 22:32:15 +00:00
+ Modify handleFunc signature to return an error + if an error is returned, terminate the routine + finished channel will then return a termination reason
90 lines
1.5 KiB
Go
90 lines
1.5 KiB
Go
package v2
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
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) {
|
|
events := make(chan Event, 10)
|
|
routine := newRoutine("simpleRoutine", events, simpleHandler)
|
|
|
|
go routine.run()
|
|
go routine.feedback()
|
|
|
|
routine.send(eventA{})
|
|
|
|
routine.wait()
|
|
}
|
|
|
|
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) {
|
|
events := make(chan Event, 10)
|
|
handler := genStatefulHandler(10)
|
|
routine := newRoutine("statefulRoutine", events, handler)
|
|
|
|
go routine.run()
|
|
go routine.feedback()
|
|
|
|
go routine.send(eventA{})
|
|
|
|
routine.wait()
|
|
}
|
|
|
|
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) {
|
|
events := make(chan Event, 10)
|
|
routine := newRoutine("errorRoutine", events, handleWithErrors)
|
|
|
|
go routine.run()
|
|
go func() {
|
|
for {
|
|
routine.send(eventA{})
|
|
time.Sleep(10 * time.Millisecond)
|
|
}
|
|
}()
|
|
routine.send(errEvent{})
|
|
|
|
routine.wait()
|
|
}
|