package denominator; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import denominator.mock.MockProvider; import denominator.model.ResourceRecordSet; import denominator.model.Zone; import denominator.model.rdata.CERTData; import denominator.model.rdata.MXData; import denominator.model.rdata.NAPTRData; import denominator.model.rdata.SRVData; import denominator.model.rdata.SSHFPData; import static denominator.model.ResourceRecordSets.a; import static denominator.model.ResourceRecordSets.aaaa; import static denominator.model.ResourceRecordSets.cname; import static denominator.model.ResourceRecordSets.ns; import static denominator.model.ResourceRecordSets.ptr; import static denominator.model.ResourceRecordSets.spf; import static denominator.model.ResourceRecordSets.txt; import static java.lang.String.format; import static java.lang.System.getProperty; import static java.util.Arrays.asList; import static org.junit.Assume.assumeFalse; import static org.junit.Assume.assumeTrue; public class TestGraph { private final DNSApiManager manager; private final String zoneName; private final boolean addTrailingDotToZone; public TestGraph() { this(Denominator.create(new MockProvider()), "denominator.io."); } /** * To lazy initialize {@code manager}, pass null and override {@link #manager()}. */ protected TestGraph(DNSApiManager manager, String zoneName) { this.manager = manager; this.zoneName = zoneName; this.addTrailingDotToZone = manager == null || !manager.provider().name().equals("clouddns"); } /** * Returns null if the manager could not be initialized. * * <p/> Override to lazy initialize, for example if you are using TLS certificate auth. */ protected DNSApiManager manager() { return manager; } Zone createZoneIfAbsent() { assumeTrue("manager not initialized", manager() != null); assumeTrue("zone not specified", zoneName != null); Iterator<Zone> zonesWithName = manager().api().zones().iterateByName(zoneName); if (zonesWithName.hasNext()) { return zonesWithName.next(); } String id = manager().api().zones().put(Zone.create(null, zoneName, 86400, "test@" + zoneName)); return Zone.create(id, zoneName, 86400, "test@" + zoneName); } String deleteTestZone() { assumeTrue("manager not initialized", manager() != null); assumeTrue("zone not specified", zoneName != null); String zoneToCreate = "zonetest." + zoneName; Iterator<Zone> zonesWithName = manager().api().zones().iterateByName(zoneToCreate); while (zonesWithName.hasNext()) { manager().api().zones().delete(zonesWithName.next().id()); } return zoneToCreate; } List<ResourceRecordSet<?>> basicRecordSets(Class<?> testClass) { return filterRecordSets(testClass, manager().provider().basicRecordTypes()); } List<ResourceRecordSet<?>> recordSetsForProfile(Class<?> testClass, String profile) { return filterRecordSets(testClass, manager().provider().profileToRecordTypes().get(profile)); } private List<ResourceRecordSet<?>> filterRecordSets(Class<?> testClass, Collection<String> types) { List<ResourceRecordSet<?>> filtered = new ArrayList<ResourceRecordSet<?>>(); for (Map.Entry<String, ResourceRecordSet<?>> entry : stockRRSets(testClass).entrySet()) { if (types.contains(entry.getKey())) { filtered.add(entry.getValue()); } } return filtered; } /** * Creates sample record sets named base on the {@code testClass}. */ private Map<String, ResourceRecordSet<?>> stockRRSets(Class<?> testClass) { String rPrefix = testClass.getSimpleName().toLowerCase() + "." + getProperty("user.name").replace('.', '-'); String rSuffix = rPrefix + "." + zoneName; String dSuffix = rSuffix; if (addTrailingDotToZone && !rSuffix.endsWith(".")) { dSuffix = rSuffix + "."; } Map<String, ResourceRecordSet<?>> result = new LinkedHashMap<String, ResourceRecordSet<?>>(); result.put("A", a("ipv4-" + rSuffix, asList("192.0.2.1", "198.51.100.1", "203.0.113.1"))); result.put("AAAA", aaaa("ipv6-" + rSuffix, asList("2001:1DB8:85A3:1001:1001:8A2E:1371:7334", "2001:1DB8:85A3:1001:1001:8A2E:1371:7335", "2001:1DB8:85A3:1001:1001:8A2E:1371:7336"))); result.put("CNAME", cname("www-" + rSuffix, asList("www-north-" + dSuffix, "www-east-" + dSuffix, "www-west-" + dSuffix))); result.put("CERT", ResourceRecordSet.<CERTData>builder().name("cert-" + rSuffix).type("CERT") .add(CERTData.builder().format(1).tag(2).algorithm(3).certificate("ABCD") .build()) .add(CERTData.builder().format(1).tag(2).algorithm(3).certificate("EFGH") .build()) .build()); result.put("MX", ResourceRecordSet.<MXData>builder().name("mail-" + rSuffix).type("MX") .add(MXData.create(10, "mail1-" + dSuffix)) .add(MXData.create(10, "mail2-" + dSuffix)) .add(MXData.create(10, "mail3-" + dSuffix)).build()); result.put("NS", ns("ns-" + rSuffix, asList("ns1-" + dSuffix, "ns2-" + dSuffix, "ns3-" + dSuffix))); result.put("NAPTR", ResourceRecordSet.<NAPTRData>builder().name("naptr-" + rSuffix).type("NAPTR") .add(NAPTRData.builder().order(1).preference(1).flags("U").services("E2U+sip") .regexp("!^.*$!sip:customer-service@example.com!").replacement(".") .build()) .add(NAPTRData.builder().order(2).preference(1).flags("U").services("E2U+sip") .regexp("!^.*$!sip:admin-service@example.com!").replacement(".") .build()) .build()); result.put("PTR", ptr("ptr-" + rSuffix, asList("ptr1-" + dSuffix, "ptr2-" + dSuffix, "ptr3-" + dSuffix))); result.put("SPF", spf("spf-" + rSuffix, asList("v=spf1 a -all", "v=spf1 mx -all", "v=spf1 ipv6 -all"))); result.put("SRV", // designate does not support priority zero! ResourceRecordSet.<SRVData>builder().name("_http._tcp" + rSuffix).type("SRV") .add(SRVData.builder().priority(1).weight(1).port(80) .target("ipv4-" + dSuffix) .build()) .add(SRVData.builder().priority(1).weight(1).port(8080) .target("ipv4-" + dSuffix) .build()) .add(SRVData.builder().priority(1).weight(1).port(443) .target("ipv4-" + dSuffix) .build()) .build()); result.put("SSHFP", ResourceRecordSet.<SSHFPData>builder().name("ipv4-" + rSuffix).type("SSHFP") .add(SSHFPData.createDSA("190E37C5B5DB9A1C455E648A41AF3CC83F99F102")) .add(SSHFPData.createDSA("290E37C5B5DB9A1C455E648A41AF3CC83F99F102")) .add(SSHFPData.createDSA("390E37C5B5DB9A1C455E648A41AF3CC83F99F102")).build()); result.put("TXT", txt("txt-" + rSuffix, asList("made in norway", "made in sweden", "made in finland"))); return result; } }