mirror of
https://github.com/tendermint/tendermint.git
synced 2026-09-20 23:14:37 +00:00
blockchain v2: routines
+ Include an implementaiton of the routines specified in ADR-43
along with a demuxer and some dummy reactor code
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user