github.com/mongodb/grip@v0.0.0-20240213223901-f906268d82b9/standard_test.go (about)

     1  package grip
     2  
     3  import (
     4  	"fmt"
     5  	"testing"
     6  
     7  	"github.com/mongodb/grip/level"
     8  	"github.com/mongodb/grip/logging"
     9  	"github.com/mongodb/grip/message"
    10  	"github.com/mongodb/grip/send"
    11  	"github.com/stretchr/testify/suite"
    12  )
    13  
    14  const testMessage = "hello world"
    15  
    16  type (
    17  	basicMethod func(interface{})
    18  	lnMethod    func(...interface{})
    19  	fMethod     func(string, ...interface{})
    20  	whenMethod  func(bool, interface{})
    21  )
    22  
    23  type LoggingMethodSuite struct {
    24  	logger        Journaler
    25  	loggingSender *send.InternalSender
    26  	stdSender     *send.InternalSender
    27  	suite.Suite
    28  }
    29  
    30  func TestLoggingMethodSuite(t *testing.T) {
    31  	suite.Run(t, new(LoggingMethodSuite))
    32  }
    33  
    34  func (s *LoggingMethodSuite) SetupTest() {
    35  	s.logger = logging.NewGrip("test")
    36  
    37  	s.stdSender = send.MakeInternalLogger()
    38  	s.NoError(SetSender(s.stdSender))
    39  	s.Exactly(GetSender(), s.stdSender)
    40  
    41  	s.loggingSender = send.MakeInternalLogger()
    42  	s.NoError(s.logger.SetSender(s.loggingSender))
    43  	s.Exactly(s.logger.GetSender(), s.loggingSender)
    44  }
    45  
    46  func (s *LoggingMethodSuite) TestWhenMethods() {
    47  	cases := map[string][]whenMethod{
    48  		"emergency": {EmergencyWhen, s.logger.EmergencyWhen},
    49  		"alert":     {AlertWhen, s.logger.AlertWhen},
    50  		"critical":  {CriticalWhen, s.logger.CriticalWhen},
    51  		"error":     {ErrorWhen, s.logger.ErrorWhen},
    52  		"warning":   {WarningWhen, s.logger.WarningWhen},
    53  		"notice":    {NoticeWhen, s.logger.NoticeWhen},
    54  		"info":      {InfoWhen, s.logger.InfoWhen},
    55  		"debug":     {DebugWhen, s.logger.DebugWhen},
    56  	}
    57  
    58  	for kind, loggers := range cases {
    59  		s.Len(loggers, 2)
    60  		loggers[0](true, testMessage)
    61  		loggers[1](true, testMessage)
    62  
    63  		s.True(s.loggingSender.HasMessage())
    64  		s.True(s.stdSender.HasMessage())
    65  		lgrMsg := s.loggingSender.GetMessage()
    66  		s.True(lgrMsg.Logged)
    67  		stdMsg := s.stdSender.GetMessage()
    68  		s.True(stdMsg.Logged)
    69  
    70  		s.Equal(lgrMsg.Rendered, stdMsg.Rendered,
    71  			fmt.Sprintf("%s: \n\tlogger: %+v \n\tstandard: %+v", kind, lgrMsg, stdMsg))
    72  
    73  		loggers[0](false, testMessage)
    74  		loggers[1](false, testMessage)
    75  
    76  		lgrMsg = s.loggingSender.GetMessage()
    77  		s.False(lgrMsg.Logged)
    78  		stdMsg = s.stdSender.GetMessage()
    79  		s.False(stdMsg.Logged)
    80  
    81  	}
    82  }
    83  
    84  func (s *LoggingMethodSuite) TestBasicMethod() {
    85  	cases := map[string][]basicMethod{
    86  		"emergency": {Emergency, s.logger.Emergency},
    87  		"alert":     {Alert, s.logger.Alert},
    88  		"critical":  {Critical, s.logger.Critical},
    89  		"error":     {Error, s.logger.Error},
    90  		"warning":   {Warning, s.logger.Warning},
    91  		"notice":    {Notice, s.logger.Notice},
    92  		"info":      {Info, s.logger.Info},
    93  		"debug":     {Debug, s.logger.Debug},
    94  	}
    95  
    96  	inputs := []interface{}{true, false, []string{"a", "b"}, message.Fields{"a": 1}, 1, "foo"}
    97  
    98  	for kind, loggers := range cases {
    99  		s.Len(loggers, 2)
   100  		s.False(s.loggingSender.HasMessage())
   101  		s.False(s.stdSender.HasMessage())
   102  
   103  		for _, msg := range inputs {
   104  			loggers[0](msg)
   105  			loggers[1](msg)
   106  
   107  			s.True(s.loggingSender.HasMessage())
   108  			s.True(s.stdSender.HasMessage())
   109  			lgrMsg := s.loggingSender.GetMessage()
   110  			stdMsg := s.stdSender.GetMessage()
   111  			s.Equal(lgrMsg.Rendered, stdMsg.Rendered,
   112  				fmt.Sprintf("%s: \n\tlogger: %+v \n\tstandard: %+v", kind, lgrMsg, stdMsg))
   113  		}
   114  	}
   115  
   116  }
   117  
   118  func (s *LoggingMethodSuite) TestlnMethods() {
   119  	cases := map[string][]lnMethod{
   120  		"emergency": {Emergencyln, s.logger.Emergencyln},
   121  		"alert":     {Alertln, s.logger.Alertln},
   122  		"critical":  {Criticalln, s.logger.Criticalln},
   123  		"error":     {Errorln, s.logger.Errorln},
   124  		"warning":   {Warningln, s.logger.Warningln},
   125  		"notice":    {Noticeln, s.logger.Noticeln},
   126  		"info":      {Infoln, s.logger.Infoln},
   127  		"debug":     {Debugln, s.logger.Debugln},
   128  	}
   129  
   130  	for kind, loggers := range cases {
   131  		s.Len(loggers, 2)
   132  		s.False(s.loggingSender.HasMessage())
   133  		s.False(s.stdSender.HasMessage())
   134  
   135  		loggers[0](true, testMessage, testMessage)
   136  		loggers[1](true, testMessage, testMessage)
   137  
   138  		s.True(s.loggingSender.HasMessage())
   139  		s.True(s.stdSender.HasMessage())
   140  		lgrMsg := s.loggingSender.GetMessage()
   141  		stdMsg := s.stdSender.GetMessage()
   142  		s.Equal(lgrMsg.Rendered, stdMsg.Rendered,
   143  			fmt.Sprintf("%s: \n\tlogger: %+v \n\tstandard: %+v", kind, lgrMsg, stdMsg))
   144  	}
   145  }
   146  
   147  func (s *LoggingMethodSuite) TestfMethods() {
   148  	cases := map[string][]fMethod{
   149  		"emergency": {Emergencyf, s.logger.Emergencyf},
   150  		"alert":     {Alertf, s.logger.Alertf},
   151  		"critical":  {Criticalf, s.logger.Criticalf},
   152  		"error":     {Errorf, s.logger.Errorf},
   153  		"warning":   {Warningf, s.logger.Warningf},
   154  		"notice":    {Noticef, s.logger.Noticef},
   155  		"info":      {Infof, s.logger.Infof},
   156  		"debug":     {Debugf, s.logger.Debugf},
   157  	}
   158  
   159  	for kind, loggers := range cases {
   160  		s.Len(loggers, 2)
   161  		s.False(s.loggingSender.HasMessage())
   162  		s.False(s.stdSender.HasMessage())
   163  
   164  		loggers[0]("%s: %d", testMessage, 3)
   165  		loggers[1]("%s: %d", testMessage, 3)
   166  
   167  		s.True(s.loggingSender.HasMessage())
   168  		s.True(s.stdSender.HasMessage())
   169  		lgrMsg := s.loggingSender.GetMessage()
   170  		stdMsg := s.stdSender.GetMessage()
   171  		s.Equal(lgrMsg.Rendered, stdMsg.Rendered,
   172  			fmt.Sprintf("%s: \n\tlogger: %+v \n\tstandard: %+v", kind, lgrMsg, stdMsg))
   173  	}
   174  }
   175  
   176  func (s *LoggingMethodSuite) TestProgramaticLevelMethods() {
   177  	type (
   178  		lgwhen   func(bool, level.Priority, interface{})
   179  		lgwhenln func(bool, level.Priority, ...interface{})
   180  		lgwhenf  func(bool, level.Priority, string, ...interface{})
   181  		lg       func(level.Priority, interface{})
   182  		lgln     func(level.Priority, ...interface{})
   183  		lgf      func(level.Priority, string, ...interface{})
   184  	)
   185  
   186  	cases := map[string]interface{}{
   187  		"when": []lgwhen{LogWhen, s.logger.LogWhen},
   188  		"lg":   []lg{Log, s.logger.Log},
   189  		"lgln": []lgln{Logln, s.logger.Logln},
   190  		"lgf":  []lgf{Logf, s.logger.Logf},
   191  	}
   192  
   193  	const l = level.Emergency
   194  
   195  	for kind, loggers := range cases {
   196  		s.Len(loggers, 2)
   197  		s.False(s.loggingSender.HasMessage())
   198  		s.False(s.stdSender.HasMessage())
   199  
   200  		switch log := loggers.(type) {
   201  		case []lgwhen:
   202  			log[0](true, l, testMessage)
   203  			log[1](true, l, testMessage)
   204  		case []lgwhenln:
   205  			log[0](true, l, testMessage, "->", testMessage)
   206  			log[1](true, l, testMessage, "->", testMessage)
   207  		case []lgwhenf:
   208  			log[0](true, l, "%T: (%s) %s", log, kind, testMessage)
   209  			log[1](true, l, "%T: (%s) %s", log, kind, testMessage)
   210  		case []lg:
   211  			log[0](l, testMessage)
   212  			log[1](l, testMessage)
   213  		case []lgln:
   214  			log[0](l, testMessage, "->", testMessage)
   215  			log[1](l, testMessage, "->", testMessage)
   216  		case []lgf:
   217  			log[0](l, "%T: (%s) %s", log, kind, testMessage)
   218  			log[1](l, "%T: (%s) %s", log, kind, testMessage)
   219  		default:
   220  			panic("testing error")
   221  		}
   222  
   223  		s.True(s.loggingSender.HasMessage())
   224  		s.True(s.stdSender.HasMessage())
   225  		lgrMsg := s.loggingSender.GetMessage()
   226  		stdMsg := s.stdSender.GetMessage()
   227  		s.Equal(lgrMsg.Rendered, stdMsg.Rendered,
   228  			fmt.Sprintf("%s: \n\tlogger: %+v \n\tstandard: %+v", kind, lgrMsg, stdMsg))
   229  	}
   230  }