diff options
author | Markus Alexander Kuppe | 2014-01-23 10:15:57 +0000 |
---|---|---|
committer | Markus Alexander Kuppe | 2014-01-23 10:15:57 +0000 |
commit | 0ec557e916a0cea321a3687676dcb1e2b7d30701 (patch) | |
tree | 011b12bfd2ba3fd15910ab0580a4ca88e102e591 /tests | |
parent | 44b7a5ba09f181b83a071a0e7ddbe5ff89b7436d (diff) | |
download | org.eclipse.ecf-0ec557e916a0cea321a3687676dcb1e2b7d30701.tar.gz org.eclipse.ecf-0ec557e916a0cea321a3687676dcb1e2b7d30701.tar.xz org.eclipse.ecf-0ec557e916a0cea321a3687676dcb1e2b7d30701.zip |
Bug 426374: Notify IServiceListeners registered via OSGi ServiceRegistry
of previously registered services
https://bugs.eclipse.org/bugs/show_bug.cgi?id=426374
Diffstat (limited to 'tests')
2 files changed, 80 insertions, 0 deletions
diff --git a/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java b/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java index 7a01b1577..f42503093 100755 --- a/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java +++ b/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryServiceTest.java @@ -55,6 +55,85 @@ public abstract class DiscoveryServiceTest extends DiscoveryTest { protected IDiscoveryAdvertiser getDiscoveryAdvertiser() { return Activator.getDefault().getDiscoveryAdvertiser(containerUnderTest); } + + // Check newly added IServiceListener is notified about service discovered _before_ the listener is registered + public void testGetPreregisteredService() { + IServiceInfo[] services = discoveryLocator.getServices(); + assertTrue("No Services must be registerd at this point " + (services.length == 0 ? "" : services[0].toString()), services.length == 0); + + registerService(); + + final TestServiceListener tsl = new TestServiceListener(eventsToExpect, discoveryLocator); + Properties props = new Properties(); + props.put(IDiscoveryLocator.CONTAINER_NAME, containerUnderTest); + props.put(IServiceListener.Cache.USE, Boolean.TRUE); + BundleContext ctxt = Activator.getDefault().getContext(); + ServiceRegistration registration = ctxt.registerService(IServiceListener.class.getName(), tsl, props); + + // No need to wait() on TSL here + + registration.unregister(); + + IContainerEvent[] event = tsl.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); + } + + public void testGetRefreshService() { + IServiceInfo[] services = discoveryLocator.getServices(); + assertTrue("No Services must be registerd at this point " + (services.length == 0 ? "" : services[0].toString()), services.length == 0); + + registerService(); + try { + // Purge the DiscoveryServiceListener explicitly + discoveryLocator.purgeCache(); + + final TestServiceListener tsl = new TestServiceListener(eventsToExpect, discoveryLocator); + Properties props = new Properties(); + props.put(IDiscoveryLocator.CONTAINER_NAME, containerUnderTest); + props.put(IServiceListener.Cache.REFRESH, Boolean.TRUE); + props.put(IServiceListener.Cache.USE, Boolean.TRUE); + BundleContext ctxt = Activator.getDefault().getContext(); + ServiceRegistration registration = ctxt.registerService(IServiceListener.class.getName(), tsl, props); + + // Because the cache has been purged, it shouldn't know about the previously registered service + IContainerEvent[] event = tsl.getEvent(); + assertEquals("Test listener received unexpected amount of discovery events: \n\t" + Arrays.asList(event), 0, event.length); + + // Here's is a race condition between the DiscoveryServiceListener + // already actively discovering services and us. If the discovery of + // the service has finished before we wait on the tsl, we will miss + // the event? + // OTOH won't the event be received by the tsl anyway and + // we just have to wait for the timeout? + + // IServiceListener.Cache.REFRESH should have triggered re-discovery + synchronized (tsl) { + // register a service which we expect the test listener to get notified of + try { + tsl.wait(waitTimeForProvider); + } catch (final InterruptedException e) { + Thread.currentThread().interrupt(); + fail("Some discovery unrelated threading issues?"); + } + } + + registration.unregister(); + + event = tsl.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); + } finally { + //de-register the manually registered service manually again. + // 1. registerService(..) + // 2. addListenerRegisterAndWait(..) + unregisterService(); + } + } public void testAddServiceListenerIServiceListenerOSGi() throws ContainerConnectException { IServiceInfo[] services = discoveryLocator.getServices(); diff --git a/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryTest.java b/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryTest.java index f1b9a116b..76acdfccd 100755 --- a/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryTest.java +++ b/tests/bundles/org.eclipse.ecf.tests.discovery/src/org/eclipse/ecf/tests/discovery/DiscoveryTest.java @@ -57,6 +57,7 @@ public abstract class DiscoveryTest extends AbstractDiscoveryTest { */ protected void tearDown() throws Exception { discoveryAdvertiser.unregisterService(serviceInfo); + discoveryLocator.purgeCache(); super.tearDown(); } |