Package org.eclipse.ecf.tests.provider.dnssd

Source Code of org.eclipse.ecf.tests.provider.dnssd.DnsSdAdvertiserServiceTest

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

Related Classes of org.eclipse.ecf.tests.provider.dnssd.DnsSdAdvertiserServiceTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.