package denominator.denominatord; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import denominator.DNSApiManager; import denominator.Denominator; import denominator.mock.MockProvider; import denominator.model.ResourceRecordSet; import denominator.model.Zone; import denominator.model.profile.Geo; import denominator.model.profile.Weighted; import denominator.model.rdata.AData; import denominator.model.rdata.CNAMEData; import feign.Feign; import feign.FeignException; import feign.gson.GsonDecoder; import feign.gson.GsonEncoder; import static denominator.model.ResourceRecordSets.a; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; public class DenominatorDTest { static DNSApiManager mock; static DenominatorD server; static DenominatorDApi client; @BeforeClass public static void start() throws IOException { mock = Denominator.create(new MockProvider()); server = new DenominatorD(mock); int port = server.start(); client = Feign.builder() .encoder(new GsonEncoder()) .decoder(new GsonDecoder()) .target(DenominatorDApi.class, "http://localhost:" + port); mock.api().basicRecordSetsInZone("denominator.io.").put(ResourceRecordSet.<AData>builder() .name("www.denominator.io.") .type("A") .add(AData.create("192.0.2.1")).build()); mock.api().weightedRecordSetsInZone("denominator.io.").put(ResourceRecordSet.<CNAMEData>builder() .name("www.weighted.denominator.io.") .type("CNAME") .qualifier("EU-West") .weighted(Weighted.create(1)) .add(CNAMEData.create("www1.denominator.io.")).build()); mock.api().weightedRecordSetsInZone("denominator.io.").put(ResourceRecordSet.<CNAMEData>builder() .name("www.weighted.denominator.io.") .type("CNAME") .qualifier("US-West") .weighted(Weighted.create(1)) .add(CNAMEData.create("www2.denominator.io.")).build()); } @AfterClass public static void stop() throws IOException { server.shutdown(); } @Test public void healthcheckOK() { assertThat(client.healthcheck().status()).isEqualTo(200); } @Test public void zones() { assertThat(client.zones()) .containsAll(mock.api().zones()); } @Test public void zonesByName() { assertThat(client.zonesByName("denominator.io.")) .containsAll(toList(mock.api().zones().iterateByName("denominator.io."))); } @Test public void putZone_new() { Zone zone = Zone.create(null, "putzone_new.denominator.io.", 86400, "nil@denominator.io"); String id = client.putZone(zone).headers().get("Location").iterator().next().replace("/zones/", ""); assertThat(mock.api().zones().iterateByName(zone.name())) .containsExactly(Zone.create(id, zone.name(), zone.ttl(), zone.email())); } @Test public void putZone_update() { Zone zone = Zone.create(null, "putzone_update.denominator.io.", 86400, "nil@denominator.io"); String id = mock.api().zones().put(zone); Zone update = Zone.create(id, zone.name(), 300, "test@denominator.io"); client.putZone(update); assertThat(mock.api().zones().iterateByName(zone.name())) .containsExactly(update); } @Test public void deleteZone() { Zone zone = Zone.create(null, "zonetest.denominator.io.", 86400, "nil@denominator.io"); String id = mock.api().zones().put(zone); client.deleteZone(id); assertThat(mock.api().zones().iterateByName(zone.name())) .isEmpty(); } @Test public void recordSets() { assertThat(client.recordSets("denominator.io.")).isNotEmpty(); } @Test public void recordSetsWrongZoneIs400() { try { client.recordSets("moomoo.io."); } catch (FeignException e) { assertThat(e.getMessage()).startsWith("status 400"); } } @Test public void recordSetsByName() { ResourceRecordSet<AData> a = a("www.denominator.io.", asList("192.0.2.1", "198.51.100.1", "203.0.113.1")); mock.api().basicRecordSetsInZone("denominator.io.").put(a); assertThat(client.recordSetsByName("denominator.io.", a.name())) .containsExactly(a); } @Test public void recordSetsByNameWhenNotFound() { assertThat(client.recordSetsByName("denominator.io.", "moomoo.denominator.io.")).isEmpty(); } @Test public void recordSetsByNameAndType() { assertThat(client.recordSetsByNameAndType("denominator.io.", "denominator.io.", "NS")) .containsAll(toList(mock.api().recordSetsInZone("denominator.io.") .iterateByNameAndType("denominator.io.", "NS"))); } @Test public void recordSetsByNameAndTypeWhenNotFound() { assertThat(client.recordSetsByNameAndType("denominator.io.", "denominator.io.", "A")).isEmpty(); } @Test public void recordSetsByNameTypeAndQualifier() { ResourceRecordSet<CNAMEData> weighted = ResourceRecordSet.<CNAMEData>builder() .name("www.weighted.denominator.io.") .type("A") .qualifier("EU-West") .add(CNAMEData.create("www.denominator.io.")) .weighted(Weighted.create(10)) .build(); mock.api().weightedRecordSetsInZone("denominator.io.").put(weighted); assertThat(client.recordsetsByNameAndTypeAndQualifier("denominator.io.", weighted.name(), weighted.type(), weighted.qualifier())) .containsOnly(weighted); } @Test public void recordSetsByNameTypeAndQualifierWhenNotFound() { assertThat(client.recordsetsByNameAndTypeAndQualifier("denominator.io.", "www.weighted.denominator.io.", "CNAME", "AU-West")).isEmpty(); } @Test public void deleteRecordSetByNameAndType() { client.deleteRecordSetByNameAndType("denominator.io.", "www1.denominator.io.", "A"); assertThat(client.recordSetsByNameAndType("denominator.io.", "www1.denominator.io.", "A")) .isEmpty(); } @Test public void deleteRecordSetByNameAndTypeWhenNotFound() { client.deleteRecordSetByNameAndType("denominator.io.", "denominator.io.", "A"); } @Test public void deleteRecordSetByNameTypeAndQualifier() { client.deleteRecordSetByNameTypeAndQualifier("denominator.io.", "www.weighted.denominator.io.", "CNAME", "US-West"); assertThat(client.recordsetsByNameAndTypeAndQualifier("denominator.io.", "www.weighted.denominator.io.", "CNAME", "US-West")).isEmpty(); } @Test public void deleteRecordSetByNameTypeAndQualifierWhenNotFound() { client.deleteRecordSetByNameTypeAndQualifier("denominator.io.", "www.weighted.denominator.io.", "CNAME", "AU-West"); } @Test public void putRecordSet() { Map<String, Collection<String>> antarctica = new LinkedHashMap<String, Collection<String>>(); antarctica.put("Antarctica", Arrays.asList("Bouvet Island", "French Southern Territories", "Antarctica")); ResourceRecordSet<CNAMEData> recordSet = ResourceRecordSet.<CNAMEData>builder() .name("www.beta.denominator.io.") .type("CNAME") .qualifier("Antarctica") .ttl(300) .add(CNAMEData.create("www-south.denominator.io.")) .geo(Geo.create(antarctica)) .build(); client.putRecordSet("denominator.io.", recordSet); assertThat( client.recordSetsByNameAndType("denominator.io.", recordSet.name(), recordSet.type())) .containsOnly(recordSet); } static <T> List<T> toList(Iterator<T> iterator) { List<T> inMock = new ArrayList<T>(); while (iterator.hasNext()) { inMock.add(iterator.next()); } return inMock; } }