make listener configurable - and use for delaying client access in tests

This commit is contained in:
Helmut Merz 2023-08-12 19:10:24 +02:00
parent eef9fba161
commit a8e266e039
5 changed files with 43 additions and 25 deletions

View file

@ -42,11 +42,15 @@ func (cfg *defcfg) Add(c ...lib.Config) {
cfg.children = append(cfg.children, c...) cfg.children = append(cfg.children, c...)
} }
func (cfg *defcfg) Starter() lib.StartProc { func (cfg *defcfg) Starter() lib.Proc {
return DefaultStart return DefaultStart
} }
func (cfg *defcfg) Step() lib.StepProc { func (cfg *defcfg) Listener() lib.Proc {
return DefaultListen
}
func (cfg *defcfg) Step() lib.Step {
return DefaultStep return DefaultStep
} }
@ -54,7 +58,7 @@ func (cfg *defcfg) MessageHandler() lib.MessageHandler {
return DefaultMsgHandler return DefaultMsgHandler
} }
func (cfg *defcfg) DoneHandler() lib.StepProc { func (cfg *defcfg) DoneHandler() lib.Step {
return DefaultDoneHandler return DefaultDoneHandler
} }
@ -70,17 +74,22 @@ type BaseCfg = base
type base struct { type base struct {
*defcfg *defcfg
starter lib.StartProc starter lib.Proc
step lib.StepProc listener lib.Proc
step lib.Step
msgHandler lib.MessageHandler msgHandler lib.MessageHandler
doneHandler lib.StepProc doneHandler lib.Step
} }
func (cfg *base) Starter() lib.StartProc { func (cfg *base) Starter() lib.Proc {
return cfg.starter return cfg.starter
} }
func (cfg *base) Step() lib.StepProc { func (cfg *base) Listener() lib.Proc {
return cfg.listener
}
func (cfg *base) Step() lib.Step {
return cfg.step return cfg.step
} }
@ -88,13 +97,18 @@ func (cfg *base) MessageHandler() lib.MessageHandler {
return cfg.msgHandler return cfg.msgHandler
} }
func (cfg *base) DoneHandler() lib.StepProc { func (cfg *base) DoneHandler() lib.Step {
return cfg.doneHandler return cfg.doneHandler
} }
// implementation-specific methods and functions // implementation-specific methods and functions
func (cfg *base) WithStep(step lib.StepProc) *base { func (cfg *base) WithListener(listener lib.Proc) *base {
cfg.listener = listener
return cfg
}
func (cfg *base) WithStep(step lib.Step) *base {
cfg.step = step cfg.step = step
return cfg return cfg
} }
@ -104,17 +118,18 @@ func (cfg *base) WithMessageHandler(hdlr lib.MessageHandler) *base {
return cfg return cfg
} }
func (cfg *base) WithDoneHandler(hdlr lib.StepProc) *base { func (cfg *base) WithDoneHandler(hdlr lib.Step) *base {
cfg.doneHandler = hdlr cfg.doneHandler = hdlr
return cfg return cfg
} }
func Base(name string, starter lib.StartProc) *base { func Base(name string, starter lib.Proc) *base {
return &base{ return &base{
defcfg: &defcfg{ defcfg: &defcfg{
name: name, name: name,
}, },
starter: starter, starter: starter,
listener: DefaultListen,
step: DefaultStep, step: DefaultStep,
msgHandler: DefaultMsgHandler, msgHandler: DefaultMsgHandler,
doneHandler: DefaultDoneHandler, doneHandler: DefaultDoneHandler,
@ -122,10 +137,11 @@ func Base(name string, starter lib.StartProc) *base {
} }
// will be set by core.init() // will be set by core.init()
var DefaultStart lib.StartProc var DefaultStart lib.Proc
var DefaultStep lib.StepProc var DefaultListen lib.Proc
var DefaultStep lib.Step
var DefaultMsgHandler lib.MessageHandler var DefaultMsgHandler lib.MessageHandler
var DefaultDoneHandler lib.StepProc var DefaultDoneHandler lib.Step
// action configuration // action configuration

View file

@ -12,7 +12,7 @@ import (
func Delayed(proc lib.Proc, delay time.Duration) lib.Proc { func Delayed(proc lib.Proc, delay time.Duration) lib.Proc {
return func(ctx lib.Context) { return func(ctx lib.Context) {
logging.Debug(ctx).Int("delay", int(delay)).Msg("lib.Delayed") logging.Debug(ctx).Int("delay", int(delay)).Msg("core.Delayed")
time.Sleep(delay * time.Millisecond) time.Sleep(delay * time.Millisecond)
proc(ctx) proc(ctx)
} }
@ -22,7 +22,7 @@ func None(_ lib.Context) {}
func Start(ctx lib.Context) { func Start(ctx lib.Context) {
logging.Debug(ctx).Msg("core.Start") logging.Debug(ctx).Msg("core.Start")
lib.RunCtx(ctx, Listen) lib.RunCtx(ctx, ctx.Config().Listener())
} }
func Listen(ctx lib.Context) { func Listen(ctx lib.Context) {
@ -72,6 +72,7 @@ func Recover(ctx lib.Context, txt string) interface{} {
func init() { func init() {
config.DefaultStart = Start // avoid import cycle config.DefaultStart = Start // avoid import cycle
config.DefaultListen = Listen
config.DefaultStep = Step config.DefaultStep = Step
config.DefaultMsgHandler = HandleMessage config.DefaultMsgHandler = HandleMessage
config.DefaultDoneHandler = HandleDone config.DefaultDoneHandler = HandleDone

View file

@ -90,8 +90,7 @@ type ActionSpec interface {
// procedures and handlers // procedures and handlers
type Proc = func(Context) type Proc = func(Context)
type StartProc = Proc type Step = func(Context) bool
type StepProc = func(Context) bool
type MessageHandler = func(Context, Message) bool type MessageHandler = func(Context, Message) bool
type ActionHandler = func(Action) bool type ActionHandler = func(Action) bool
@ -100,10 +99,11 @@ type ActionHandler = func(Action) bool
type Config interface { type Config interface {
Name() string Name() string
SetName(string) SetName(string)
Starter() StartProc Starter() Proc
Step() StepProc Listener() Proc
Step() Step
MessageHandler() MessageHandler MessageHandler() MessageHandler
DoneHandler() StepProc DoneHandler() Step
Actions() []ActionConfig Actions() []ActionConfig
AddAction(string, ...ActionSpec) AddAction(string, ...ActionSpec)
Children() []Config Children() []Config

View file

@ -45,7 +45,7 @@ func Serve(ctx lib.Context) {
} }
srv := &http.Server{Addr: cfg.Addr, Handler: r} srv := &http.Server{Addr: cfg.Addr, Handler: r}
ctx.WithState(&ServerState{server: srv}) ctx.WithState(&ServerState{server: srv})
logging.Debug(ctx).Str("addr", cfg.Addr).Msg("server.Serve") logging.Info(ctx).Str("addr", cfg.Addr).Msg("server.Serve")
lib.RunCtx(ctx, func(ctx lib.Context) { lib.RunCtx(ctx, func(ctx lib.Context) {
srv.ListenAndServe() srv.ListenAndServe()
}) })

View file

@ -35,8 +35,9 @@ func Config() lib.Config {
server_c.AddRoute("/api", server.MsgHandler("demo", nil, "test-receiver")) server_c.AddRoute("/api", server.MsgHandler("demo", nil, "test-receiver"))
test_client := &client.Cfg{ test_client := &client.Cfg{
BaseCfg: b("test-client", core.Delayed(core.Start, 50)), BaseCfg: b("test-client", core.Start).
Url: ovr("http://localhost:8123/api", SERVER_URL), WithListener(core.Delayed(core.Listen, 50)),
Url: ovr("http://localhost:8123/api", SERVER_URL),
} }
test_client.AddAction("demo", action.Base(client.Send)) test_client.AddAction("demo", action.Base(client.Send))