tendermint/blockchain/v2/routine_test.go
Sean Braithwaite 9d84994d33 Stopping & Termination:
+ Modify handleFunc signature to return an error
    + if an error is returned, terminate the routine
    + finished channel will then return a termination reason
2019-07-31 13:58:21 +02:00

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()
}