blob: 4173a561ab8439d8c93a2e27982bcf462c402cb6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2016 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.commons.sdk.util;
import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.lang.reflect.Parameter;
import java.util.ArrayList;
import java.util.List;
import org.junit.runner.notification.RunNotifier;
import org.junit.runners.Suite;
import org.junit.runners.model.RunnerBuilder;
public class ManagedSuite extends Suite {
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public static @interface TestConfigurationProperty {
boolean localOnly() default false;
boolean defaultOnly() default false;
boolean headless() default false;
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public static @interface SuiteClassProvider {
}
public static TestConfiguration testConfiguration;
public static TestConfiguration getTestConfiguration() {
return testConfiguration;
}
public static TestConfiguration getTestConfigurationOrCreateDefault() {
if (testConfiguration == null) {
testConfiguration = TestConfiguration.getDefault();
}
return testConfiguration;
}
public static void setTestConfiguration(TestConfiguration testConfiguration) {
ManagedSuite.testConfiguration = testConfiguration;
}
public ManagedSuite(Class<?> klass, RunnerBuilder builder) throws Throwable {
super(klass, builder.runners(klass, getSuiteClasses(klass, klass.getClasses())));
}
private static Class<?>[] getSuiteClasses(Class<?> klass, Class<?>[] classes) throws SecurityException {
final List<Class<?>> suiteClassList = new ArrayList<Class<?>>();
for (Annotation annotation : klass.getAnnotations()) {
if (annotation.annotationType() == TestConfigurationProperty.class) {
if (getTestConfiguration() == null) {
TestConfigurationProperty configurationProperty = (TestConfigurationProperty) annotation;
TestConfiguration testConfiguration = new TestConfiguration();
testConfiguration.setLocalOnly(configurationProperty.localOnly());
testConfiguration.setDefaultOnly(configurationProperty.defaultOnly());
testConfiguration.setHeadless(configurationProperty.headless());
setTestConfiguration(testConfiguration);
}
} else if (annotation.annotationType() == SuiteClasses.class) {
SuiteClasses suiteClasses = (SuiteClasses) annotation;
for (Class<?> suiteClass : suiteClasses.value()) {
suiteClassList.add(suiteClass);
}
}
}
if (getTestConfiguration() == null) {
setTestConfiguration(TestConfiguration.getDefault());
}
for (Method method : klass.getDeclaredMethods()) {
if (method.isAnnotationPresent(SuiteClassProvider.class)) {
try {
TestConfiguration conf = getTestConfiguration();
Parameter[] parameters = method.getParameters();
if (parameters.length == 2) {
if (parameters[0].getType() == List.class
&& parameters[1].getType() == TestConfiguration.class) {
if (Modifier.isStatic(method.getModifiers())) {
if (!Modifier.isPublic(method.getModifiers())) {
method.setAccessible(true);
}
method.invoke(null, suiteClassList, conf);
}
}
}
} catch (InvocationTargetException | IllegalAccessException | IllegalArgumentException e) {
// Ignore
}
}
}
return suiteClassList.toArray(new Class<?>[suiteClassList.size()]);
}
@Override
public void run(RunNotifier notifier) {
JUnitExecutionListener listener = JUnitExecutionListener.getDefault();
if (listener == null) {
notifier.addListener(JUnitExecutionListener.createDefault());
}
super.run(notifier);
}
}