package com.verisign.iot.discovery.services;
import com.verisign.iot.discovery.commons.Constants;
import com.verisign.iot.discovery.domain.Fqdn;
import com.verisign.iot.discovery.domain.ServiceInstance;
import com.verisign.iot.discovery.domain.TextRecord;
import com.verisign.iot.discovery.exceptions.ConfigurationException;
import com.verisign.iot.discovery.exceptions.LookupException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Observable;
import java.util.Observer;
import java.util.Set;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* @author pmaresca <pmaresca@verisign.com>
*/
public class DnsServicesDiscoveryTest implements Observer
{
public static final String DNS_RESOVLER = "198.41.1.1";
public static final String DNS_RESOVLER_1 = "8.8.8.8";
public static final String BAD_RESOVLER = "1.2.3.4";
public static final String SERVICE_TYPE = "coapspecial";
public static final String SERVICE_DOMAIN = "n67423p6tgxq.1.iotverisign.com";
public static final String SERVICE_DOMAIN_1 = "kfjljohydgsa.1.iotqa.end-points.com";
public static final String TEST_DOMAIN = "com";
public static final String SERVICE_LABEL = "coap";
public static final String SERVICE_TYPE_1 = "mqft";
public static final String SERVICE_NAME = "_coapspecial._udp.avu7unxcs7ia.1.iotverisign.com";
public static final String SERVICE_TEXT = "f5j4pf5vaw1osjnj4nggdmy2ycl1axlm64knkrayhfsstcxe56ctwnxho1coap";
public static final String BAD_SERVICE_DOMAIN = "google.totosdfgsdfgsdfgsdfgsdfgsdfgsdfgsdfg";
private DnsServicesDiscovery discovery;
public DnsServicesDiscoveryTest()
{
}
@Before
public void setUp() {}
@After
public void tearDown() {}
@Test
public void listServiceInstances()
{
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.dnsServer(InetAddress.getByName(DNS_RESOVLER))
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.introspected(true)
.observer(this)
.checkConfiguration(true);
} catch (UnknownHostException ex) {
Assert.fail("Expected correct initialization, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
Fqdn name = new Fqdn(SERVICE_DOMAIN);
try {
Set<ServiceInstance> inst = this.discovery.listServiceInstances(name, SERVICE_TYPE, false);
Assert.assertTrue(inst.size() > 0);
} catch (LookupException ex) {
Assert.fail("Expected successful lookup, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
}
@Test
public void listServiceInstancesError()
{
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.dnsServer(InetAddress.getByName(DNS_RESOVLER))
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.introspected(true)
.observer(this)
.checkConfiguration(true);
} catch (UnknownHostException ex) {
Assert.fail("Expected correct initialization, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
Fqdn name = new Fqdn(SERVICE_DOMAIN_1);
try {
Set<ServiceInstance> inst = this.discovery.listServiceInstances(name, SERVICE_TYPE_1, false);
Assert.assertTrue(true);
} catch (LookupException ex) {
Assert.fail("Expected an empty set");
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
}
@Test
public void listServiceInstancesErrorDomainNotExistent()
{
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.dnsServer(InetAddress.getByName(DNS_RESOVLER_1))
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.introspected(true)
.observer(this)
.checkConfiguration(true);
} catch (UnknownHostException ex) {
Assert.fail("Expected correct initialization, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
Fqdn name = new Fqdn("habla.1.iotverisign.com");
try {
Set<ServiceInstance> inst = this.discovery.listServiceInstances(name, "mqtt", false);
Assert.assertTrue(true);
} catch (LookupException ex) {
Assert.fail("Expected an empty set");
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
}
@Test
public void checkDnsSecError()
{
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.dnsServer(InetAddress.getByName(DNS_RESOVLER))
.introspected(true)
.observer(this)
.checkConfiguration(true);
this.discovery.isDnsSecValid(new Fqdn(BAD_SERVICE_DOMAIN));
Assert.fail("Expected DNSSEC validation failure");
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
} catch (UnknownHostException ex) {
Assert.fail("Expected correct retrieval of localhost, not " + ex.toString());
} catch (LookupException ex) {
Assert.assertTrue(true);
}
}
@Test
public void checkDnsSecErrorNonExistentDNS() {
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.dnsServer(InetAddress.getByName("127.1.1.1"))
.introspected(true)
.observer(this)
.checkConfiguration(true);
this.discovery.isDnsSecValid(new Fqdn("google.com"));
Assert.fail("Expected DNSSEC validation failure");
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
} catch (UnknownHostException ex) {
Assert.fail("Expected correct retrieval of localhost, not " + ex.toString());
} catch (LookupException ex) {
Assert.assertTrue(true);
}
}
@Test
public void checkDnsSec()
{
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.dnsServer(InetAddress.getByName(DNS_RESOVLER))
.introspected(true)
.observer(this)
.checkConfiguration(true);
this.discovery.isDnsSecValid(new Fqdn(SERVICE_NAME));
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
} catch (UnknownHostException ex) {
Assert.fail("Expected correct retrieval of localhost, not " + ex.toString());
} catch (LookupException ex) {
Assert.fail("Expected correct validation, not " + ex.toString());
}
}
@Test
public void checkDnsSecInvalid() {
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.dnsServer(InetAddress.getByName("1.2.3.4"))
.introspected(true)
.observer(this)
.checkConfiguration(true);
this.discovery.isDnsSecValid(new Fqdn("google.coma"));
Assert.fail("Expected a Lookup Error: non-existing Resolver");
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
catch (UnknownHostException ex) {
Assert.fail("Expected correct retrieval of localhost, not " + ex.toString());
}
catch (LookupException ex) {
Assert.assertTrue(true);
}
}
@Test
public void listServiceTypes()
{
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.dnsServer(InetAddress.getByName(DNS_RESOVLER))
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
. introspected(true)
.observer(this)
.checkConfiguration(true);
} catch (UnknownHostException ex) {
Assert.fail("Expected correct initialization, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
Fqdn name = new Fqdn(SERVICE_DOMAIN);
try {
Set<String> typ = this.discovery.listServiceTypes(name, false);
Assert.assertTrue(typ.size() > 0);
} catch (LookupException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
}
@Test
public void listServiceTexts()
{
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.dnsServer(InetAddress.getByName(DNS_RESOVLER))
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.introspected(true)
.observer(this)
.checkConfiguration(true);
} catch (UnknownHostException ex) {
Assert.fail("Expected correct initialization, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
Fqdn name = new Fqdn(SERVICE_DOMAIN);
Set<TextRecord> rec = null;
try {
rec = this.discovery.listTextRecords(name, SERVICE_LABEL, false);
Assert.assertTrue(rec.isEmpty());
} catch (LookupException ex) {
Assert.assertTrue(true);
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
try {
name = new Fqdn(SERVICE_NAME);
rec = this.discovery.listTextRecords(name, SERVICE_TEXT, false);
Assert.assertTrue(rec.size() == 1);
} catch (LookupException ex) {
Assert.fail("Expected correct initialization, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
}
@Test
public void listServiceTextsBadResolver()
{
try {
this.discovery = new DnsServicesDiscovery();
this.discovery.dnsSecDomain(Constants.DEFAULT_DNSSEC_DOMAIN)
.dnsServer(InetAddress.getByName(BAD_RESOVLER))
.trustAnchorDefault(Constants.DEFAULT_TRUST_ANCHOR)
.introspected(true)
.observer(this)
.checkConfiguration(true);
} catch (UnknownHostException ex) {
Assert.fail("Expected correct initialization, not " + ex.toString());
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
Fqdn name = new Fqdn(TEST_DOMAIN);
Set<TextRecord> rec = null;
try {
rec = this.discovery.listTextRecords(name, "example", true);
Assert.fail("Expected a Lookup Exception");
} catch (LookupException ex) {
Assert.assertTrue(true);
} catch (ConfigurationException ex) {
Assert.fail("Expected correct configuration, not " + ex.toString());
}
}
@Override
public void update(Observable o, Object o1)
{
System.out.println(o1.toString());
}
}