1 package uk.org.lidalia.slf4jutils; 2 3 import com.google.common.base.Function; 4 import com.google.common.collect.Lists; 5 import junitparams.JUnitParamsRunner; 6 import junitparams.Parameters; 7 8 import org.junit.Test; 9 import org.junit.runner.RunWith; 10 import org.slf4j.Marker; 11 12 import java.lang.reflect.Method; 13 import java.util.List; 14 15 import uk.org.lidalia.slf4jext.Logger; 16 17 import static java.util.Arrays.asList; 18 import static org.junit.Assert.assertEquals; 19 import static org.junit.Assert.assertFalse; 20 import static org.junit.Assert.assertTrue; 21 import static org.mockito.BDDMockito.given; 22 import static org.mockito.Mockito.reset; 23 import static org.mockito.Mockito.verify; 24 import static org.mockito.Mockito.verifyZeroInteractions; 25 import static org.powermock.api.mockito.PowerMockito.mock; 26 import static uk.org.lidalia.slf4jext.Level.DEBUG; 27 import static uk.org.lidalia.slf4jext.Level.ERROR; 28 import static uk.org.lidalia.slf4jext.Level.INFO; 29 import static uk.org.lidalia.slf4jext.Level.OFF; 30 import static uk.org.lidalia.slf4jext.Level.TRACE; 31 import static uk.org.lidalia.slf4jext.Level.WARN; 32 import static uk.org.lidalia.test.Values.uniqueValueFor; 33 34 @RunWith(JUnitParamsRunner.class) 35 public class LoggerTests { 36 37 org.slf4j.Logger decoratedLogger = mock(org.slf4j.Logger.class); 38 Logger richLogger = new Logger(decoratedLogger); 39 40 Marker marker = mock(Marker.class); 41 String message = "message"; 42 Object arg1 = new Object(); 43 Object arg2 = new Object(); 44 Object arg3 = new Object(); 45 Object[] args = new Object[] { arg1, arg2, arg3 }; 46 Throwable throwable = new Throwable(); 47 48 public Object[] slf4jLoggerMethods() { 49 return org.slf4j.Logger.class.getMethods(); 50 } 51 @Test 52 @Parameters(method = "slf4jLoggerMethods") 53 public void richLoggerDelegatesLoggerMethodToDecoratedLogger(Method loggerMethod) throws Exception { 54 Object[] args = buildParamsFor(loggerMethod); 55 Class<?> returnType = loggerMethod.getReturnType(); 56 if (returnType == void.class) { 57 loggerMethod.invoke(richLogger, args); 58 loggerMethod.invoke(verify(decoratedLogger), args); 59 } else { 60 Object result = uniqueValueFor(returnType); 61 given(loggerMethod.invoke(decoratedLogger, args)).willReturn(result); 62 assertEquals("result of " + loggerMethod, result, loggerMethod.invoke(richLogger, args)); 63 } 64 } 65 66 @Test 67 public void isEnabledTrace() { 68 given(decoratedLogger.isTraceEnabled()).willReturn(true); 69 assertTrue(richLogger.isEnabled(TRACE)); 70 71 given(decoratedLogger.isTraceEnabled()).willReturn(false); 72 assertFalse(richLogger.isEnabled(TRACE)); 73 } 74 75 @Test 76 public void logTraceMessage() { 77 richLogger.log(TRACE, message); 78 verify(decoratedLogger).trace(message); 79 } 80 81 @Test 82 public void logTraceMessageOneArg() { 83 richLogger.log(TRACE, message, arg1); 84 verify(decoratedLogger).trace(message, arg1); 85 } 86 87 @Test 88 public void logTraceMessageTwoArgs() { 89 richLogger.log(TRACE, message, arg1, arg2); 90 verify(decoratedLogger).trace(message, arg1, arg2); 91 } 92 93 @Test 94 public void logTraceMessageVarArgs() { 95 richLogger.log(TRACE, message, arg1, arg2, arg3); 96 verify(decoratedLogger).trace(message, args); 97 } 98 99 @Test 100 public void logTraceMessageException() { 101 richLogger.log(TRACE, message, throwable); 102 verify(decoratedLogger).trace(message, throwable); 103 } 104 105 @Test 106 public void isEnabledTraceMarker() { 107 given(decoratedLogger.isTraceEnabled(marker)).willReturn(true); 108 assertTrue(richLogger.isEnabled(TRACE, marker)); 109 110 given(decoratedLogger.isTraceEnabled(marker)).willReturn(false); 111 assertFalse(richLogger.isEnabled(TRACE, marker)); 112 } 113 114 @Test 115 public void logTraceMarkerMessage() { 116 richLogger.log(TRACE, marker, message); 117 verify(decoratedLogger).trace(marker, message); 118 } 119 120 @Test 121 public void logTraceMarkerMessageOneArg() { 122 richLogger.log(TRACE, marker, message, arg1); 123 verify(decoratedLogger).trace(marker, message, arg1); 124 } 125 126 @Test 127 public void logTraceMarkerMessageTwoArgs() { 128 richLogger.log(TRACE, marker, message, arg1, arg2); 129 verify(decoratedLogger).trace(marker, message, arg1, arg2); 130 } 131 132 @Test 133 public void logTraceMarkerMessageVarArgs() { 134 richLogger.log(TRACE, marker, message, arg1, arg2, arg3); 135 verify(decoratedLogger).trace(marker, message, args); 136 } 137 138 @Test 139 public void logTraceMarkerMessageException() { 140 richLogger.log(TRACE, marker, message, throwable); 141 verify(decoratedLogger).trace(marker, message, throwable); 142 } 143 144 @Test 145 public void isEnabledDebug() { 146 given(decoratedLogger.isDebugEnabled()).willReturn(true); 147 assertTrue(richLogger.isEnabled(DEBUG)); 148 149 given(decoratedLogger.isDebugEnabled()).willReturn(false); 150 assertFalse(richLogger.isEnabled(DEBUG)); 151 } 152 153 @Test 154 public void logDebugMessage() { 155 richLogger.log(DEBUG, message); 156 verify(decoratedLogger).debug(message); 157 } 158 159 @Test 160 public void logDebugMessageOneArg() { 161 richLogger.log(DEBUG, message, arg1); 162 verify(decoratedLogger).debug(message, arg1); 163 } 164 165 @Test 166 public void logDebugMessageTwoArgs() { 167 richLogger.log(DEBUG, message, arg1, arg2); 168 verify(decoratedLogger).debug(message, arg1, arg2); 169 } 170 171 @Test 172 public void logDebugMessageVarArgs() { 173 richLogger.log(DEBUG, message, arg1, arg2, arg3); 174 verify(decoratedLogger).debug(message, args); 175 } 176 177 @Test 178 public void logDebugMessageException() { 179 richLogger.log(DEBUG, message, throwable); 180 verify(decoratedLogger).debug(message, throwable); 181 } 182 183 @Test 184 public void isEnabledDebugMarker() { 185 given(decoratedLogger.isDebugEnabled(marker)).willReturn(true); 186 assertTrue(richLogger.isEnabled(DEBUG, marker)); 187 188 given(decoratedLogger.isDebugEnabled(marker)).willReturn(false); 189 assertFalse(richLogger.isEnabled(DEBUG, marker)); 190 } 191 192 @Test 193 public void logDebugMarkerMessage() { 194 richLogger.log(DEBUG, marker, message); 195 verify(decoratedLogger).debug(marker, message); 196 } 197 198 @Test 199 public void logDebugMarkerMessageOneArg() { 200 richLogger.log(DEBUG, marker, message, arg1); 201 verify(decoratedLogger).debug(marker, message, arg1); 202 } 203 204 @Test 205 public void logDebugMarkerMessageTwoArgs() { 206 richLogger.log(DEBUG, marker, message, arg1, arg2); 207 verify(decoratedLogger).debug(marker, message, arg1, arg2); 208 } 209 210 @Test 211 public void logDebugMarkerMessageVarArgs() { 212 richLogger.log(DEBUG, marker, message, arg1, arg2, arg3); 213 verify(decoratedLogger).debug(marker, message, args); 214 } 215 216 @Test 217 public void logDebugMarkerMessageException() { 218 richLogger.log(DEBUG, marker, message, throwable); 219 verify(decoratedLogger).debug(marker, message, throwable); 220 } 221 222 @Test 223 public void isEnabledInfo() { 224 given(decoratedLogger.isInfoEnabled()).willReturn(true); 225 assertTrue(richLogger.isEnabled(INFO)); 226 227 given(decoratedLogger.isInfoEnabled()).willReturn(false); 228 assertFalse(richLogger.isEnabled(INFO)); 229 } 230 231 @Test 232 public void logInfoMessage() { 233 richLogger.log(INFO, message); 234 verify(decoratedLogger).info(message); 235 } 236 237 @Test 238 public void logInfoMessageOneArg() { 239 richLogger.log(INFO, message, arg1); 240 verify(decoratedLogger).info(message, arg1); 241 } 242 243 @Test 244 public void logInfoMessageTwoArgs() { 245 richLogger.log(INFO, message, arg1, arg2); 246 verify(decoratedLogger).info(message, arg1, arg2); 247 } 248 249 @Test 250 public void logInfoMessageVarArgs() { 251 richLogger.log(INFO, message, arg1, arg2, arg3); 252 verify(decoratedLogger).info(message, args); 253 } 254 255 @Test 256 public void logInfoMessageException() { 257 richLogger.log(INFO, message, throwable); 258 verify(decoratedLogger).info(message, throwable); 259 } 260 261 @Test 262 public void isEnabledInfoMarker() { 263 given(decoratedLogger.isInfoEnabled(marker)).willReturn(true); 264 assertTrue(richLogger.isEnabled(INFO, marker)); 265 266 given(decoratedLogger.isInfoEnabled(marker)).willReturn(false); 267 assertFalse(richLogger.isEnabled(INFO, marker)); 268 } 269 270 @Test 271 public void logInfoMarkerMessage() { 272 richLogger.log(INFO, marker, message); 273 verify(decoratedLogger).info(marker, message); 274 } 275 276 @Test 277 public void logInfoMarkerMessageOneArg() { 278 richLogger.log(INFO, marker, message, arg1); 279 verify(decoratedLogger).info(marker, message, arg1); 280 } 281 282 @Test 283 public void logInfoMarkerMessageTwoArgs() { 284 richLogger.log(INFO, marker, message, arg1, arg2); 285 verify(decoratedLogger).info(marker, message, arg1, arg2); 286 } 287 288 @Test 289 public void logInfoMarkerMessageVarArgs() { 290 richLogger.log(INFO, marker, message, arg1, arg2, arg3); 291 verify(decoratedLogger).info(marker, message, args); 292 } 293 294 @Test 295 public void logInfoMarkerMessageException() { 296 richLogger.log(INFO, marker, message, throwable); 297 verify(decoratedLogger).info(marker, message, throwable); 298 } 299 300 @Test 301 public void isEnabledWarn() { 302 given(decoratedLogger.isWarnEnabled()).willReturn(true); 303 assertTrue(richLogger.isEnabled(WARN)); 304 305 given(decoratedLogger.isWarnEnabled()).willReturn(false); 306 assertFalse(richLogger.isEnabled(WARN)); 307 } 308 309 @Test 310 public void logWarnMessage() { 311 richLogger.log(WARN, message); 312 verify(decoratedLogger).warn(message); 313 } 314 315 @Test 316 public void logWarnMessageOneArg() { 317 richLogger.log(WARN, message, arg1); 318 verify(decoratedLogger).warn(message, arg1); 319 } 320 321 @Test 322 public void logWarnMessageTwoArgs() { 323 richLogger.log(WARN, message, arg1, arg2); 324 verify(decoratedLogger).warn(message, arg1, arg2); 325 } 326 327 @Test 328 public void logWarnMessageVarArgs() { 329 richLogger.log(WARN, message, arg1, arg2, arg3); 330 verify(decoratedLogger).warn(message, args); 331 } 332 333 @Test 334 public void logWarnMessageException() { 335 richLogger.log(WARN, message, throwable); 336 verify(decoratedLogger).warn(message, throwable); 337 } 338 339 @Test 340 public void isEnabledWarnMarker() { 341 given(decoratedLogger.isWarnEnabled(marker)).willReturn(true); 342 assertTrue(richLogger.isEnabled(WARN, marker)); 343 344 given(decoratedLogger.isWarnEnabled(marker)).willReturn(false); 345 assertFalse(richLogger.isEnabled(WARN, marker)); 346 } 347 348 @Test 349 public void logWarnMarkerMessage() { 350 richLogger.log(WARN, marker, message); 351 verify(decoratedLogger).warn(marker, message); 352 } 353 354 @Test 355 public void logWarnMarkerMessageOneArg() { 356 richLogger.log(WARN, marker, message, arg1); 357 verify(decoratedLogger).warn(marker, message, arg1); 358 } 359 360 @Test 361 public void logWarnMarkerMessageTwoArgs() { 362 richLogger.log(WARN, marker, message, arg1, arg2); 363 verify(decoratedLogger).warn(marker, message, arg1, arg2); 364 } 365 366 @Test 367 public void logWarnMarkerMessageVarArgs() { 368 richLogger.log(WARN, marker, message, arg1, arg2, arg3); 369 verify(decoratedLogger).warn(marker, message, args); 370 } 371 372 @Test 373 public void logWarnMarkerMessageException() { 374 richLogger.log(WARN, marker, message, throwable); 375 verify(decoratedLogger).warn(marker, message, throwable); 376 } 377 378 @Test 379 public void isEnabledError() { 380 given(decoratedLogger.isErrorEnabled()).willReturn(true); 381 assertTrue(richLogger.isEnabled(ERROR)); 382 383 given(decoratedLogger.isErrorEnabled()).willReturn(false); 384 assertFalse(richLogger.isEnabled(ERROR)); 385 } 386 387 @Test 388 public void logErrorMessage() { 389 richLogger.log(ERROR, message); 390 verify(decoratedLogger).error(message); 391 } 392 393 @Test 394 public void logErrorMessageOneArg() { 395 richLogger.log(ERROR, message, arg1); 396 verify(decoratedLogger).error(message, arg1); 397 } 398 399 @Test 400 public void logErrorMessageTwoArgs() { 401 richLogger.log(ERROR, message, arg1, arg2); 402 verify(decoratedLogger).error(message, arg1, arg2); 403 } 404 405 @Test 406 public void logErrorMessageVarArgs() { 407 richLogger.log(ERROR, message, arg1, arg2, arg3); 408 verify(decoratedLogger).error(message, args); 409 } 410 411 @Test 412 public void logErrorMessageException() { 413 richLogger.log(ERROR, message, throwable); 414 verify(decoratedLogger).error(message, throwable); 415 } 416 417 @Test 418 public void isEnabledErrorMarker() { 419 given(decoratedLogger.isErrorEnabled(marker)).willReturn(true); 420 assertTrue(richLogger.isEnabled(ERROR, marker)); 421 422 given(decoratedLogger.isErrorEnabled(marker)).willReturn(false); 423 assertFalse(richLogger.isEnabled(ERROR, marker)); 424 } 425 426 @Test 427 public void logErrorMarkerMessage() { 428 richLogger.log(ERROR, marker, message); 429 verify(decoratedLogger).error(marker, message); 430 } 431 432 @Test 433 public void logErrorMarkerMessageOneArg() { 434 richLogger.log(ERROR, marker, message, arg1); 435 verify(decoratedLogger).error(marker, message, arg1); 436 } 437 438 @Test 439 public void logErrorMarkerMessageTwoArgs() { 440 richLogger.log(ERROR, marker, message, arg1, arg2); 441 verify(decoratedLogger).error(marker, message, arg1, arg2); 442 } 443 444 @Test 445 public void logErrorMarkerMessageVarArgs() { 446 richLogger.log(ERROR, marker, message, arg1, arg2, arg3); 447 verify(decoratedLogger).error(marker, message, args); 448 } 449 450 @Test 451 public void logErrorMarkerMessageException() { 452 richLogger.log(ERROR, marker, message, throwable); 453 verify(decoratedLogger).error(marker, message, throwable); 454 } 455 456 @Test 457 public void isEnabledOff() { 458 assertFalse(richLogger.isEnabled(OFF)); 459 } 460 461 @Test 462 public void logOffMessage() { 463 richLogger.log(OFF, message); 464 verifyZeroInteractions(decoratedLogger); 465 } 466 467 @Test 468 public void logOffMessageOneArg() { 469 richLogger.log(OFF, message, arg1); 470 verifyZeroInteractions(decoratedLogger); 471 } 472 473 @Test 474 public void logOffMessageTwoArgs() { 475 richLogger.log(OFF, message, arg1, arg2); 476 verifyZeroInteractions(decoratedLogger); 477 } 478 479 @Test 480 public void logOffMessageVarArgs() { 481 richLogger.log(OFF, message, arg1, arg2, arg3); 482 verifyZeroInteractions(decoratedLogger); 483 } 484 485 @Test 486 public void logOffMessageException() { 487 richLogger.log(OFF, message, throwable); 488 verifyZeroInteractions(decoratedLogger); 489 } 490 491 @Test 492 public void isEnabledOffMarker() { 493 assertFalse(richLogger.isEnabled(OFF, marker)); 494 } 495 496 @Test 497 public void logOffMarkerMessage() { 498 richLogger.log(OFF, marker, message); 499 verifyZeroInteractions(decoratedLogger); 500 } 501 502 @Test 503 public void logOffMarkerMessageOneArg() { 504 richLogger.log(OFF, marker, message, arg1); 505 verifyZeroInteractions(decoratedLogger); 506 } 507 508 @Test 509 public void logOffMarkerMessageTwoArgs() { 510 richLogger.log(OFF, marker, message, arg1, arg2); 511 verifyZeroInteractions(decoratedLogger); 512 } 513 514 @Test 515 public void logOffMarkerMessageVarArgs() { 516 richLogger.log(OFF, marker, message, arg1, arg2, arg3); 517 verifyZeroInteractions(decoratedLogger); 518 } 519 520 @Test 521 public void logOffMarkerMessageException() { 522 richLogger.log(OFF, marker, message, throwable); 523 verifyZeroInteractions(decoratedLogger); 524 } 525 526 @Test 527 public void traceMessageVarArgs() { 528 richLogger.trace(message, arg1, arg2, arg3); 529 verify(decoratedLogger).trace(message, args); 530 } 531 532 @Test 533 public void traceMarkerMessageVarArgs() { 534 richLogger.trace(marker, message, arg1, arg2, arg3); 535 verify(decoratedLogger).trace(marker, message, args); 536 } 537 538 @Test 539 public void debugMessageVarArgs() { 540 richLogger.debug(message, arg1, arg2, arg3); 541 verify(decoratedLogger).debug(message, args); 542 } 543 544 @Test 545 public void debugMarkerMessageVarArgs() { 546 richLogger.debug(marker, message, arg1, arg2, arg3); 547 verify(decoratedLogger).debug(marker, message, args); 548 } 549 550 @Test 551 public void infoMessageVarArgs() { 552 richLogger.info(message, arg1, arg2, arg3); 553 verify(decoratedLogger).info(message, args); 554 } 555 556 @Test 557 public void infoMarkerMessageVarArgs() { 558 richLogger.info(marker, message, arg1, arg2, arg3); 559 verify(decoratedLogger).info(marker, message, args); 560 } 561 562 @Test 563 public void warnMessageVarArgs() { 564 richLogger.warn(message, arg1, arg2, arg3); 565 verify(decoratedLogger).warn(message, args); 566 } 567 568 @Test 569 public void warnMarkerMessageVarArgs() { 570 richLogger.warn(marker, message, arg1, arg2, arg3); 571 verify(decoratedLogger).warn(marker, message, args); 572 } 573 574 @Test 575 public void errorMessageVarArgs() { 576 richLogger.error(message, arg1, arg2, arg3); 577 verify(decoratedLogger).error(message, args); 578 } 579 580 @Test 581 public void errorMarkerMessageVarArgs() { 582 richLogger.error(marker, message, arg1, arg2, arg3); 583 verify(decoratedLogger).error(marker, message, args); 584 } 585 586 private Object[] buildParamsFor(Method loggerMethod) throws Exception { 587 Class<?>[] parameterTypes = loggerMethod.getParameterTypes(); 588 List<Object> params = Lists.transform(asList(parameterTypes), new Function<Class<?>, Object>() { 589 public Object apply(Class<?> aClass) { 590 return uniqueValueFor(aClass); 591 } 592 }); 593 return params.toArray(); 594 } 595 }