/**************************************************************************** * Copyright (c) 2009 Composent, Inc. and others. * 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: * Composent, Inc. - initial API and implementation * Markus Alexander Kuppe (ecf-dev_eclipse.org <at> lemmster <dot> de) - Reworked completely *****************************************************************************/ package org.eclipse.ecf.tests.discovery; import java.util.Arrays; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.ecf.core.ContainerConnectException; import org.eclipse.ecf.core.events.IContainerEvent; import org.eclipse.ecf.core.util.ECFRuntimeException; import org.eclipse.ecf.discovery.IServiceEvent; import org.eclipse.ecf.discovery.IServiceInfo; import org.eclipse.ecf.discovery.identity.IServiceTypeID; import org.eclipse.ecf.tests.discovery.listener.TestServiceListener; import org.eclipse.ecf.tests.discovery.listener.TestServiceTypeListener; import org.eclipse.equinox.concurrent.future.IFuture; public abstract class DiscoveryTest extends AbstractDiscoveryTest { protected long waitTimeForProvider = 1000; protected int eventsToExpect = 1; public DiscoveryTest(String name) { super(name); } protected void setWaitTimeForProvider(long aWaitTimeForProvider) { this.waitTimeForProvider = aWaitTimeForProvider + (aWaitTimeForProvider * 1 / 2); } protected void registerService(IServiceInfo serviceInfo) throws Exception { assertNotNull(serviceInfo); assertNotNull(discoveryAdvertiser); discoveryAdvertiser.registerService(serviceInfo); } protected void unregisterService(IServiceInfo serviceInfo) throws Exception { assertNotNull(serviceInfo); assertNotNull(discoveryAdvertiser); discoveryAdvertiser.unregisterService(serviceInfo); } /* * (non-Javadoc) * @see junit.framework.TestCase#tearDown() */ protected void tearDown() throws Exception { discoveryAdvertiser.unregisterService(serviceInfo); discoveryLocator.purgeCache(); super.tearDown(); } protected void registerService() { try { discoveryAdvertiser.registerService(serviceInfo); } catch (final ECFRuntimeException e) { fail("IServiceInfo may be valid with this IDCA " + e.getMessage()); } } protected void unregisterService() { try { discoveryAdvertiser.unregisterService(serviceInfo); } catch (final ECFRuntimeException e) { fail("unregistering of " + serviceInfo + " should just work"); } } protected void addListenerRegisterAndWait(TestServiceListener testServiceListener, IServiceInfo aServiceInfo) { synchronized (testServiceListener) { // register a service which we expect the test listener to get notified of registerService(); try { testServiceListener.wait(waitTimeForProvider); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); fail("Some discovery unrelated threading issues?"); } } } protected void addServiceListener(TestServiceListener serviceListener) { discoveryLocator.addServiceListener(serviceListener); addListenerRegisterAndWait(serviceListener, serviceInfo); discoveryLocator.removeServiceListener(serviceListener); IContainerEvent[] event = serviceListener.getEvent(); assertNotNull("Test listener didn't receive any discovery event", event); assertEquals("Test listener received unexpected amount of discovery events: \n\t" + Arrays.asList(event), eventsToExpect, event.length); IServiceInfo serviceInfo2 = ((IServiceEvent) event[eventsToExpect - 1]).getServiceInfo(); assertTrue("IServiceInfo should match, expected:\n\t" + serviceInfo + " but was \n\t" + serviceInfo2, comparator.compare(serviceInfo2, serviceInfo) == 0); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#getServiceInfo(org.eclipse.ecf.discovery.identity.IServiceID)}. * @throws ContainerConnectException */ public void testGetServiceInfo() throws ContainerConnectException { registerService(); final IServiceInfo info = discoveryLocator.getServiceInfo(serviceInfo.getServiceID()); assertTrue("IServiceInfo should match, expected:\n\t" + serviceInfo + " but:\n\t" + info, comparator.compare(info, serviceInfo) == 0); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#getServiceTypes()}. * @throws ContainerConnectException */ public void testGetServiceTypes() throws ContainerConnectException { registerService(); final IServiceTypeID[] serviceTypeIDs = discoveryLocator.getServiceTypes(); assertTrue("IServiceInfo[] is empty", serviceTypeIDs.length >= 1); for (int i = 0; i < serviceTypeIDs.length; i++) { IServiceTypeID iServiceTypeId = serviceTypeIDs[i]; if(serviceInfo.getServiceID().getServiceTypeID().equals(iServiceTypeId)) { return; } } fail("Self registered service not found"); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#getServices()}. * @throws ContainerConnectException */ public void testGetServices() throws ContainerConnectException { registerService(); final IServiceInfo[] services = discoveryLocator.getServices(); assertTrue("IServiceInfo[] is empty", services.length >= 1); for (int i = 0; i < services.length; i++) { IServiceInfo iServiceInfo = services[i]; if(comparator.compare(iServiceInfo, serviceInfo) == 0) { return; } } fail("Self registered service not found"); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#getServices(org.eclipse.ecf.discovery.identity.IServiceTypeID)}. * @throws ContainerConnectException */ public void testGetServicesIServiceTypeID() throws ContainerConnectException { registerService(); final IServiceInfo serviceInfos[] = discoveryLocator.getServices(serviceInfo.getServiceID().getServiceTypeID()); assertTrue("IServiceInfo[] is empty", serviceInfos.length >= 1); for (int i = 0; i < serviceInfos.length; i++) { IServiceInfo iServiceInfo = serviceInfos[i]; if(comparator.compare(iServiceInfo, serviceInfo) == 0) { return; } } fail("Self registered service not found"); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#registerService(org.eclipse.ecf.discovery.IServiceInfo)}. * @throws ContainerConnectException */ public void testRegisterService() throws ContainerConnectException { registerService(); final IServiceInfo[] services = discoveryLocator.getServices(); assertTrue("IServiceInfo[] is empty", services.length >= 1); for (int i = 0; i < services.length; i++) { final IServiceInfo service = services[i]; if (comparator.compare(service, serviceInfo) == 0) { return; } } fail("Self registered service not found"); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#unregisterService(org.eclipse.ecf.discovery.IServiceInfo)}. * @throws ContainerConnectException */ public void testUnregisterService() throws ContainerConnectException { testRegisterService(); unregisterService(); final IServiceInfo[] services = discoveryLocator.getServices(); for (int i = 0; i < services.length; i++) { final IServiceInfo service = services[i]; if (comparator.compare(service, serviceInfo) == 0) { fail("Expected service to be not registered anymore"); } } } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#addServiceListener(org.eclipse.ecf.discovery.IServiceListener)}. * @throws ContainerConnectException */ public void testAddServiceListenerIServiceListener() throws ContainerConnectException { IServiceInfo[] services = discoveryLocator.getServices(); assertTrue("No Services must be registerd at this point " + (services.length == 0 ? "" : services[0].toString()), services.length == 0); final TestServiceListener tsl = new TestServiceListener(eventsToExpect, discoveryLocator, getName(), getTestId()); addServiceListener(tsl); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#addServiceListener(org.eclipse.ecf.discovery.identity.IServiceTypeID, org.eclipse.ecf.discovery.IServiceListener)}. * @throws ContainerConnectException */ public void testAddServiceListenerIServiceTypeIDIServiceListener() throws ContainerConnectException { IServiceInfo[] services = discoveryLocator.getServices(); assertTrue("No Services must be registerd at this point " + (services.length == 0 ? "" : services[0].toString()), services.length == 0); final TestServiceListener tsl = new TestServiceListener(eventsToExpect, discoveryLocator, getName(), getTestId()); discoveryLocator.addServiceListener(serviceInfo.getServiceID().getServiceTypeID(), tsl); addListenerRegisterAndWait(tsl, serviceInfo); discoveryLocator.removeServiceListener(serviceInfo.getServiceID().getServiceTypeID(), tsl); IContainerEvent[] event = tsl.getEvent(); assertNotNull("Test listener didn't receive discovery", event); assertEquals("Test listener received unexpected amount of discovery events: \n\t" + Arrays.asList(event), eventsToExpect, event.length); IServiceInfo serviceInfo2 = ((IServiceEvent) event[eventsToExpect - 1]).getServiceInfo(); assertTrue("IServiceInfo should match, expected:\n\t" + serviceInfo + " but:\n\t" + serviceInfo2, comparator.compare(serviceInfo2, serviceInfo) == 0); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#addServiceTypeListener(org.eclipse.ecf.discovery.IServiceTypeListener)}. * @throws ContainerConnectException */ public void testAddServiceTypeListener() throws ContainerConnectException { IServiceInfo[] services = discoveryLocator.getServices(); assertTrue("No Services must be registerd at this point " + (services.length == 0 ? "" : services[0].toString()), services.length == 0); final TestServiceTypeListener testTypeListener = new TestServiceTypeListener(eventsToExpect); discoveryLocator.addServiceTypeListener(testTypeListener); synchronized (testTypeListener) { // register a service which we expect the test listener to get notified of registerService(); try { testTypeListener.wait(waitTimeForProvider); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); fail("Some discovery unrelated threading issues?"); } } discoveryLocator.removeServiceTypeListener(testTypeListener); IContainerEvent[] event = testTypeListener.getEvent(); assertNotNull("Test listener didn't receive discovery", event); assertEquals("Test listener received unexpected amount of discovery events: \n\t" + Arrays.asList(event), eventsToExpect, event.length); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#removeServiceListener(org.eclipse.ecf.discovery.IServiceListener)}. * @throws ContainerConnectException */ public void testRemoveServiceListenerIServiceListener() throws ContainerConnectException { final TestServiceListener serviceListener = new TestServiceListener(eventsToExpect, discoveryLocator, getName(), getTestId()); addServiceListener(serviceListener); //TODO reregister and verify the listener doesn't receive any events any longer. } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#removeServiceListener(org.eclipse.ecf.discovery.identity.IServiceTypeID, org.eclipse.ecf.discovery.IServiceListener)}. * @throws ContainerConnectException */ public void testRemoveServiceListenerIServiceTypeIDIServiceListener() throws ContainerConnectException { final TestServiceListener serviceListener = new TestServiceListener(eventsToExpect, discoveryLocator, getName(), getTestId()); addServiceListener(serviceListener); //TODO reregister and verify the listener doesn't receive any events any longer. } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryContainerAdapter#removeServiceTypeListener(org.eclipse.ecf.discovery.IServiceTypeListener)}. * @throws ContainerConnectException */ public void testRemoveServiceTypeListener() throws ContainerConnectException { assertTrue("No Services must be registerd at this point", discoveryLocator.getServices().length == 0); final TestServiceTypeListener testTypeListener = new TestServiceTypeListener(eventsToExpect); discoveryLocator.addServiceTypeListener(testTypeListener); synchronized (testTypeListener) { // register a service which we expect the test listener to get notified of registerService(); try { testTypeListener.wait(waitTimeForProvider); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); fail("Some discovery unrelated threading issues?"); } } discoveryLocator.removeServiceTypeListener(testTypeListener); IContainerEvent[] event = testTypeListener.getEvent(); assertNotNull("Test listener didn't receive any discovery event", event); assertEquals("Test listener received unexpected amount of discovery events: \n\t" + Arrays.asList(event), eventsToExpect, event.length); //TODO reregister and verify the listener doesn't receive any events any longer. } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryLocator#getAsyncServiceInfo(org.eclipse.ecf.discovery.identity.IServiceID)}. * @throws InterruptedException * @throws OperationCanceledException * @throws ContainerConnectException */ public void testGetAsyncServiceInfo() throws OperationCanceledException, InterruptedException, ContainerConnectException { registerService(); final IFuture aFuture = discoveryLocator.getAsyncServiceInfo(serviceInfo.getServiceID()); final Object object = aFuture.get(); assertTrue(object instanceof IServiceInfo); final IServiceInfo info = (IServiceInfo) object; assertTrue("IServiceInfo should match, expected:\n\t" + serviceInfo + " but:\n\t" + info, comparator.compare(info, serviceInfo) == 0); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryLocator#getAsyncServices()}. * @throws ContainerConnectException * @throws InterruptedException * @throws OperationCanceledException */ public void testGetAsyncServices() throws ContainerConnectException, OperationCanceledException, InterruptedException { registerService(); final IFuture aFuture = discoveryLocator.getAsyncServices(); final Object object = aFuture.get(); assertTrue(object instanceof IServiceInfo[]); final IServiceInfo[] services = (IServiceInfo[]) object; assertTrue("Found: " + services.length + Arrays.asList(services), services.length == eventsToExpect); for (int i = 0; i < services.length; i++) { IServiceInfo iServiceInfo = services[i]; if(comparator.compare(iServiceInfo, serviceInfo) == 0) { return; } } fail("Self registered service not found"); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryLocator#getAsyncServices(org.eclipse.ecf.discovery.identity.IServiceTypeID)}. * @throws ContainerConnectException * @throws InterruptedException * @throws OperationCanceledException */ public void testGetAsyncServicesIServiceTypeID() throws ContainerConnectException, OperationCanceledException, InterruptedException { registerService(); final IFuture aFuture = discoveryLocator.getAsyncServices(serviceInfo.getServiceID().getServiceTypeID()); final Object object = aFuture.get(); assertTrue(object instanceof IServiceInfo[]); final IServiceInfo[] services = (IServiceInfo[]) object; assertTrue("Found: " + services.length + Arrays.asList(services), services.length == eventsToExpect); for (int i = 0; i < services.length; i++) { IServiceInfo iServiceInfo = services[i]; if(comparator.compare(iServiceInfo, serviceInfo) == 0) { return; } } fail("Self registered service not found"); } /** * Test method for * {@link org.eclipse.ecf.discovery.IDiscoveryLocator#getAsyncServiceTypes()}. * @throws ContainerConnectException * @throws InterruptedException * @throws OperationCanceledException */ public void testGetAsyncServiceTypes() throws ContainerConnectException, OperationCanceledException, InterruptedException { registerService(); final IFuture aFuture = discoveryLocator.getAsyncServiceTypes(); final Object object = aFuture.get(); assertTrue(object instanceof IServiceTypeID[]); final IServiceTypeID[] services = (IServiceTypeID[]) object; assertTrue("Found: " + services.length + Arrays.asList(services), services.length == 1); // just expect one event as the implementation filters dupes for (int i = 0; i < services.length; i++) { IServiceTypeID iServiceTypeId = services[i]; if(serviceInfo.getServiceID().getServiceTypeID().equals(iServiceTypeId)) { return; } } fail("Self registered service not found"); } }