2018-07-03 18:18:51 +00:00
|
|
|
// Package mtest implements functionality useful for testing.
|
|
|
|
package mtest
|
2019-02-03 01:58:18 +00:00
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/mediocregopher/mediocre-go-lib/mcfg"
|
|
|
|
"github.com/mediocregopher/mediocre-go-lib/mctx"
|
|
|
|
"github.com/mediocregopher/mediocre-go-lib/mlog"
|
|
|
|
"github.com/mediocregopher/mediocre-go-lib/mrun"
|
|
|
|
)
|
|
|
|
|
|
|
|
type ctxKey int
|
|
|
|
|
|
|
|
// NewCtx creates and returns a root Context suitable for testing.
|
|
|
|
func NewCtx() mctx.Context {
|
|
|
|
ctx := mctx.New()
|
|
|
|
mlog.From(ctx).SetMaxLevel(mlog.DebugLevel)
|
|
|
|
return ctx
|
|
|
|
}
|
|
|
|
|
|
|
|
// SetEnv sets the given environment variable on the given Context, such that it
|
|
|
|
// will be used as if it was a real environment variable when the Run function
|
|
|
|
// from this package is called.
|
|
|
|
func SetEnv(ctx mctx.Context, key, val string) {
|
|
|
|
mctx.GetSetMutableValue(ctx, false, ctxKey(0), func(i interface{}) interface{} {
|
|
|
|
m, _ := i.(map[string]string)
|
|
|
|
if m == nil {
|
|
|
|
m = map[string]string{}
|
|
|
|
}
|
|
|
|
m[key] = val
|
|
|
|
return m
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// Run performs the following using the given Context:
|
|
|
|
//
|
|
|
|
// - Calls mcfg.Populate using any variables set by SetEnv.
|
|
|
|
//
|
|
|
|
// - Calls mrun.Start
|
|
|
|
//
|
|
|
|
// - Calls the passed in body callback.
|
|
|
|
//
|
|
|
|
// - Calls mrun.Stop
|
|
|
|
//
|
|
|
|
// The intention is that Run is used within a test on a Context created via
|
|
|
|
// NewCtx, after any setup functions have been called (e.g. mnet.MListen).
|
|
|
|
func Run(ctx mctx.Context, t *testing.T, body func()) {
|
|
|
|
envMap, _ := mctx.MutableValue(ctx, ctxKey(0)).(map[string]string)
|
|
|
|
env := make([]string, 0, len(envMap))
|
|
|
|
for key, val := range envMap {
|
|
|
|
env = append(env, key+"="+val)
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := mcfg.Populate(ctx, mcfg.SourceEnv{Env: env}); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
} else if err := mrun.Start(ctx); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
body()
|
|
|
|
|
|
|
|
if err := mrun.Stop(ctx); err != nil {
|
|
|
|
t.Fatal(err)
|
|
|
|
}
|
|
|
|
}
|