package denominator;
import org.junit.runner.Runner;
import org.junit.runners.Suite;
import org.junit.runners.model.InitializationError;
import org.junit.runners.parameterized.BlockJUnit4ClassRunnerWithParameters;
import org.junit.runners.parameterized.TestWithParameters;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import denominator.model.ResourceRecordSet;
import denominator.model.Zone;
import static java.util.Arrays.asList;
public class Live extends Suite {
/**
* Add this annotation to specify a {@link TestGraph} that isn't mock.
*/
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target(ElementType.TYPE)
public @interface UseTestGraph {
Class<? extends TestGraph> value();
}
protected final TestGraph graph;
private final List<Runner> runners;
public Live(Class<?> klass) throws InitializationError {
super(klass, Collections.<Runner>emptyList());
graph = testGraph(klass);
if (graph.manager() != null && graph.manager().checkConnection()) {
runners = createRunners(klass);
} else {
runners = Collections.emptyList();
}
}
protected List<Runner> createRunners(Class<?> klass) throws InitializationError {
List<Runner> result = new ArrayList<Runner>();
TestWithParameters test = new TestWithParameters(graph.manager().toString(), getTestClass(),
Arrays.<Object>asList(graph.manager()));
result.add(new BlockJUnit4ClassRunnerWithParameters(test));
return Collections.unmodifiableList(result);
}
private static TestGraph testGraph(Class<?> klass) throws InitializationError {
try {
return klass.isAnnotationPresent(UseTestGraph.class) ?
klass.getAnnotation(UseTestGraph.class).value().newInstance() : new TestGraph();
} catch (Exception e) {
throw new InitializationError(e);
}
}
@Override
protected List<Runner> getChildren() {
return runners;
}
public static final class Write extends Live {
public Write(Class<?> klass) throws InitializationError {
super(klass);
}
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Target(ElementType.TYPE)
public @interface Profile {
String value() default "basic";
}
@Override
protected List<Runner> createRunners(Class<?> klass) throws InitializationError {
// Special case the only test for zone mutation
if (ZoneWriteCommandsLiveTest.class.isAssignableFrom(klass)) {
String zoneToCreate = graph.deleteTestZone();
TestWithParameters test = new TestWithParameters("[" + zoneToCreate + "]", getTestClass(),
asList(graph.manager(), zoneToCreate));
return Collections.<Runner>singletonList(new BlockJUnit4ClassRunnerWithParameters(test));
}
String profile = klass.isAnnotationPresent(Profile.class) ?
klass.getAnnotation(Profile.class).value() : "basic";
List<Runner> result = new ArrayList<Runner>();
List<ResourceRecordSet<?>>
rrsets =
profile.equals("basic") ? graph.basicRecordSets(klass)
: graph.recordSetsForProfile(klass, profile);
Zone zone = graph.createZoneIfAbsent();
for (ResourceRecordSet<?> rrs : rrsets) {
TestWithParameters test = new TestWithParameters("[" + rrs + "]", getTestClass(),
asList(graph.manager(), zone, rrs));
result.add(new BlockJUnit4ClassRunnerWithParameters(test));
}
return Collections.unmodifiableList(result);
}
}
}