package denominator.model;
import org.junit.Test;
import org.junit.experimental.runners.Enclosed;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.Map;
import denominator.ResourceTypeToValue;
import denominator.model.profile.Geo;
import denominator.model.rdata.AAAAData;
import denominator.model.rdata.AData;
import denominator.model.rdata.CERTData;
import denominator.model.rdata.CNAMEData;
import denominator.model.rdata.MXData;
import denominator.model.rdata.NAPTRData;
import denominator.model.rdata.NSData;
import denominator.model.rdata.PTRData;
import denominator.model.rdata.SPFData;
import denominator.model.rdata.SRVData;
import denominator.model.rdata.SSHFPData;
import denominator.model.rdata.TXTData;
import static denominator.assertj.ModelAssertions.assertThat;
import static denominator.model.ResourceRecordSets.a;
import static denominator.model.ResourceRecordSets.aaaa;
import static denominator.model.ResourceRecordSets.cert;
import static denominator.model.ResourceRecordSets.cname;
import static denominator.model.ResourceRecordSets.mx;
import static denominator.model.ResourceRecordSets.nameAndTypeEqualTo;
import static denominator.model.ResourceRecordSets.nameEqualTo;
import static denominator.model.ResourceRecordSets.nameTypeAndQualifierEqualTo;
import static denominator.model.ResourceRecordSets.naptr;
import static denominator.model.ResourceRecordSets.ns;
import static denominator.model.ResourceRecordSets.ptr;
import static denominator.model.ResourceRecordSets.spf;
import static denominator.model.ResourceRecordSets.srv;
import static denominator.model.ResourceRecordSets.sshfp;
import static denominator.model.ResourceRecordSets.txt;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@RunWith(Enclosed.class)
public class ResourceRecordSetsTest {
ResourceRecordSet<AData> aRRS = ResourceRecordSet.<AData>builder()
.name("www.denominator.io.")
.type("A")
.ttl(3600)
.add(AData.create("192.0.2.1")).build();
ResourceRecordSet<AData> geoRRS = ResourceRecordSet.<AData>builder()
.name("www.denominator.io.")
.type("A")
.qualifier("US-East")
.ttl(3600)
.add(AData.create("1.1.1.1"))
.geo(Geo.create(new LinkedHashMap<String, Collection<String>>() {
{
put("US", Arrays.asList("US-VA"));
}
})).build();
@Test
public void nameEqualToReturnsFalseOnNull() {
assertFalse(nameEqualTo(aRRS.name()).apply(null));
}
@Test
public void nameEqualToReturnsFalseOnDifferentName() {
assertFalse(nameEqualTo("www.foo.com").apply(aRRS));
}
@Test
public void nameEqualToReturnsTrueOnSameName() {
assertTrue(nameEqualTo(aRRS.name()).apply(aRRS));
}
@Test
public void typeEqualToReturnsFalseOnNull() {
assertFalse(nameAndTypeEqualTo(aRRS.name(), aRRS.type()).apply(null));
}
@Test
public void typeEqualToReturnsFalseOnDifferentType() {
assertFalse(nameAndTypeEqualTo(aRRS.name(), "TXT").apply(aRRS));
}
@Test
public void typeEqualToReturnsTrueOnSameType() {
assertTrue(nameAndTypeEqualTo(aRRS.name(), aRRS.type()).apply(aRRS));
}
@Test
public void containsRecordReturnsFalseOnNull() {
assertFalse(ResourceRecordSets.containsRecord(aRRS.records().get(0)).apply(null));
}
@Test
public void containsRecordReturnsFalseWhenRDataDifferent() {
assertFalse(ResourceRecordSets.containsRecord(AData.create("198.51.100.1")).apply(aRRS));
}
@Test
public void containsRecordReturnsTrueWhenRDataEqual() {
assertTrue(ResourceRecordSets.containsRecord(AData.create("192.0.2.1")).apply(aRRS));
}
@Test
public void containsRecordReturnsTrueWhenRDataEqualButDifferentType() {
Map<String, String> record = new LinkedHashMap<String, String>();
record.put("address", "192.0.2.1");
assertTrue(ResourceRecordSets.containsRecord(record).apply(aRRS));
}
@Test
public void qualifierEqualToReturnsFalseOnNull() {
assertFalse(
nameTypeAndQualifierEqualTo(geoRRS.name(), geoRRS.type(), geoRRS.qualifier()).apply(null));
}
@Test
public void qualifierEqualToReturnsFalseOnDifferentQualifier() {
assertFalse(nameTypeAndQualifierEqualTo(geoRRS.name(), geoRRS.type(), "TXT").apply(geoRRS));
}
@Test
public void qualifierEqualToReturnsFalseOnAbsentQualifier() {
assertFalse(nameTypeAndQualifierEqualTo(geoRRS.name(), geoRRS.type(), "TXT").apply(aRRS));
}
@Test
public void qualifierEqualToReturnsTrueOnSameQualifier() {
assertTrue(nameTypeAndQualifierEqualTo(geoRRS.name(), geoRRS.type(), geoRRS.qualifier())
.apply(geoRRS));
}
@RunWith(Parameterized.class)
public static class ShortFormEqualsLongFormTest {
private final ResourceRecordSet<?> shortForm;
private final ResourceRecordSet<?> longForm;
public ShortFormEqualsLongFormTest(ResourceRecordSet<?> shortForm,
ResourceRecordSet<?> longForm) {
this.shortForm = shortForm;
this.longForm = longForm;
}
@Parameterized.Parameters
public static Iterable<Object[]> data() {
Object[][] data = new Object[33][2];
data[0][0] = a("www.denominator.io.", "192.0.2.1");
data[0][1] = ResourceRecordSet.<AData>builder()
.name("www.denominator.io.")
.type("A")
.add(AData.create("192.0.2.1")).build();
data[1][0] = a("www.denominator.io.", 3600, "192.0.2.1");
data[1][1] = ResourceRecordSet.<AData>builder()
.name("www.denominator.io.")
.type("A")
.ttl(3600)
.add(AData.create("192.0.2.1")).build();
data[2][0] = a("www.denominator.io.", Arrays.asList("192.0.2.1"));
data[2][1] = data[0][1];
data[3][0] = a("www.denominator.io.", 3600, Arrays.asList("192.0.2.1"));
data[3][1] = data[1][1];
data[4][0] = aaaa("www.denominator.io.", "1234:ab00:ff00::6b14:abcd");
data[4][1] = ResourceRecordSet.<AAAAData>builder()
.name("www.denominator.io.")
.type("AAAA")
.add(AAAAData.create("1234:ab00:ff00::6b14:abcd")).build();
data[5][0] = aaaa("www.denominator.io.", 3600, "1234:ab00:ff00::6b14:abcd");
data[5][1] = ResourceRecordSet.<AAAAData>builder()
.name("www.denominator.io.")
.type("AAAA")
.ttl(3600)
.add(AAAAData.create("1234:ab00:ff00::6b14:abcd")).build();
data[6][0] = aaaa("www.denominator.io.", Arrays.asList("1234:ab00:ff00::6b14:abcd"));
data[6][1] = data[4][1];
data[7][0] = aaaa("www.denominator.io.", 3600, Arrays.asList("1234:ab00:ff00::6b14:abcd"));
data[7][1] = data[5][1];
data[8][0] = cname("www.denominator.io.", "www1.denominator.io.");
data[8][1] = ResourceRecordSet.<CNAMEData>builder()
.name("www.denominator.io.")
.type("CNAME")
.add(CNAMEData.create("www1.denominator.io.")).build();
data[9][0] = cname("www.denominator.io.", 3600, "www1.denominator.io.");
data[9][1] = ResourceRecordSet.<CNAMEData>builder()
.name("www.denominator.io.")
.type("CNAME")
.ttl(3600)
.add(CNAMEData.create("www1.denominator.io.")).build();
data[10][0] = cname("www.denominator.io.", Arrays.asList("www1.denominator.io."));
data[10][1] = data[8][1];
data[11][0] = cname("www.denominator.io.", 3600, Arrays.asList("www1.denominator.io."));
data[11][1] = data[9][1];
data[12][0] = ns("denominator.io.", "ns.denominator.io.");
data[12][1] = ResourceRecordSet.<NSData>builder()
.name("denominator.io.")
.type("NS")
.add(NSData.create("ns.denominator.io.")).build();
data[13][0] = ns("denominator.io.", 3600, "ns.denominator.io.");
data[13][1] = ResourceRecordSet.<NSData>builder()
.name("denominator.io.")
.type("NS")
.ttl(3600)
.add(NSData.create("ns.denominator.io.")).build();
data[14][0] = ns("denominator.io.", Arrays.asList("ns.denominator.io."));
data[14][1] = data[12][1];
data[15][0] = ns("denominator.io.", 3600, Arrays.asList("ns.denominator.io."));
data[15][1] = data[13][1];
data[16][0] = ptr("denominator.io.", "ptr.denominator.io.");
data[16][1] = ResourceRecordSet.<PTRData>builder()
.name("denominator.io.")
.type("PTR")
.add(PTRData.create("ptr.denominator.io.")).build();
data[17][0] = ptr("denominator.io.", 3600, "ptr.denominator.io.");
data[17][1] = ResourceRecordSet.<PTRData>builder()
.name("denominator.io.")
.type("PTR")
.ttl(3600)
.add(PTRData.create("ptr.denominator.io.")).build();
data[18][0] = ptr("denominator.io.", Arrays.asList("ptr.denominator.io."));
data[18][1] = data[16][1];
data[19][0] = ptr("denominator.io.", 3600, Arrays.asList("ptr.denominator.io."));
data[19][1] = data[17][1];
data[20][0] = txt("denominator.io.", "\"made in sweden\"");
data[20][1] = ResourceRecordSet.<TXTData>builder()
.name("denominator.io.")
.type("TXT")
.add(TXTData.create("\"made in sweden\"")).build();
data[21][0] = txt("denominator.io.", 3600, "\"made in sweden\"");
data[21][1] = ResourceRecordSet.<TXTData>builder()
.name("denominator.io.")
.type("TXT")
.ttl(3600)
.add(TXTData.create("\"made in sweden\"")).build();
data[22][0] = txt("denominator.io.", Arrays.asList("\"made in sweden\""));
data[22][1] = data[20][1];
data[23][0] = txt("denominator.io.", 3600, Arrays.asList("\"made in sweden\""));
data[23][1] = data[21][1];
data[24][0] = spf("denominator.io.", "\"v=spf1 a mx -all\"");
data[24][1] = ResourceRecordSet.<SPFData>builder()
.name("denominator.io.")
.type("SPF")
.add(SPFData.create("\"v=spf1 a mx -all\"")).build();
data[25][0] = spf("denominator.io.", 3600, "\"v=spf1 a mx -all\"");
data[25][1] = ResourceRecordSet.<SPFData>builder()
.name("denominator.io.")
.type("SPF")
.ttl(3600)
.add(SPFData.create("\"v=spf1 a mx -all\"")).build();
data[26][0] = spf("denominator.io.", Arrays.asList("\"v=spf1 a mx -all\""));
data[26][1] = data[24][1];
data[27][0] = spf("denominator.io.", 3600, Arrays.asList("\"v=spf1 a mx -all\""));
data[27][1] = data[25][1];
data[28][0] = mx("denominator.io.", 3600, Arrays.asList("1 mx1.denominator.io."));
data[28][1] = ResourceRecordSet.<MXData>builder()
.name("denominator.io.")
.type("MX")
.ttl(3600)
.add(MXData.create(1, "mx1.denominator.io.")).build();
data[29][0] = srv("denominator.io.", 3600, Arrays.asList("0 1 80 srv.denominator.io."));
data[29][1] = ResourceRecordSet.<SRVData>builder()
.name("denominator.io.")
.type("SRV")
.ttl(3600)
.add(SRVData.builder().priority(0).weight(1).port(80).target("srv.denominator.io.")
.build())
.build();
data[30][0] = cert("www.denominator.io.", 3600, Arrays.asList("12345 1 1 B33F"));
data[30][1] = ResourceRecordSet.<CERTData>builder()
.name("www.denominator.io.")
.type("CERT")
.ttl(3600)
.add(CERTData.builder().format(12345).tag(1).algorithm(1).certificate("B33F").build())
.build();
data[31][0] =
naptr("phone.denominator.io.", 3600,
Arrays.asList("1 1 U E2U+sip !^.*$!sip:customer-service@example.com! ."));
data[31][1] = ResourceRecordSet.<NAPTRData>builder()
.name("phone.denominator.io.")
.type("NAPTR")
.ttl(3600)
.add(NAPTRData.builder().order(1).preference(1).flags("U").services("E2U+sip")
.regexp("!^.*$!sip:customer-service@example.com!").replacement(".").build())
.build();
data[32][0] =
sshfp("server1.denominator.io.", 3600,
Arrays.asList("2 1 123456789abcdef67890123456789abcdef67890"));
data[32][1] = ResourceRecordSet.<SSHFPData>builder()
.name("server1.denominator.io.")
.type("SSHFP")
.ttl(3600)
.add(SSHFPData.createDSA("123456789abcdef67890123456789abcdef67890")).build();
return Arrays.asList(data);
}
@Test
public void shortFormEqualsLongForm() throws IOException {
assertThat(shortForm)
.isEqualTo(longForm)
.hasName(longForm.name())
.hasType(longForm.type())
.hasTtl(longForm.ttl())
.containsExactlyRecords(longForm.records());
ResourceTypeToValue.lookup(longForm.type());
}
}
}