github.com/buildpack/pack@v0.5.0/internal/logging/logging_test.go (about) 1 package logging 2 3 import ( 4 "bytes" 5 "io" 6 "io/ioutil" 7 "os" 8 "testing" 9 "time" 10 11 "github.com/apex/log" 12 "github.com/heroku/color" 13 "github.com/sclevine/spec" 14 15 h "github.com/buildpack/pack/testhelpers" 16 ) 17 18 const testTime = "2019/05/15 01:01:01.000000" 19 20 func newTestLogger(stdout, stderr io.Writer) *logWithWriters { 21 hnd := &handler{ 22 writer: stdout, 23 timer: func() time.Time { 24 tm, _ := time.Parse(timeFmt, testTime) 25 return tm 26 }, 27 } 28 var lw logWithWriters 29 lw.handler = hnd 30 lw.out = hnd.writer 31 lw.errOut = stderr 32 lw.Logger.Handler = hnd 33 lw.Logger.Level = log.InfoLevel 34 return &lw 35 } 36 37 func mockStd() (*color.Console, func() string) { 38 r, w, _ := os.Pipe() 39 console := color.NewConsole(w) 40 return console, func() string { 41 _ = w.Close() 42 var b bytes.Buffer 43 _, _ = io.Copy(&b, r) 44 _ = r.Close() 45 return b.String() 46 } 47 } 48 49 func TestPackCLILogger(t *testing.T) { 50 spec.Run(t, "PackCLILogger", func(t *testing.T, when spec.G, it spec.S) { 51 var logger *logWithWriters 52 var outCons, errCons *color.Console 53 var fOut func() string 54 55 it.Before(func() { 56 outCons, fOut = mockStd() 57 errCons, _ = mockStd() 58 logger = newTestLogger(outCons, errCons) 59 }) 60 61 it.After(func() { 62 }) 63 64 it("can enable time in logs", func() { 65 logger.WantTime(true) 66 logger.Error("test") 67 expected := "2019/05/15 01:01:01.000000 \x1b[31;1mERROR: \x1b[0mtest\n" 68 h.AssertEq(t, fOut(), expected) 69 }) 70 71 it("it has no time and color by default", func() { 72 logger.Error("test") 73 expected := "\x1b[31;1mERROR: \x1b[0mtest\n" 74 h.AssertEq(t, fOut(), expected) 75 }) 76 77 it("can disable color logs", func() { 78 outCons.DisableColors(true) 79 logger.Error("test") 80 expected := "ERROR: test\n" 81 h.AssertEq(t, fOut(), expected) 82 }) 83 84 it("non-error levels not shown", func() { 85 logger.Info("test") 86 expected := "test\n" 87 h.AssertEq(t, fOut(), expected) 88 }) 89 90 it("will not show verbose messages if quiet", func() { 91 logger.WantQuiet(true) 92 logger.Debug("hello") 93 logger.Debugf("there") 94 logger.Info("test") 95 logger.Warn("oh no") 96 expected := "oh no\n" 97 h.AssertContains(t, fOut(), expected) 98 99 testOut := logger.Writer() 100 h.AssertSameInstance(t, testOut, outCons) 101 102 testOut = logger.InfoErrorWriter() 103 h.AssertSameInstance(t, testOut, ioutil.Discard) 104 }) 105 106 it("will return correct writers", func() { 107 testOut := logger.Writer() 108 h.AssertSameInstance(t, testOut, outCons) 109 testOut = logger.InfoErrorWriter() 110 h.AssertSameInstance(t, testOut, errCons) 111 }) 112 113 it("will convert an empty string to a line feed", func() { 114 logger.Info("") 115 expected := "\n" 116 h.AssertEq(t, fOut(), expected) 117 }) 118 }) 119 }