1 package com.github.valfirst.slf4jtest; 2 3 import java.util.Arrays; 4 import java.util.List; 5 import java.util.Optional; 6 import java.util.function.Predicate; 7 import java.util.function.Supplier; 8 import org.assertj.core.api.AbstractAssert; 9 import org.slf4j.event.Level; 10 11 abstract class AbstractTestLoggerAssert<C extends AbstractAssert<C, TestLogger>> 12 extends AbstractAssert<C, TestLogger> { 13 protected Supplier<List<LoggingEvent>> loggingEventsSupplier; 14 15 protected AbstractTestLoggerAssert(TestLogger testLogger, Class clazz) { 16 super(testLogger, clazz); 17 loggingEventsSupplier = testLogger::getLoggingEvents; 18 } 19 20 protected long getLogCount(Level level, Predicate<LoggingEvent> predicate) { 21 return loggingEventsSupplier.get().stream() 22 .filter(event -> level.equals(event.getLevel()) && predicate.test(event)) 23 .count(); 24 } 25 26 protected static Predicate<LoggingEvent> logWithMessage(String message, Object... arguments) { 27 return logWithMessage(message, Optional.empty(), arguments); 28 } 29 30 protected static Predicate<LoggingEvent> logWithMessage( 31 String message, 32 @SuppressWarnings("OptionalUsedAsFieldOrParameterType") Optional<Throwable> maybeThrowable, 33 Object... arguments) { 34 return event -> 35 message.equals(event.getMessage()) 36 && event.getArguments().equals(Arrays.asList(arguments)) 37 && event.getThrowable().equals(maybeThrowable); 38 } 39 40 protected static LoggingEvent event(Level level, String message, Object... arguments) { 41 switch (level) { 42 case WARN: 43 return LoggingEvent.warn(message, arguments); 44 case ERROR: 45 return LoggingEvent.error(message, arguments); 46 case INFO: 47 return LoggingEvent.info(message, arguments); 48 case DEBUG: 49 return LoggingEvent.debug(message, arguments); 50 case TRACE: 51 return LoggingEvent.trace(message, arguments); 52 default: 53 throw new IllegalStateException("Unmatched level " + level + " provided"); 54 } 55 } 56 57 protected static LoggingEvent event( 58 Throwable throwable, Level level, String message, Object... arguments) { 59 switch (level) { 60 case WARN: 61 return LoggingEvent.warn(throwable, message, arguments); 62 case ERROR: 63 return LoggingEvent.error(throwable, message, arguments); 64 case INFO: 65 return LoggingEvent.info(throwable, message, arguments); 66 case DEBUG: 67 return LoggingEvent.debug(throwable, message, arguments); 68 case TRACE: 69 return LoggingEvent.trace(throwable, message, arguments); 70 default: 71 throw new IllegalStateException("Unmatched level " + level + " provided"); 72 } 73 } 74 }