package denominator.profile;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameter;
import java.util.Collection;
import java.util.Map;
import denominator.AllProfileResourceRecordSetApi;
import denominator.DNSApiManager;
import denominator.Live;
import denominator.model.ResourceRecordSet;
import denominator.model.Zone;
import denominator.model.profile.Geo;
import static denominator.assertj.ModelAssertions.assertThat;
import static java.lang.String.format;
import static org.junit.Assert.assertNull;
import static org.junit.Assume.assumeFalse;
import static org.junit.Assume.assumeTrue;
import static org.junit.runners.MethodSorters.NAME_ASCENDING;
@FixMethodOrder(NAME_ASCENDING)
@RunWith(Live.Write.class)
@Live.Write.Profile("geo")
public class GeoWriteCommandsLiveTest {
private final String qualifier1 = "US-East";
private final String qualifier2 = "US-West";
@Parameter(0)
public DNSApiManager manager;
@Parameter(1)
public Zone zone;
@Parameter(2)
public ResourceRecordSet<?> expected;
@Test
public void test1_putNewRRS() {
Map<String, Collection<String>> regions = geoApi(zone).supportedRegions();
Regions regionsForTest = new Regions(regions);
Map<String, Collection<String>> allButLastTerritory = regionsForTest.allButLastTerritory();
Map<String, Collection<String>> onlyLastTerritory = regionsForTest.onlyLastTerritory();
int i = 0;
for (String qualifier : new String[]{qualifier1, qualifier2}) {
assumeRRSetAbsent(zone, expected.name(), expected.type(), qualifier);
Geo territories = Geo.create(i == 0 ? allButLastTerritory : onlyLastTerritory);
allApi(zone).put(ResourceRecordSet.builder()
.name(expected.name())
.type(expected.type())
.ttl(1800)
.qualifier(qualifier)
.geo(territories)
.add(expected.records().get(i)).build());
ResourceRecordSet<?>
rrs =
geoApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier);
assertThat(rrs)
.hasName(expected.name())
.hasType(expected.type())
.hasQualifier(qualifier)
.hasTtl(1800)
.hasGeo(territories)
.containsExactlyRecords(expected.records().get(i++));
}
}
@Test
public void test2_yankTerritoryIntoAnotherRRSet() {
ResourceRecordSet<?> rrs1 = geoApi(zone)
.getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier1);
Regions regionsFrom1 = new Regions(rrs1.geo().regions());
ResourceRecordSet<?> rrs2 = geoApi(zone)
.getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier2);
Map<String, Collection<String>> plus1 = regionsFrom1.plusLastTerritory(rrs2.geo().regions());
geoApi(zone).put(ResourceRecordSet.builder()
.name(expected.name())
.type(expected.type())
.qualifier(qualifier2)
.ttl(rrs2.ttl())
.geo(Geo.create(plus1))
.addAll(rrs2.records()).build());
rrs1 = geoApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier1);
assertThat(rrs1).hasGeo(Geo.create(regionsFrom1.allButLastTerritory()));
rrs2 = geoApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier2);
assertThat(rrs2).hasGeo(Geo.create(plus1));
}
@Test
public void test3_changeTTLWithAllProfileApi() {
int i = 0;
for (String qualifier : new String[]{qualifier1, qualifier2}) {
ResourceRecordSet<?>
rrs =
geoApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier);
int ttl = (rrs.ttl() != null ? rrs.ttl() : 60000) + 60000;
Geo oldGeo = rrs.geo();
allApi(zone).put(ResourceRecordSet.builder()
.name(expected.name())
.type(expected.type())
.ttl(ttl)
.qualifier(qualifier)
.geo(oldGeo)
.add(expected.records().get(i)).build());
rrs = geoApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier);
assertThat(rrs)
.hasName(expected.name())
.hasType(expected.type())
.hasQualifier(qualifier)
.hasTtl(ttl)
.hasGeo(oldGeo)
.containsExactlyRecords(expected.records().get(i++));
}
}
@Test
public void test4_deleteOneQualifierDoesntAffectOther() {
geoApi(zone).deleteByNameTypeAndQualifier(expected.name(), expected.type(), qualifier1);
ResourceRecordSet<?>
rrs =
geoApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier1);
assertNull(format("recordset(%s, %s, %s) still present in %s",
expected.name(), expected.type(), qualifier1, zone), rrs);
rrs = geoApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier2);
assertThat(rrs)
.hasName(expected.name())
.hasType(expected.type())
.hasQualifier(qualifier2);
// safe to call twice
geoApi(zone).deleteByNameTypeAndQualifier(expected.name(), expected.type(), qualifier1);
// clean up the other one
allApi(zone).deleteByNameAndType(expected.name(), expected.type());
rrs = allApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier2);
assertNull(format("recordset(%s, %s, %s) still present in %s",
expected.name(), expected.type(), qualifier2, zone), rrs);
}
// TODO
private AllProfileResourceRecordSetApi allApi(Zone zone) {
return manager.api().recordSetsInZone(zone.id());
}
private GeoResourceRecordSetApi geoApi(Zone zone) {
GeoResourceRecordSetApi geoOption = manager.api().geoRecordSetsInZone(zone.id());
assumeTrue("geo not available or not available in zone " + zone, geoOption != null);
return geoOption;
}
private void assumeRRSetAbsent(Zone zone, String name, String type, String qualifier) {
assumeFalse(format("recordset(%s, %s, %s) already exists in %s", name, type, qualifier, zone),
allApi(zone).getByNameTypeAndQualifier(name, type, qualifier) != null);
}
}