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  }