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  }