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 }