ConfigSuite: Store config name in field annotated with @Name

Change-Id: Ibc80d04195c70406b3ee8bc95b981cc22be185a5
This commit is contained in:
Dave Borowitz
2015-03-16 16:06:07 -07:00
parent 1dc07d9f33
commit 02ab3135fa
2 changed files with 34 additions and 10 deletions

View File

@@ -84,6 +84,9 @@ public abstract class AbstractDaemonTest {
@ConfigSuite.Parameter @ConfigSuite.Parameter
public Config baseConfig; public Config baseConfig;
@ConfigSuite.Name
private String configName;
@Inject @Inject
protected AllProjectsName allProjects; protected AllProjectsName allProjects;

View File

@@ -20,6 +20,7 @@ import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME; import static java.lang.annotation.RetentionPolicy.RUNTIME;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import org.junit.runner.Runner; import org.junit.runner.Runner;
@@ -28,6 +29,7 @@ import org.junit.runners.Suite;
import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.InitializationError; import org.junit.runners.model.InitializationError;
import java.lang.annotation.Annotation;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.Target; import java.lang.annotation.Target;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@@ -78,6 +80,9 @@ import java.util.List;
* *
* Additionally, config values used by <strong>default</strong> can be set * Additionally, config values used by <strong>default</strong> can be set
* in a method annotated with {@code @ConfigSuite.Default}. * in a method annotated with {@code @ConfigSuite.Default}.
* <p>
* The name of the config method corresponding to the currently-running test can
* be stored in a field annotated with {@code @ConfigSuite.Name}.
*/ */
public class ConfigSuite extends Suite { public class ConfigSuite extends Suite {
private static final String DEFAULT = "default"; private static final String DEFAULT = "default";
@@ -97,15 +102,22 @@ public class ConfigSuite extends Suite {
public static @interface Parameter { public static @interface Parameter {
} }
@Target({FIELD})
@Retention(RUNTIME)
public static @interface Name {
}
private static class ConfigRunner extends BlockJUnit4ClassRunner { private static class ConfigRunner extends BlockJUnit4ClassRunner {
private final Method configMethod; private final Method configMethod;
private final Field parameterField; private final Field parameterField;
private final Field nameField;
private final String name; private final String name;
private ConfigRunner(Class<?> clazz, Field parameterField, String name, private ConfigRunner(Class<?> clazz, Field parameterField, Field nameField,
Method configMethod) throws InitializationError { String name, Method configMethod) throws InitializationError {
super(clazz); super(clazz);
this.parameterField = parameterField; this.parameterField = parameterField;
this.nameField = nameField;
this.name = name; this.name = name;
this.configMethod = configMethod; this.configMethod = configMethod;
} }
@@ -114,6 +126,9 @@ public class ConfigSuite extends Suite {
public Object createTest() throws Exception { public Object createTest() throws Exception {
Object test = getTestClass().getJavaClass().newInstance(); Object test = getTestClass().getJavaClass().newInstance();
parameterField.set(test, callConfigMethod(configMethod)); parameterField.set(test, callConfigMethod(configMethod));
if (nameField != null) {
nameField.set(test, name);
}
return test; return test;
} }
@@ -132,12 +147,16 @@ public class ConfigSuite extends Suite {
private static List<Runner> runnersFor(Class<?> clazz) { private static List<Runner> runnersFor(Class<?> clazz) {
Method defaultConfig = getDefaultConfig(clazz); Method defaultConfig = getDefaultConfig(clazz);
List<Method> configs = getConfigs(clazz); List<Method> configs = getConfigs(clazz);
Field field = getParameterField(clazz); Field parameterField = getOnlyField(clazz, Parameter.class);
checkArgument(parameterField != null, "No @ConfigSuite.Field found");
Field nameField = getOnlyField(clazz, Name.class);
List<Runner> result = Lists.newArrayListWithCapacity(configs.size() + 1); List<Runner> result = Lists.newArrayListWithCapacity(configs.size() + 1);
try { try {
result.add(new ConfigRunner(clazz, field, null, defaultConfig)); result.add(new ConfigRunner(
clazz, parameterField, nameField, null, defaultConfig));
for (Method m : configs) { for (Method m : configs) {
result.add(new ConfigRunner(clazz, field, m.getName(), m)); result.add(new ConfigRunner(
clazz, parameterField, nameField, m.getName(), m));
} }
return result; return result;
} catch (InitializationError e) { } catch (InitializationError e) {
@@ -195,16 +214,18 @@ public class ConfigSuite extends Suite {
} }
} }
private static Field getParameterField(Class<?> clazz) { private static Field getOnlyField(Class<?> clazz,
Class<? extends Annotation> ann) {
List<Field> fields = Lists.newArrayListWithExpectedSize(1); List<Field> fields = Lists.newArrayListWithExpectedSize(1);
for (Field f : clazz.getFields()) { for (Field f : clazz.getFields()) {
if (f.getAnnotation(Parameter.class) != null) { if (f.getAnnotation(ann) != null) {
fields.add(f); fields.add(f);
} }
} }
checkArgument(fields.size() == 1, checkArgument(fields.size() <= 1,
"expected 1 @ConfigSuite.Parameter field, found: %s", fields); "expected 1 @ConfigSuite.%s field, found: %s",
return fields.get(0); ann.getSimpleName(), fields);
return Iterables.getFirst(fields, null);
} }
public ConfigSuite(Class<?> clazz) throws InitializationError { public ConfigSuite(Class<?> clazz) throws InitializationError {