/******************************************************************************* * Copyright (c) 2008 Versant Corp. * 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 Kuppe (mkuppe <at> versant <dot> com) - initial API and implementation ******************************************************************************/ package ch.ethz.iks.slp.test; import java.util.Dictionary; import java.util.Enumeration; import java.util.Hashtable; import junit.framework.Assert; import junit.framework.TestCase; import ch.ethz.iks.slp.ServiceLocationEnumeration; import ch.ethz.iks.slp.ServiceLocationException; import ch.ethz.iks.slp.ServiceType; import ch.ethz.iks.slp.ServiceURL; public class SelfDiscoveryTest extends TestCase { private final String HOST_AND_PORT = System.getProperty("net.slp.tests.hostAndPort", "gantenbein:123"); private ServiceURL service; private Dictionary properties; /* (non-Javadoc) * @see junit.framework.TestCase#setUp() */ public void setUp() throws InterruptedException { try { service = new ServiceURL("service:osgi://" + HOST_AND_PORT, 10800); int i = 0; properties = new Hashtable(); properties.put("attr", Boolean.FALSE); properties.put("attr" + i++, "value"); properties.put("attr" + i++, "foo,bar"); properties.put("attr" + i++, "foo:bar"); properties.put("attr" + i++, "foo bar"); TestActivator.advertiser.register(service, properties); } catch (ServiceLocationException e) { Assert.fail(e.getMessage()); e.printStackTrace(); } } /* (non-Javadoc) * @see junit.framework.TestCase#tearDown() */ public void tearDown() throws InterruptedException { try { TestActivator.advertiser.deregister(service); } catch (ServiceLocationException e) { Assert.fail(e.getMessage()); e.printStackTrace(); } } /** * Test method for * {@link ch.ethz.iks.slp.Locator}. */ public void testService() throws Exception { int count = 0; for (ServiceLocationEnumeration services = TestActivator.locator .findServices(new ServiceType("service:osgi"), null, null); services .hasMoreElements();) { assertEquals(services.next().toString(), "service:osgi://" + HOST_AND_PORT); count++; } assertEquals(1, count); } /** * Test method for * {@link ch.ethz.iks.slp.Locator}. */ public void testAttributes() throws Exception { int count = 0; // not fast but DRY outter: for (ServiceLocationEnumeration attributes = TestActivator.locator .findAttributes(new ServiceType("service:osgi"), null, null); attributes .hasMoreElements();) { final String attribute = attributes.next().toString(); // inner loop over the dict Enumeration elements = properties.keys(); for(;elements.hasMoreElements();) { String key= elements.nextElement().toString(); String value = properties.get(key).toString(); if(attribute.equals(("(" + key + "=" + value + ")"))) { count++; continue outter; } } fail(attribute + " not found in reference " + properties.toString()); } assertEquals(properties.size(), count); } /** * Test method for * {@link ch.ethz.iks.slp.Locator}. */ public void testFilter() throws Exception { int count = 0; for (ServiceLocationEnumeration services = TestActivator.locator .findServices(new ServiceType("service:osgi"), null, "(attr=false)"); services.hasMoreElements();) { assertEquals(services.next().toString(), "service:osgi://" + HOST_AND_PORT); count++; } assertEquals(1, count); } /** * Test method for * {@link ch.ethz.iks.slp.Locator}. */ public void testFilterWithWildcard() throws Exception { int count = 0; for (ServiceLocationEnumeration services = TestActivator.locator .findServices(new ServiceType("service:osgi"), null, "(attr=*)"); services .hasMoreElements();) { assertEquals(services.next().toString(), "service:osgi://" + HOST_AND_PORT); count++; } assertEquals(1, count); } /** * Test method for * {@link ch.ethz.iks.slp.Locator}. * * [1] http://www.faqs.org/rfcs/rfc1960.html * Cite: If a <value> must contain one of the characters '*' or '(' or ')', these * characters should be escaped by preceding them with the backslash '\' character. */ public void testFilterWithBrokenParenthesis() throws Exception { try { // correct filter is (service-type=\(service:osgi\)) TestActivator.locator.findServices(new ServiceType("service:osgi"), null, "(service-type=(service:osgi))"); } catch (ServiceLocationException e) { if(e.getErrorCode() == 20) { return; } } fail(); } }