github.com/getgauge/gauge@v1.6.9/logger/logWriter_test.go (about) 1 // Copyright 2019 ThoughtWorks, Inc. 2 3 /*---------------------------------------------------------------- 4 * Copyright (c) ThoughtWorks, Inc. 5 * Licensed under the Apache License, Version 2.0 6 * See LICENSE in the project root for license information. 7 *----------------------------------------------------------------*/ 8 9 package logger 10 11 import ( 12 "os" 13 "path/filepath" 14 "strings" 15 "sync" 16 "testing" 17 18 "github.com/getgauge/gauge/config" 19 ) 20 21 func TestMain(m *testing.M) { 22 exitCode := m.Run() 23 os.RemoveAll(filepath.Join("_testdata", "logs")) 24 os.Exit(exitCode) 25 } 26 27 func TestLogWriterToOutputInfoLogInCorrectFormat(t *testing.T) { 28 defer tearDown(t) 29 setupLogger("info") 30 l := newLogWriter("js") 31 32 if _, err := l.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"Foo\"}\n")); err != nil { 33 t.Fatalf("Unable to write to logWriter") 34 } 35 36 assertLogContains(t, []string{"[js] [INFO] Foo"}) 37 } 38 39 func TestLogWriterToOutputInfoLogInCorrectFormatWhenNewLinesPresent(t *testing.T) { 40 defer tearDown(t) 41 setupLogger("info") 42 l := newLogWriter("js") 43 44 if _, err := l.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"Foo\"}\n\r\n{\"logLevel\": \"info\", \"message\": \"Bar\"}\n{\"logLevel\": \"info\", \"message\": \"Baz\"}")); err != nil { 45 t.Fatalf("Unable to write to logWriter") 46 } 47 48 assertLogContains(t, []string{"[js] [INFO] Foo", "[js] [INFO] Bar", "[js] [INFO] Baz"}) 49 assertLogDoesNotContains(t, []string{"[js] [INFO] \r"}) 50 } 51 52 func TestLogWriterToOutputInfoLogWithMultipleLines(t *testing.T) { 53 defer tearDown(t) 54 setupLogger("debug") 55 l := newLogWriter("js") 56 57 if _, err := l.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"Foo\"}\n{\"logLevel\": \"debug\", \"message\": \"Bar\"}\n")); err != nil { 58 t.Fatalf("Unable to write to logWriter") 59 } 60 61 assertLogContains(t, []string{"[js] [INFO] Foo", "[js] [DEBUG] Bar"}) 62 } 63 64 func TestLogWriterToLogPlainStrings(t *testing.T) { 65 defer tearDown(t) 66 setupLogger("debug") 67 l := newLogWriter("js") 68 69 if _, err := l.Stdout.Write([]byte("Foo Bar\n")); err != nil { 70 t.Fatalf("Unable to write to logWriter") 71 } 72 73 assertLogContains(t, []string{"Foo Bar"}) 74 } 75 76 func TestUnformattedLogWrittenToStderrShouldBePrefixedWithError(t *testing.T) { 77 defer tearDown(t) 78 setupLogger("debug") 79 l := newLogWriter("js") 80 81 if _, err := l.Stderr.Write([]byte("Foo Bar\n")); err != nil { 82 t.Fatalf("Unable to write to logWriter") 83 } 84 85 assertLogContains(t, []string{"[ERROR]"}) 86 } 87 88 func TestUnformattedLogWrittenToStdoutShouldBePrefixedWithInfo(t *testing.T) { 89 defer tearDown(t) 90 setupLogger("debug") 91 l := newLogWriter("js") 92 93 if _, err := l.Stdout.Write([]byte("Foo Bar\n")); err != nil { 94 t.Fatalf("Unable to write to logWriter") 95 } 96 97 assertLogContains(t, []string{"[INFO]"}) 98 } 99 100 func TestLoggingFromDifferentWritersAtSameTime(t *testing.T) { 101 defer tearDown(t) 102 setupLogger("info") 103 j := newLogWriter("js") 104 h := newLogWriter("html-report") 105 106 var wg sync.WaitGroup 107 var err error 108 wg.Add(5) 109 go func() { 110 Debug(false, "debug msg") 111 wg.Done() 112 }() 113 go func() { 114 _, err = h.Stdout.Write([]byte("{\"logLevel\": \"warning\", \"message\": \"warning msg\"}\n{\"logLevel\": \"debug\", \"message\": \"debug msg\"}\n")) 115 wg.Done() 116 }() 117 go func() { 118 _, err = j.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"info msg\"}\n{\"logLevel\": \"error\", \"message\": \"error msg\"}\n")) 119 wg.Done() 120 }() 121 go func() { 122 _, err = h.Stdout.Write([]byte("{\"logLevel\": \"info\", \"message\": \"info msg\"}\n{\"logLevel\": \"error\", \"message\": \"error msg\"}\n")) 123 wg.Done() 124 }() 125 go func() { 126 _, err = j.Stdout.Write([]byte("{\"logLevel\": \"warning\", \"message\": \"warning msg\"}\n{\"logLevel\": \"debug\", \"message\": \"debug msg\"}\n")) 127 wg.Done() 128 }() 129 wg.Wait() 130 if err != nil { 131 t.Fatalf("Unable to write to logWriter") 132 } 133 134 assertLogContains(t, []string{ 135 "[js] [WARNING] warning msg", 136 "[js] [ERROR] error msg", 137 "[js] [INFO] info msg", 138 "[js] [DEBUG] debug msg", 139 "[html-report] [WARNING] warning msg", 140 "[html-report] [ERROR] error msg", 141 "[html-report] [INFO] info msg", 142 "[html-report] [DEBUG] debug msg", 143 "[Gauge] [DEBUG] debug msg", 144 }) 145 } 146 147 func tearDown(t *testing.T) { 148 config.ProjectRoot = "" 149 initialized = false 150 if err := os.Truncate(ActiveLogFile, 0); err != nil { 151 t.Logf("Could not truncate file") 152 } 153 154 } 155 156 func setupLogger(level string) { 157 config.ProjectRoot, _ = filepath.Abs("_testdata") 158 Initialize(false, "info", CLI) 159 } 160 161 func newLogWriter(loggerID string) *LogWriter { 162 f, _ := os.OpenFile(ActiveLogFile, os.O_RDWR, 0) 163 return &LogWriter{ 164 Stderr: Writer{ShouldWriteToStdout: false, stream: 0, LoggerID: loggerID, File: f, isErrorStream: true}, 165 Stdout: Writer{ShouldWriteToStdout: false, stream: 0, LoggerID: loggerID, File: f}, 166 } 167 } 168 169 func assertLogContains(t *testing.T, want []string) { 170 got, err := os.ReadFile(ActiveLogFile) 171 if err != nil { 172 t.Fatalf("Unable to read log file. Error: %s", err.Error()) 173 } 174 for _, w := range want { 175 if !strings.Contains(string(got), w) { 176 t.Errorf("Expected %s to contain %s.", string(got), w) 177 } 178 } 179 } 180 181 func assertLogDoesNotContains(t *testing.T, want []string) { 182 got, err := os.ReadFile(ActiveLogFile) 183 if err != nil { 184 t.Fatalf("Unable to read log file. Error: %s", err.Error()) 185 } 186 for _, w := range want { 187 if strings.Contains(string(got), w) { 188 t.Errorf("Expected %s to not contain %s.", string(got), w) 189 } 190 } 191 }