package denominator.profile;
import org.junit.FixMethodOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameter;
import denominator.AllProfileResourceRecordSetApi;
import denominator.DNSApiManager;
import denominator.Live;
import denominator.model.ResourceRecordSet;
import denominator.model.Zone;
import denominator.model.profile.Weighted;
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("weighted")
public class WeightedWriteCommandsLiveTest {
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() {
int i = 0;
for (String qualifier : new String[]{qualifier1, qualifier2}) {
assumeRRSetAbsent(zone, expected.name(), expected.type(), qualifier);
allApi(zone).put(ResourceRecordSet.builder()
.name(expected.name())
.type(expected.type())
.ttl(1800)
.qualifier(qualifier)
.weighted(Weighted.create(0))
.add(expected.records().get(i)).build());
ResourceRecordSet<?> rrs = weightedApi(zone)
.getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier);
assertThat(rrs)
.hasName(expected.name())
.hasType(expected.type())
.hasQualifier(qualifier)
.hasTtl(1800)
.hasWeight(0)
.containsExactlyRecords(expected.records().get(i++));
}
}
@Test
public void test2_replaceWeight() {
int heaviest = weightedApi(zone).supportedWeights().last();
weightedApi(zone).put(ResourceRecordSet.builder()
.name(expected.name())
.type(expected.type())
.ttl(1800)
.qualifier(qualifier1)
.weighted(Weighted.create(heaviest))
.add(expected.records().get(0)).build());
ResourceRecordSet<?> rrs1 = weightedApi(zone)
.getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier1);
assertThat(rrs1).hasWeight(heaviest);
ResourceRecordSet<?> rrs2 = weightedApi(zone)
.getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier2);
assertThat(rrs2).hasWeight(0);
}
@Test
public void test3_deleteOneQualifierDoesntAffectOther() {
weightedApi(zone).deleteByNameTypeAndQualifier(expected.name(), expected.type(), qualifier1);
ResourceRecordSet<?> rrs = weightedApi(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 = weightedApi(zone).getByNameTypeAndQualifier(expected.name(), expected.type(), qualifier2);
assertThat(rrs)
.hasName(expected.name())
.hasType(expected.type())
.hasQualifier(qualifier2);
// safe to call twice
weightedApi(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 WeightedResourceRecordSetApi weightedApi(Zone zone) {
WeightedResourceRecordSetApi
weightedOption =
manager.api().weightedRecordSetsInZone(zone.id());
assumeTrue("weighted not available or not available in zone " + zone, weightedOption != null);
return weightedOption;
}
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);
}
}