blob: 643c76609fa8f11e518a8b31989dfa223131babd [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010 Markus Alexander Kuppe.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Markus Alexander Kuppe (ecf-dev_eclipse.org <at> lemmster <dot> de) - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.tests.provider.dnssd;
import java.io.IOException;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.List;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.util.ECFRuntimeException;
import org.eclipse.ecf.discovery.IServiceProperties;
import org.eclipse.ecf.provider.dnssd.DnsSdDiscoveryAdvertiser;
import org.xbill.DNS.DClass;
import org.xbill.DNS.Message;
import org.xbill.DNS.Name;
import org.xbill.DNS.Record;
import org.xbill.DNS.SRVRecord;
import org.xbill.DNS.SimpleResolver;
import org.xbill.DNS.TSIG;
import org.xbill.DNS.TXTRecord;
import org.xbill.DNS.TextParseException;
import org.xbill.DNS.Type;
import org.xbill.DNS.Update;
import org.xbill.DNS.ZoneTransferException;
import org.xbill.DNS.ZoneTransferIn;
public class DnsSdAdvertiserServiceTest extends DnsSdAbstractDiscoveryTest {
public DnsSdAdvertiserServiceTest() {
super();
}
/* (non-Javadoc)
* @see org.eclipse.ecf.tests.discovery.AbstractDiscoveryTest#setUp()
*/
protected void setUp() throws Exception {
super.setUp();
// purge all SRV records from the test domain
ZoneTransferIn xfr = ZoneTransferIn.newAXFR(new Name(DnsSdTestHelper.REG_DOMAIN), DnsSdTestHelper.DNS_SERVER, null);
List records = xfr.run();
for (Iterator itr = records.iterator(); itr.hasNext();) {
Record record = (Record) itr.next();
String name = record.getName().toString();
if(name.startsWith("_" + DnsSdTestHelper.REG_SCHEME + "._" + DnsSdTestHelper.PROTO)) {
Update update = new Update(Name.fromString(DnsSdTestHelper.REG_DOMAIN + "."));
update.delete(record);
SimpleResolver resolver = new SimpleResolver(DnsSdTestHelper.DNS_SERVER);
resolver.setTCP(true);
resolver.setTSIGKey(new TSIG(DnsSdTestHelper.TSIG_KEY_NAME, DnsSdTestHelper.TSIG_KEY));
Message response = resolver.send(update);
int rcode = response.getRcode();
assertTrue("", rcode == 0);
}
}
}
private void createTXTRecords() throws TextParseException, IOException,
UnknownHostException {
final Name zone = Name.fromString(DnsSdTestHelper.REG_DOMAIN + ".");
final Name name = Name.fromString("_" + DnsSdTestHelper.REG_SCHEME + "._" + DnsSdTestHelper.PROTO, zone);
Update update = null;
final IServiceProperties properties = serviceInfo.getServiceProperties();
final Enumeration enumeration = properties.getPropertyNames();
while (enumeration.hasMoreElements()) {
final Object property = enumeration.nextElement();
final String key = property.toString();
final String value = (String) properties.getProperty(key).toString();
final Record record = Record.fromString(name, Type.TXT, DClass.IN,
serviceInfo.getTTL(), key + "=" + value, zone);
update = new Update(zone);
update.add(record);
}
final SimpleResolver resolver = new SimpleResolver(DnsSdTestHelper.DNS_SERVER);
resolver.setTCP(true);
resolver.setTSIGKey(new TSIG(DnsSdTestHelper.TSIG_KEY_NAME, DnsSdTestHelper.TSIG_KEY));
final Message response = resolver.send(update);
final int rcode = response.getRcode();
assertTrue("", rcode == 0);
}
private void createSRVRecord() throws TextParseException, IOException,
UnknownHostException {
// create a service manually
final Name zone = Name.fromString(DnsSdTestHelper.REG_DOMAIN + ".");
final Name type = Name.fromString("_" + DnsSdTestHelper.REG_SCHEME + "._" + DnsSdTestHelper.PROTO, zone);
final String s = serviceInfo.getPriority() + " " +
serviceInfo.getWeight() + " " +
serviceInfo.getLocation().getPort() + " " +
serviceInfo.getLocation().getHost() + ".";
final Record record = Record.fromString(type, Type.SRV, DClass.IN, DnsSdTestHelper.TTL, s, zone);
final Update update = new Update(zone);
update.add(record);
final SimpleResolver resolver = new SimpleResolver(DnsSdTestHelper.DNS_SERVER);
resolver.setTCP(true);
resolver.setTSIGKey(new TSIG(DnsSdTestHelper.TSIG_KEY_NAME, DnsSdTestHelper.TSIG_KEY));
final Message response = resolver.send(update);
final int rcode = response.getRcode();
assertTrue("", rcode == 0);
}
/* (non-Javadoc)
* @see org.eclipse.ecf.tests.provider.dnssd.DnsSdDiscoveryServiceTest#testRegisterService()
*/
public void testRegisterService() throws Exception {
// actually register the service
discoveryAdvertiser.registerService(serviceInfo);
// check postcondition service is registered
final ZoneTransferIn xfr = ZoneTransferIn.newAXFR(new Name(DnsSdTestHelper.REG_DOMAIN), DnsSdTestHelper.DNS_SERVER, null);
assertTrue("Mismatch between DNS response and IServiceInfo", comparator.compare(serviceInfo, xfr.run()) == 0);
}
/**
* Tests that a register is handled correctly when no key is present
* for that domain and the underlying ddns call fails
* @throws ContainerConnectException
*/
public void testRegisterServiceWithoutHostKey() throws ContainerConnectException {
final DnsSdDiscoveryAdvertiser advertiser = new DnsSdDiscoveryAdvertiser();
advertiser.connect(null, null);
try {
advertiser.registerService(serviceInfo);
} catch(ECFRuntimeException e) {
advertiser.disconnect();
return;
}
fail("Register should have failed without a host key given.");
}
/* (non-Javadoc)
* @see org.eclipse.ecf.tests.provider.dnssd.DnsSdDiscoveryServiceTest#testUnregisterService()
*/
public void testUnregisterService() throws ContainerConnectException, IOException, ZoneTransferException {
createSRVRecord();
// unregister via ECF discovery
discoveryAdvertiser.unregisterService(serviceInfo);
// check SRV record is gone
final ZoneTransferIn xfr = ZoneTransferIn.newAXFR(new Name(DnsSdTestHelper.REG_DOMAIN), DnsSdTestHelper.DNS_SERVER, null);
final List records = xfr.run();
for (final Iterator itr = records.iterator(); itr.hasNext();) {
final Record record = (Record) itr.next();
if(record instanceof SRVRecord) {
if(comparator.compare(serviceInfo, record) >= 0) {
fail("Service not removed/unregisterd");
}
}
}
}
/**
* Test that all service properties are removed along with the service
*/
public void testUnregisterServiceWithProperties() throws ContainerConnectException, IOException, ZoneTransferException {
createSRVRecord();
createTXTRecords();
// unregister via ECF discovery
discoveryAdvertiser.unregisterService(serviceInfo);
// check SRV record is gone
final ZoneTransferIn xfr = ZoneTransferIn.newAXFR(new Name(DnsSdTestHelper.REG_DOMAIN), DnsSdTestHelper.DNS_SERVER, null);
final List records = xfr.run();
for (final Iterator itr = records.iterator(); itr.hasNext();) {
final Record record = (Record) itr.next();
if(record instanceof SRVRecord) {
if(comparator.compare(serviceInfo, record) >= 0) {
fail("Service not removed/unregisterd");
}
} else if(record instanceof TXTRecord) {
if(comparator.compare(serviceInfo, record) >= 0) {
fail("TXT record not removed/unregisterd");
}
}
}
}
/**
* Test that all service properties are removed along with the service
*/
public void testUnregisterServiceWithForeignProperties() throws ContainerConnectException, IOException, ZoneTransferException {
fail("Not implemented yet");
}
/* (non-Javadoc)
* @see org.eclipse.ecf.tests.provider.dnssd.DnsSdDiscoveryServiceTest#testUnregisterAllServices()
*/
public void testUnregisterAllServices() throws ContainerConnectException {
//TODO make sure not to accidentally remove pre existing SRV records
fail("Not yet implemented");
}
}