| /******************************************************************************* |
| * 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"); |
| } |
| } |