github.com/YousefHaggyHeroku/pack@v1.5.5/internal/logging/logging_test.go (about) 1 package logging 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "testing" 8 "time" 9 10 "github.com/apex/log" 11 "github.com/heroku/color" 12 "github.com/sclevine/spec" 13 "github.com/sclevine/spec/report" 14 15 "github.com/YousefHaggyHeroku/pack/internal/style" 16 "github.com/YousefHaggyHeroku/pack/logging" 17 h "github.com/YousefHaggyHeroku/pack/testhelpers" 18 ) 19 20 const ( 21 testTime = "2019/05/15 01:01:01.000000" 22 ) 23 24 func TestLogWithWriters(t *testing.T) { 25 spec.Run(t, "LogWithWriters", testLogWithWriters, spec.Parallel(), spec.Report(report.Terminal{})) 26 } 27 28 func testLogWithWriters(t *testing.T, when spec.G, it spec.S) { 29 var ( 30 logger *LogWithWriters 31 outCons, errCons *color.Console 32 fOut, fErr func() string 33 ) 34 35 it.Before(func() { 36 outCons, fOut = h.MockWriterAndOutput() 37 errCons, fErr = h.MockWriterAndOutput() 38 logger = NewLogWithWriters(outCons, errCons, WithClock(func() time.Time { 39 clock, _ := time.Parse(timeFmt, testTime) 40 return clock 41 })) 42 }) 43 44 when("default", func() { 45 it("has no time and color", func() { 46 logger.Info(color.HiBlueString("test")) 47 h.AssertEq(t, fOut(), "\x1b[94mtest\x1b[0m\n") 48 }) 49 50 it("will not log debug messages", func() { 51 logger.Debug("debug_") 52 logger.Debugf("debugf") 53 54 output := fOut() 55 h.AssertNotContains(t, output, "debug_\n") 56 h.AssertNotContains(t, output, "debugf\n") 57 }) 58 59 it("logs info and warning messages to standard writer", func() { 60 logger.Info("info_") 61 logger.Infof("infof") 62 logger.Warn("warn_") 63 logger.Warnf("warnf") 64 65 output := fOut() 66 h.AssertContains(t, output, "info_\n") 67 h.AssertContains(t, output, "infof\n") 68 h.AssertContains(t, output, "warn_\n") 69 h.AssertContains(t, output, "warnf\n") 70 }) 71 72 it("logs error to error writer", func() { 73 logger.Error("error_") 74 logger.Errorf("errorf") 75 76 output := fErr() 77 h.AssertContains(t, output, "error_\n") 78 h.AssertContains(t, output, "errorf\n") 79 }) 80 81 it("will return correct writers", func() { 82 h.AssertSameInstance(t, logger.Writer(), outCons) 83 h.AssertSameInstance(t, logger.WriterForLevel(logging.DebugLevel), ioutil.Discard) 84 assertLogWriterHasOut(t, logger.WriterForLevel(logging.InfoLevel), outCons) 85 assertLogWriterHasOut(t, logger.WriterForLevel(logging.ErrorLevel), errCons) 86 }) 87 88 it("is only verbose for debug level", func() { 89 h.AssertFalse(t, logger.IsVerbose()) 90 91 logger.Level = log.DebugLevel 92 h.AssertTrue(t, logger.IsVerbose()) 93 }) 94 }) 95 96 when("time is set to true", func() { 97 it("time is logged in info", func() { 98 logger.WantTime(true) 99 logger.Info("test") 100 h.AssertEq(t, fOut(), "2019/05/15 01:01:01.000000 test\n") 101 }) 102 103 it("time is logged in error", func() { 104 logger.WantTime(true) 105 logger.Error("test") 106 h.AssertEq(t, fErr(), fmt.Sprintf("2019/05/15 01:01:01.000000 %stest\n", style.Error("ERROR: "))) 107 }) 108 109 when("WriterForLevel", func() { 110 it("time is logged in info", func() { 111 logger.WantTime(true) 112 writer := logger.WriterForLevel(logging.InfoLevel) 113 writer.Write([]byte("test\n")) 114 h.AssertEq(t, fOut(), "2019/05/15 01:01:01.000000 test\n") 115 }) 116 117 it("time is logged in error", func() { 118 logger.WantTime(true) 119 writer := logger.WriterForLevel(logging.ErrorLevel) 120 writer.Write([]byte("test\n")) 121 // The writer doesn't prepend the level 122 h.AssertEq(t, fErr(), "2019/05/15 01:01:01.000000 test\n") 123 }) 124 }) 125 }) 126 127 when("colors are disabled", func() { 128 it("don't display colors", func() { 129 outCons.DisableColors(true) 130 logger.Info(color.HiBlueString("test")) 131 h.AssertEq(t, fOut(), "test\n") 132 }) 133 }) 134 135 when("quiet is set to true", func() { 136 it.Before(func() { 137 logger.WantQuiet(true) 138 }) 139 140 it("will not log debug or info messages", func() { 141 logger.Debug("debug_") 142 logger.Debugf("debugf") 143 logger.Info("info_") 144 logger.Infof("infof") 145 146 output := fOut() 147 h.AssertNotContains(t, output, "debug_\n") 148 h.AssertNotContains(t, output, "debugf\n") 149 h.AssertNotContains(t, output, "info_\n") 150 h.AssertNotContains(t, output, "infof\n") 151 }) 152 153 it("logs warnings to standard writer", func() { 154 logger.Warn("warn_") 155 logger.Warnf("warnf") 156 157 output := fOut() 158 h.AssertContains(t, output, "warn_\n") 159 h.AssertContains(t, output, "warnf\n") 160 }) 161 162 it("logs error to error writer", func() { 163 logger.Error("error_") 164 logger.Errorf("errorf") 165 166 output := fErr() 167 h.AssertContains(t, output, "error_\n") 168 h.AssertContains(t, output, "errorf\n") 169 }) 170 171 it("will return correct writers", func() { 172 h.AssertSameInstance(t, logger.Writer(), outCons) 173 h.AssertSameInstance(t, logger.WriterForLevel(logging.DebugLevel), ioutil.Discard) 174 h.AssertSameInstance(t, logger.WriterForLevel(logging.InfoLevel), ioutil.Discard) 175 assertLogWriterHasOut(t, logger.WriterForLevel(logging.WarnLevel), outCons) 176 assertLogWriterHasOut(t, logger.WriterForLevel(logging.ErrorLevel), errCons) 177 }) 178 }) 179 180 when("verbose is set to true", func() { 181 it.Before(func() { 182 logger.WantVerbose(true) 183 }) 184 185 it("all messages are logged", func() { 186 logger.Debug("debug_") 187 logger.Debugf("debugf") 188 logger.Info("info_") 189 logger.Infof("infof") 190 logger.Warn("warn_") 191 logger.Warnf("warnf") 192 193 output := fOut() 194 h.AssertContains(t, output, "debug_") 195 h.AssertContains(t, output, "debugf") 196 h.AssertContains(t, output, "info_") 197 h.AssertContains(t, output, "infof") 198 h.AssertContains(t, output, "warn_") 199 h.AssertContains(t, output, "warnf") 200 }) 201 202 it("logs error to error writer", func() { 203 logger.Error("error_") 204 logger.Errorf("errorf") 205 206 output := fErr() 207 h.AssertContains(t, output, "error_\n") 208 h.AssertContains(t, output, "errorf\n") 209 }) 210 211 it("will return correct writers", func() { 212 h.AssertSameInstance(t, logger.Writer(), outCons) 213 assertLogWriterHasOut(t, logger.WriterForLevel(logging.DebugLevel), outCons) 214 assertLogWriterHasOut(t, logger.WriterForLevel(logging.InfoLevel), outCons) 215 assertLogWriterHasOut(t, logger.WriterForLevel(logging.WarnLevel), outCons) 216 assertLogWriterHasOut(t, logger.WriterForLevel(logging.ErrorLevel), errCons) 217 }) 218 }) 219 220 it("will convert an empty string to a line feed", func() { 221 logger.Info("") 222 expected := "\n" 223 h.AssertEq(t, fOut(), expected) 224 }) 225 } 226 227 func assertLogWriterHasOut(t *testing.T, writer io.Writer, out io.Writer) { 228 logWriter, ok := writer.(*LogWriter) 229 h.AssertTrue(t, ok) 230 h.AssertSameInstance(t, logWriter.out, out) 231 }