blob: 52885647d71c8360fd9e9dd71d3880e730c726d5 [file] [log] [blame]
/*
* Copyright 2015-2022 the original author or authors.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License v2.0 which
* accompanies this distribution and is available at
*
* https://www.eclipse.org/legal/epl-v20.html
*/
package org.junit.jupiter.api.fixtures;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
import org.junit.jupiter.api.extension.ExtensionContext.Store;
import org.junit.jupiter.api.extension.ParameterContext;
import org.junit.jupiter.api.extension.ParameterResolver;
import org.junit.platform.commons.logging.LogRecordListener;
import org.junit.platform.commons.logging.LoggerFactory;
/**
* {@code @TrackLogRecords} registers an extension that tracks log records
* logged via JUnit's logging facade for JUL.
*
* <p>Log records are tracked on a per-method basis (e.g., for a single
* test method).
*
* <p>Test methods can gain access to the {@link LogRecordListener} managed by
* the extension by having an instance of {@code LogRecordListener} injected as
* a method parameter.
*
* @since 5.1
* @see LoggerFactory
* @see LogRecordListener
*/
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@ExtendWith(TrackLogRecords.Extension.class)
public @interface TrackLogRecords {
class Extension implements BeforeEachCallback, AfterEachCallback, ParameterResolver {
@Override
public void beforeEach(ExtensionContext context) {
LoggerFactory.addListener(getListener(context));
}
@Override
public void afterEach(ExtensionContext context) {
LoggerFactory.removeListener(getListener(context));
}
@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) {
boolean isTestMethodLevel = extensionContext.getTestMethod().isPresent();
boolean isListener = parameterContext.getParameter().getType() == LogRecordListener.class;
return isTestMethodLevel && isListener;
}
@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) {
return getListener(extensionContext);
}
private LogRecordListener getListener(ExtensionContext context) {
return getStore(context).getOrComputeIfAbsent(LogRecordListener.class);
}
private Store getStore(ExtensionContext context) {
return context.getStore(Namespace.create(getClass(), context.getRequiredTestMethod()));
}
}
}