mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-25 06:42:16 +00:00
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()
|
||
|
}
|