fix: honor global flag --debug

Co-authored-by: Roberto Abdelkader Martínez Pérez <robertomartinezp@gmail.com>
This commit is contained in:
pancho horrillo
2020-12-15 18:34:45 +01:00
parent 58fae53e2e
commit 4546fc65b6
7 changed files with 80 additions and 42 deletions
+2
View File
@@ -42,4 +42,6 @@ type Route struct {
// Index is this route position in the server's routes list.
// It is an output field, its value is ignored as input.
Index int `json:"index"`
Debug bool `json:"debug"`
}
+3 -2
View File
@@ -32,7 +32,8 @@ type ServerConfig struct {
CertFile,
ClientCaFile string
ClientAuth bool
ClientAuth,
Debug bool
}
// StartServer Starts one instance of each server in a goroutine and remains listening on a channel for trace events generated by them
@@ -41,7 +42,7 @@ func StartServer(config ServerConfig) {
wg.Add(3)
go control.Run(config.ControlBindAddr, &wg)
go data.Run(config.DataBindAddr, &wg)
go user.Run(config.UserBindAddr, &wg, config.CertFile, config.KeyFile, config.ClientCaFile, config.ClientAuth)
go user.Run(config.UserBindAddr, &wg, config.CertFile, config.KeyFile, config.ClientCaFile, config.ClientAuth, config.Debug)
// Wait for servers signals in order to return
wg.Wait()
+22 -15
View File
@@ -52,23 +52,30 @@ func handlerBuilder(route model.Route) http.Handler {
data.Handlers.Add(h)
defer data.Handlers.Remove(h.ID)
stdOutR, stdOutW, err := os.Pipe()
defer stdOutW.Close()
if err != nil {
log.Println(err)
return
}
stdErrR, stdErrW, err := os.Pipe()
defer stdErrW.Close()
if err != nil {
log.Println(err)
return
if route.Debug {
var stdOutR, stdOutW *os.File
stdOutR, stdOutW, err = os.Pipe()
defer stdOutW.Close()
if err != nil {
log.Println(err)
return
}
var stdErrR, stdErrW *os.File
stdErrR, stdErrW, err = os.Pipe()
defer stdErrW.Close()
if err != nil {
log.Println(err)
return
}
go logStream(h.ID, "stdout", stdOutR)
go logStream(h.ID, "stderr", stdErrR)
err = spawner(h, stdOutW, stdErrW)
} else {
err = spawner(h, nil, nil)
}
go logStream(h.ID, "stdout", stdOutR)
go logStream(h.ID, "stderr", stdErrR)
err = spawner(h, stdOutW, stdErrW)
if err != nil {
log.Println(err)
@@ -1,3 +1,5 @@
// +build !race
/*
* Copyright 2019 Banco Bilbao Vizcaya Argentaria, S.A.
*
@@ -200,16 +202,16 @@ func TestHandlerBuilderRemovesHandlerWhenDone(t *testing.T) {
}
}
func TestHandlerBuilderLogToLogHandler(t *testing.T) {
func TestHandlerBuilderLogToLogHandlerWhenDebugIsEnabled(t *testing.T) {
data.Handlers = data.New()
route := model.Route{}
route := model.Route{Debug: true}
var got string
logHandler = new(bytes.Buffer)
spawner = func(h *model.Handler, out io.Writer, er io.Writer) error {
out.Write([]byte("this is stdout"))
er.Write([]byte("this is stderr"))
_, _ = out.Write([]byte("this is stdout"))
_, _ = er.Write([]byte("this is stderr"))
return nil
}
@@ -229,3 +231,34 @@ func TestHandlerBuilderLogToLogHandler(t *testing.T) {
t.Errorf("Stderr not preserved. Actual: %+q", got)
}
}
func TestHandlerBuilderDoesNotLogToLogHandlerWhenDebugIsDisabled(t *testing.T) {
data.Handlers = data.New()
route := model.Route{Debug: false}
logHandler = new(bytes.Buffer)
spawner = func(h *model.Handler, out io.Writer, er io.Writer) error {
if out != nil {
_, _ = out.Write([]byte("this is stdout"))
}
if er != nil {
_, _ = er.Write([]byte("this is stderr"))
}
return nil
}
handlerBuilder(route).ServeHTTP(nil, nil)
// NOTE: logStream will write stdout and stderr contents eventually.
// We do not have any control the goroutines running logStream, thus we
// cannot use a synchronization primitive to wait for them. Sorry.
time.Sleep(1 * time.Second)
size := logHandler.(*bytes.Buffer).Len()
if size != 0 {
t.Error("Something was logged to stderr with debug=false")
}
}
+8 -1
View File
@@ -34,13 +34,20 @@ var Server = http.Server{
Handler: mux.New(),
}
var DebugEndpoints bool
// Run finishes configuring Server and runs ListenAndServe on it
func Run(bindAddr string, wg *sync.WaitGroup, certFile, keyFile, cliCaFile string, cliAuth bool) {
func Run(bindAddr string, wg *sync.WaitGroup, certFile, keyFile, cliCaFile string, cliAuth, debug bool) {
Server = http.Server{
Addr: bindAddr,
Handler: mux.New(),
}
if debug {
Routes.SetDebug()
}
listener, err := net.Listen("tcp", bindAddr)
if err != nil {
log.Fatal(err)
+6
View File
@@ -27,6 +27,7 @@ import (
type safeRouteList struct {
rs []model.Route
m *sync.RWMutex
globalDebug bool
}
var Routes safeRouteList = New()
@@ -38,9 +39,14 @@ func New() safeRouteList {
}
}
func (srl *safeRouteList) SetDebug() {
srl.globalDebug = true
}
func (srl *safeRouteList) Append(r model.Route) model.Route {
srl.m.Lock()
r.Index = len(srl.rs)
r.Debug = srl.globalDebug || r.Debug
srl.rs = append(srl.rs, r)
srl.m.Unlock()