From 58fae53e2e1477232b0574ba85fe1de19a45263c Mon Sep 17 00:00:00 2001 From: pancho horrillo Date: Tue, 15 Dec 2020 17:17:17 +0100 Subject: [PATCH] test: logStream() behaves correctly like a good kiddo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Roberto Abdelkader Martínez Pérez --- internal/server/user/mux/handlerbuilder.go | 4 +- .../server/user/mux/handlerbuilder_test.go | 67 +++++++------------ 2 files changed, 29 insertions(+), 42 deletions(-) diff --git a/internal/server/user/mux/handlerbuilder.go b/internal/server/user/mux/handlerbuilder.go index bd5ca6d..79f68a3 100644 --- a/internal/server/user/mux/handlerbuilder.go +++ b/internal/server/user/mux/handlerbuilder.go @@ -20,6 +20,7 @@ import ( "bufio" "log" "net/http" + "io" "os" "github.com/google/uuid" @@ -31,6 +32,7 @@ import ( var spawner = spawn.Spawn var idGenerator = uuid.NewUUID +var logHandler io.Writer = os.Stdout func handlerBuilder(route model.Route) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { @@ -77,7 +79,7 @@ func handlerBuilder(route model.Route) http.Handler { func logStream(handlerId string, streamName string, stream *os.File) { defer stream.Close() - execLog := log.New(os.Stdout, "", log.Ldate|log.Ltime|log.LUTC|log.Lmicroseconds) + execLog := log.New(logHandler, "", log.Ldate|log.Ltime|log.LUTC|log.Lmicroseconds) scanner := bufio.NewScanner(stream) for scanner.Scan() { execLog.Printf("%s %s: %s", handlerId, streamName, scanner.Text()) diff --git a/internal/server/user/mux/handlerbuilder_test.go b/internal/server/user/mux/handlerbuilder_test.go index 5f62361..35851c7 100644 --- a/internal/server/user/mux/handlerbuilder_test.go +++ b/internal/server/user/mux/handlerbuilder_test.go @@ -17,12 +17,15 @@ package mux import ( + "bytes" "errors" "io" "net/http" "net/http/httptest" "reflect" + "strings" "testing" + "time" "github.com/google/uuid" @@ -197,50 +200,32 @@ func TestHandlerBuilderRemovesHandlerWhenDone(t *testing.T) { } } -// func TestCreateLogMsgAdsPrefixInfo(t *testing.T) { -// expected := "FOO" +func TestHandlerBuilderLogToLogHandler(t *testing.T) { + data.Handlers = data.New() + route := model.Route{} + var got string -// msg := createLogMsg(expected, bytes.Buffer{}, bytes.Buffer{}) + logHandler = new(bytes.Buffer) -// if msg.Prefix != expected { -// t.Errorf("LogMsg doesn't contain expected Prefix. Expected: %s, got: %s", expected, msg.Prefix) -// } -// } + spawner = func(h *model.Handler, out io.Writer, er io.Writer) error { + out.Write([]byte("this is stdout")) + er.Write([]byte("this is stderr")) -// func TestCreateLogMsgAdsStdOutInfo(t *testing.T) { -// expected := "FOO\nBAR" -// out := bytes.Buffer{} -// out.WriteString(expected) + return nil + } -// msg := createLogMsg("", out, bytes.Buffer{}) + handlerBuilder(route).ServeHTTP(nil, nil) -// if strings.Join(msg.Messages, "\n") != expected { -// t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) -// } -// } + // 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) -// func TestCreateLogMsgAdsStdErrInfo(t *testing.T) { -// expected := "FOO\nBAR" -// err := bytes.Buffer{} -// err.WriteString(expected) - -// msg := createLogMsg("", bytes.Buffer{}, err) - -// if strings.Join(msg.Messages, "\n") != expected { -// t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) -// } -// } - -// func TestCreateLogMsgAdsStdOutAndStdErrInfo(t *testing.T) { -// expected := "FOO\nBAR\nFOO BAZ" -// out := bytes.Buffer{} -// out.WriteString("FOO\nBAR\n") -// err := bytes.Buffer{} -// err.WriteString("FOO BAZ") - -// msg := createLogMsg("", out, err) - -// if strings.Join(msg.Messages, "\n") != expected { -// t.Errorf("LogMsg doesn't contain expected payload. Expected: %s, got: %s", expected, msg.Prefix) -// } -// } + got = logHandler.(*bytes.Buffer).String() + if ! strings.Contains(got, "this is stdout") { + t.Errorf("Stdout not preserved. Actual: %+q", got) + } + if ! strings.Contains(got, "this is stderr") { + t.Errorf("Stderr not preserved. Actual: %+q", got) + } +}