blob: cb2f6ac13a71f4e8512d10ab6b546a57636e21f7 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2010 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.osgi.tests.serviceregistry;
import java.util.*;
import junit.framework.*;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.eclipse.osgi.tests.bundles.AbstractBundleTests;
import org.osgi.framework.*;
import org.osgi.framework.hooks.service.*;
public class ServiceHookTests extends AbstractBundleTests {
public static Test suite() {
return new TestSuite(ServiceHookTests.class);
}
public void testFindHook01() {
final String testMethodName = "testFindHook01"; //$NON-NLS-1$
// test the FindHook is called and can remove a reference from the results
Runnable runIt = new Runnable() {
public void run() {
// nothing
}
};
final BundleContext testContext = OSGiTestsActivator.getContext();
// register services
Hashtable props = new Hashtable();
props.put("name", testMethodName); //$NON-NLS-1$
props.put(Constants.SERVICE_DESCRIPTION, "service 1"); //$NON-NLS-1$
final ServiceRegistration reg1 = testContext.registerService(Runnable.class.getName(), runIt, props);
props.put(Constants.SERVICE_DESCRIPTION, "service 2"); //$NON-NLS-1$
final ServiceRegistration reg2 = testContext.registerService(Runnable.class.getName(), runIt, props);
props.put(Constants.SERVICE_DESCRIPTION, "service 3"); //$NON-NLS-1$
final ServiceRegistration reg3 = testContext.registerService(Runnable.class.getName(), runIt, props);
final int[] hookCalled = new int[] {0, 0, 0, 0, 0};
final boolean[] startTest = new boolean[] {false};
final AssertionFailedError[] hookError = new AssertionFailedError[] {null, null, null, null};
// register find hook 1
props.put(Constants.SERVICE_DESCRIPTION, "find hook 1"); //$NON-NLS-1$
props.put(Constants.SERVICE_DESCRIPTION, "min value"); //$NON-NLS-1$
props.put(Constants.SERVICE_RANKING, new Integer(Integer.MIN_VALUE));
ServiceRegistration regHook1 = testContext.registerService(FindHook.class.getName(), new FindHook() {
public void find(BundleContext context, String name, String filter, boolean allServices, Collection references) {
try {
synchronized (hookCalled) {
if (!startTest[0])
return;
hookCalled[++hookCalled[0]] = 1;
}
assertEquals("wrong context in hook", testContext, context); //$NON-NLS-1$
assertEquals("wrong name in hook", Runnable.class.getName(), name); //$NON-NLS-1$
assertEquals("wrong filter in hook", "(name=" + testMethodName + ")", filter); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
assertEquals("wrong allservices in hook", false, allServices); //$NON-NLS-1$
assertEquals("wrong number of services in hook", 1, references.size()); //$NON-NLS-1$
Iterator iter = references.iterator();
while (iter.hasNext()) {
ServiceReference ref = (ServiceReference) iter.next();
if (ref.equals(reg1.getReference())) {
fail("service 1 is present"); //$NON-NLS-1$
}
if (ref.equals(reg2.getReference())) {
fail("service 2 is present"); //$NON-NLS-1$
}
}
try {
references.add(reg1.getReference());
fail("add to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
try {
references.addAll(Arrays.asList(new ServiceReference[] {reg1.getReference()}));
fail("addAll to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
} catch (AssertionFailedError a) {
hookError[0] = a;
return;
}
}
}, props);
// register find hook 2
props.put(Constants.SERVICE_DESCRIPTION, "find hook 2"); //$NON-NLS-1$
props.put(Constants.SERVICE_DESCRIPTION, "max value first"); //$NON-NLS-1$
props.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE));
ServiceRegistration regHook2 = testContext.registerService(FindHook.class.getName(), new FindHook() {
public void find(BundleContext context, String name, String filter, boolean allServices, Collection references) {
try {
synchronized (hookCalled) {
if (!startTest[0])
return;
hookCalled[++hookCalled[0]] = 2;
}
assertEquals("wrong context in hook", testContext, context); //$NON-NLS-1$
assertEquals("wrong name in hook", Runnable.class.getName(), name); //$NON-NLS-1$
assertEquals("wrong filter in hook", "(name=" + testMethodName + ")", filter); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
assertEquals("wrong allservices in hook", false, allServices); //$NON-NLS-1$
assertEquals("wrong number of services in hook", 3, references.size()); //$NON-NLS-1$
Iterator iter = references.iterator();
while (iter.hasNext()) {
ServiceReference ref = (ServiceReference) iter.next();
if (ref.equals(reg2.getReference())) {
iter.remove();
}
}
try {
references.add(reg2.getReference());
fail("add to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
try {
references.addAll(Arrays.asList(new ServiceReference[] {reg2.getReference()}));
fail("addAll to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
} catch (AssertionFailedError a) {
hookError[1] = a;
return;
}
}
}, props);
// register find hook 3
props.put(Constants.SERVICE_DESCRIPTION, "find hook 3"); //$NON-NLS-1$
props.put(Constants.SERVICE_DESCRIPTION, "max value second"); //$NON-NLS-1$
props.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE));
ServiceRegistration regHook3 = testContext.registerService(FindHook.class.getName(), new FindHook() {
public void find(BundleContext context, String name, String filter, boolean allServices, Collection references) {
try {
synchronized (hookCalled) {
if (!startTest[0])
return;
hookCalled[++hookCalled[0]] = 3;
}
assertEquals("wrong context in hook", testContext, context); //$NON-NLS-1$
assertEquals("wrong name in hook", Runnable.class.getName(), name); //$NON-NLS-1$
assertEquals("wrong filter in hook", "(name=" + testMethodName + ")", filter); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
assertEquals("wrong allservices in hook", false, allServices); //$NON-NLS-1$
assertEquals("wrong number of services in hook", 2, references.size()); //$NON-NLS-1$
Iterator iter = references.iterator();
while (iter.hasNext()) {
ServiceReference ref = (ServiceReference) iter.next();
if (ref.equals(reg2.getReference())) {
fail("service 2 is present"); //$NON-NLS-1$
}
}
try {
references.add(reg2.getReference());
fail("add to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
try {
references.addAll(Arrays.asList(new ServiceReference[] {reg2.getReference()}));
fail("addAll to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
} catch (AssertionFailedError a) {
hookError[2] = a;
return;
}
// throw an exception from the hook to test that the next hooks are called.
throw new RuntimeException(testMethodName);
}
}, props);
// register find hook 4
props.put(Constants.SERVICE_DESCRIPTION, "find hook 4"); //$NON-NLS-1$
props.put(Constants.SERVICE_DESCRIPTION, "max value third"); //$NON-NLS-1$
props.put(Constants.SERVICE_RANKING, new Integer(Integer.MAX_VALUE));
ServiceRegistration regHook4 = testContext.registerService(FindHook.class.getName(), new FindHook() {
public void find(BundleContext context, String name, String filter, boolean allServices, Collection references) {
try {
synchronized (hookCalled) {
if (!startTest[0])
return;
hookCalled[++hookCalled[0]] = 4;
}
assertEquals("wrong context in hook", testContext, context); //$NON-NLS-1$
assertEquals("wrong name in hook", Runnable.class.getName(), name); //$NON-NLS-1$
assertEquals("wrong filter in hook", "(name=" + testMethodName + ")", filter); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
assertEquals("wrong allservices in hook", false, allServices); //$NON-NLS-1$
assertEquals("wrong number of services in hook", 2, references.size()); //$NON-NLS-1$
Iterator iter = references.iterator();
while (iter.hasNext()) {
ServiceReference ref = (ServiceReference) iter.next();
if (ref.equals(reg1.getReference())) {
iter.remove();
}
if (ref.equals(reg2.getReference())) {
fail("service 2 is present"); //$NON-NLS-1$
}
}
try {
references.add(reg2.getReference());
fail("add to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
try {
references.addAll(Arrays.asList(new ServiceReference[] {reg2.getReference()}));
fail("addAll to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
} catch (AssertionFailedError a) {
hookError[3] = a;
return;
}
}
}, props);
startTest[0] = true;
// get reference and hook removes some services
try {
ServiceReference[] refs = null;
try {
refs = testContext.getServiceReferences(Runnable.class.getName(), "(name=" + testMethodName + ")"); //$NON-NLS-1$ //$NON-NLS-2$
} catch (InvalidSyntaxException e) {
fail("Unexpected syntax error", e); //$NON-NLS-1$
}
assertEquals("all hooks not called", 4, hookCalled[0]); //$NON-NLS-1$
assertEquals("hook 2 not called first", 2, hookCalled[1]); //$NON-NLS-1$
assertEquals("hook 3 not called second", 3, hookCalled[2]); //$NON-NLS-1$
assertEquals("hook 4 not called third", 4, hookCalled[3]); //$NON-NLS-1$
assertEquals("hook 1 not called fourth ", 1, hookCalled[4]); //$NON-NLS-1$
for (int i = 0; i < hookError.length; i++) {
if (hookError[i] != null) {
throw hookError[i];
}
}
assertNotNull("service refs is null", refs); //$NON-NLS-1$
assertEquals("Wrong number of references", 1, refs.length); //$NON-NLS-1$
// test removed services are not in the result
List refList = Arrays.asList(refs);
assertFalse("contains service 1", refList.contains(reg1.getReference())); //$NON-NLS-1$
assertFalse("contains service 2", refList.contains(reg2.getReference())); //$NON-NLS-1$
assertTrue("missing service 3", refList.contains(reg3.getReference())); //$NON-NLS-1$
startTest[0] = false;
// remove the hooks
regHook1.unregister();
regHook1 = null;
regHook2.unregister();
regHook2 = null;
regHook3.unregister();
regHook3 = null;
regHook4.unregister();
regHook4 = null;
// get services and make sure none are filtered
refs = null;
hookCalled[0] = 0;
startTest[0] = true;
try {
refs = testContext.getServiceReferences(Runnable.class.getName(), "(name=" + testMethodName + ")"); //$NON-NLS-1$ //$NON-NLS-2$
} catch (InvalidSyntaxException e) {
fail("Unexpected syntax error", e); //$NON-NLS-1$
}
assertEquals("hooks called", 0, hookCalled[0]); //$NON-NLS-1$
assertNotNull("service refs is null", refs); //$NON-NLS-1$
assertEquals("Wrong number of references", 3, refs.length); //$NON-NLS-1$
// test result contains all expected services
refList = Arrays.asList(refs);
assertTrue("missing service 1", refList.contains(reg1.getReference())); //$NON-NLS-1$
assertTrue("missing service 2", refList.contains(reg2.getReference())); //$NON-NLS-1$
assertTrue("missing service 3", refList.contains(reg3.getReference())); //$NON-NLS-1$
} finally {
// unregister hook and services
if (regHook1 != null)
regHook1.unregister();
if (regHook2 != null)
regHook2.unregister();
if (regHook3 != null)
regHook3.unregister();
if (regHook4 != null)
regHook4.unregister();
if (reg1 != null)
reg1.unregister();
if (reg2 != null)
reg2.unregister();
if (reg3 != null)
reg3.unregister();
}
}
public void testEventHook01() {
final String testMethodName = "testEventHook01"; //$NON-NLS-1$
// test the EventHook is called and can remove a reference from the results
Runnable runIt = new Runnable() {
public void run() {
// nothing
}
};
final BundleContext testContext = OSGiTestsActivator.getContext();
final int[] hookCalled = new int[] {0, 0};
final AssertionFailedError[] hookError = new AssertionFailedError[] {null};
final List events = new ArrayList();
final ServiceListener sl = new ServiceListener() {
public void serviceChanged(ServiceEvent event) {
synchronized (events) {
events.add(event);
}
}
};
final String filterString = "(&(name=" + testMethodName + ")(objectClass=java.lang.Runnable))"; //$NON-NLS-1$ //$NON-NLS-2$
Filter tmpFilter = null;
try {
tmpFilter = testContext.createFilter(filterString);
testContext.addServiceListener(sl, filterString);
} catch (InvalidSyntaxException e) {
fail("Unexpected syntax error", e); //$NON-NLS-1$
}
final Filter filter = tmpFilter;
EventHook hook1 = new EventHook() {
public void event(ServiceEvent event, Collection contexts) {
try {
if (!filter.match(event.getServiceReference())) {
return;
}
synchronized (hookCalled) {
hookCalled[++hookCalled[0]] = 1;
}
assertTrue("does not contain test context", contexts.contains(testContext)); //$NON-NLS-1$
try {
contexts.add(testContext.getBundle(0).getBundleContext());
fail("add to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
try {
contexts.addAll(Arrays.asList(new BundleContext[] {testContext.getBundle(0).getBundleContext()}));
fail("addAll to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
} catch (AssertionFailedError a) {
hookError[0] = a;
return;
}
}
};
EventHook hook2 = new EventHook() {
public void event(ServiceEvent event, Collection contexts) {
try {
if (!filter.match(event.getServiceReference())) {
return;
}
synchronized (hookCalled) {
hookCalled[++hookCalled[0]] = 1;
}
assertTrue("does not contain test context", contexts.contains(testContext)); //$NON-NLS-1$
contexts.remove(testContext);
try {
contexts.add(testContext.getBundle(0).getBundleContext());
fail("add to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
try {
contexts.addAll(Arrays.asList(new BundleContext[] {testContext.getBundle(0).getBundleContext()}));
fail("addAll to collection succeeded"); //$NON-NLS-1$
} catch (UnsupportedOperationException e) {
// should get an exception
} catch (Exception e) {
fail("incorrect exception", e); //$NON-NLS-1$
}
} catch (AssertionFailedError a) {
hookError[0] = a;
return;
}
}
};
Hashtable props = new Hashtable();
props.put("name", testMethodName); //$NON-NLS-1$
// register event hook 1
props.put(Constants.SERVICE_DESCRIPTION, "event hook 1"); //$NON-NLS-1$
ServiceRegistration regHook = testContext.registerService(EventHook.class.getName(), hook1, props);
ServiceRegistration reg1 = null;
try {
props.put(Constants.SERVICE_DESCRIPTION, "service 1"); //$NON-NLS-1$
synchronized (events) {
events.clear();
}
reg1 = testContext.registerService(Runnable.class.getName(), runIt, props);
assertEquals("all hooks not called", 1, hookCalled[0]); //$NON-NLS-1$
assertEquals("hook 1 not called first", 1, hookCalled[1]); //$NON-NLS-1$
for (int i = 0; i < hookError.length; i++) {
if (hookError[i] != null) {
throw hookError[i];
}
}
synchronized (events) {
assertEquals("listener not called once", 1, events.size()); //$NON-NLS-1$
Iterator iter = events.iterator();
while (iter.hasNext()) {
ServiceEvent event = (ServiceEvent) iter.next();
assertEquals("type not registered", ServiceEvent.REGISTERED, event.getType()); //$NON-NLS-1$
assertEquals("wrong service", reg1.getReference(), event.getServiceReference()); //$NON-NLS-1$
}
}
regHook.unregister();
regHook = null;
synchronized (events) {
events.clear();
}
hookCalled[0] = 0;
props.put(Constants.SERVICE_DESCRIPTION, "service 2"); //$NON-NLS-1$
reg1.setProperties(props);
synchronized (events) {
assertEquals("listener not called once", 1, events.size()); //$NON-NLS-1$
Iterator iter = events.iterator();
while (iter.hasNext()) {
ServiceEvent event = (ServiceEvent) iter.next();
assertEquals("type not registered", ServiceEvent.MODIFIED, event.getType()); //$NON-NLS-1$
assertEquals("wrong service", reg1.getReference(), event.getServiceReference()); //$NON-NLS-1$
}
}
assertEquals("hooks called", 0, hookCalled[0]); //$NON-NLS-1$
props.put(Constants.SERVICE_DESCRIPTION, "event hook 2"); //$NON-NLS-1$
regHook = testContext.registerService(EventHook.class.getName(), hook2, props);
synchronized (events) {
events.clear();
}
hookCalled[0] = 0;
reg1.unregister();
reg1 = null;
synchronized (events) {
assertEquals("listener called", 0, events.size()); //$NON-NLS-1$
}
assertEquals("all hooks not called", 1, hookCalled[0]); //$NON-NLS-1$
assertEquals("hook 1 not called first", 1, hookCalled[1]); //$NON-NLS-1$
for (int i = 0; i < hookError.length; i++) {
if (hookError[i] != null) {
throw hookError[i];
}
}
} finally {
// unregister hook and services
if (regHook != null)
regHook.unregister();
if (reg1 != null)
reg1.unregister();
if (sl != null)
testContext.removeServiceListener(sl);
}
}
public void testListenerHook01() {
final String testMethodName = "testListenerHook01"; //$NON-NLS-1$
// test the ListenerHook is called
final BundleContext testContext = OSGiTestsActivator.getContext();
final Collection result = new ArrayList();
final int[] hookCalled = new int[] {0, 0};
ListenerHook hook1 = new ListenerHook() {
public void added(Collection listeners) {
synchronized (hookCalled) {
hookCalled[0]++;
}
result.addAll(listeners);
}
public void removed(Collection listeners) {
synchronized (hookCalled) {
hookCalled[1]++;
}
result.removeAll(listeners);
}
};
Hashtable props = new Hashtable();
props.put("name", testMethodName); //$NON-NLS-1$
// register listener hook 1
props.put(Constants.SERVICE_DESCRIPTION, "listener hook 1"); //$NON-NLS-1$
ServiceRegistration regHook = testContext.registerService(ListenerHook.class.getName(), hook1, props);
try {
assertFalse("no service listeners found", result.isEmpty()); //$NON-NLS-1$
assertEquals("added not called", 1, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed called", 0, hookCalled[1]); //$NON-NLS-1$
int size = result.size();
ServiceListener testSL = new ServiceListener() {
public void serviceChanged(ServiceEvent event) {
// do nothing
}
};
String filterString1 = "(foo=bar)"; //$NON-NLS-1$
testContext.addServiceListener(testSL, filterString1);
assertEquals("added not called", 2, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed called", 0, hookCalled[1]); //$NON-NLS-1$
assertEquals("listener not added", size + 1, result.size()); //$NON-NLS-1$
Iterator iter = result.iterator();
boolean found = false;
while (iter.hasNext()) {
ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next();
BundleContext c = info.getBundleContext();
String f = info.getFilter();
if ((c == testContext) && (filterString1.equals(f))) {
if (found) {
fail("found more than once"); //$NON-NLS-1$
}
found = true;
}
}
if (!found) {
fail("listener not found"); //$NON-NLS-1$
}
String filterString2 = "(bar=foo)"; //$NON-NLS-1$
testContext.addServiceListener(testSL, filterString2);
assertEquals("added not called", 3, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed not called", 1, hookCalled[1]); //$NON-NLS-1$
assertEquals("listener not removed and added", size + 1, result.size()); //$NON-NLS-1$
iter = result.iterator();
found = false;
while (iter.hasNext()) {
ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next();
BundleContext c = info.getBundleContext();
String f = info.getFilter();
if ((c == testContext) && (filterString2.equals(f))) {
if (found) {
fail("found more than once"); //$NON-NLS-1$
}
found = true;
}
if ((c == testContext) && (filterString1.equals(f))) {
fail("first listener not removed"); //$NON-NLS-1$
}
}
if (!found) {
fail("listener not found"); //$NON-NLS-1$
}
testContext.removeServiceListener(testSL);
assertEquals("added called", 3, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed not called", 2, hookCalled[1]); //$NON-NLS-1$
assertEquals("listener not removed", size, result.size()); //$NON-NLS-1$
iter = result.iterator();
while (iter.hasNext()) {
ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next();
BundleContext c = info.getBundleContext();
String f = info.getFilter();
if ((c == testContext) && (filterString2.equals(f))) {
fail("second listener not removed"); //$NON-NLS-1$
}
}
testContext.removeServiceListener(testSL);
assertEquals("added called", 3, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed called", 2, hookCalled[1]); //$NON-NLS-1$
assertEquals("listener removed", size, result.size()); //$NON-NLS-1$
} catch (InvalidSyntaxException e) {
fail(e.getMessage());
} finally {
if (regHook != null) {
regHook.unregister();
}
}
}
public void testListenerHook02() {
final String testMethodName = "testListenerHook02"; //$NON-NLS-1$
// test the ListenerHook works with the FilteredServiceListener optimization in equinox
final BundleContext testContext = OSGiTestsActivator.getContext();
final Collection result = new ArrayList();
final int[] hookCalled = new int[] {0, 0};
ListenerHook hook1 = new ListenerHook() {
public void added(Collection listeners) {
synchronized (hookCalled) {
hookCalled[0]++;
}
result.addAll(listeners);
}
public void removed(Collection listeners) {
synchronized (hookCalled) {
hookCalled[1]++;
}
result.removeAll(listeners);
}
};
Hashtable props = new Hashtable();
props.put("name", testMethodName); //$NON-NLS-1$
// register listener hook 1
props.put(Constants.SERVICE_DESCRIPTION, "listener hook 1"); //$NON-NLS-1$
ServiceRegistration regHook = testContext.registerService(ListenerHook.class.getName(), hook1, props);
try {
assertFalse("no service listeners found", result.isEmpty()); //$NON-NLS-1$
assertEquals("added not called", 1, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed called", 0, hookCalled[1]); //$NON-NLS-1$
int size = result.size();
ServiceListener testSL = new ServiceListener() {
public void serviceChanged(ServiceEvent event) {
// do nothing
}
};
String filterString1 = "(" + Constants.OBJECTCLASS + "=bar)"; //$NON-NLS-1$ //$NON-NLS-2$
testContext.addServiceListener(testSL, filterString1);
assertEquals("added not called", 2, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed called", 0, hookCalled[1]); //$NON-NLS-1$
assertEquals("listener not added", size + 1, result.size()); //$NON-NLS-1$
Iterator iter = result.iterator();
boolean found = false;
while (iter.hasNext()) {
ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next();
BundleContext c = info.getBundleContext();
String f = info.getFilter();
if ((c == testContext) && (filterString1.equals(f))) {
if (found) {
fail("found more than once"); //$NON-NLS-1$
}
found = true;
}
}
if (!found) {
fail("listener not found"); //$NON-NLS-1$
}
String filterString2 = null;
testContext.addServiceListener(testSL);
assertEquals("added not called", 3, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed not called", 1, hookCalled[1]); //$NON-NLS-1$
assertEquals("listener not removed and added", size + 1, result.size()); //$NON-NLS-1$
iter = result.iterator();
found = false;
while (iter.hasNext()) {
ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next();
BundleContext c = info.getBundleContext();
String f = info.getFilter();
if ((c == testContext) && (f == filterString2)) {
if (found) {
fail("found more than once"); //$NON-NLS-1$
}
found = true;
}
if ((c == testContext) && (filterString1.equals(f))) {
fail("first listener not removed"); //$NON-NLS-1$
}
}
if (!found) {
fail("listener not found"); //$NON-NLS-1$
}
testContext.removeServiceListener(testSL);
assertEquals("added called", 3, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed not called", 2, hookCalled[1]); //$NON-NLS-1$
assertEquals("listener not removed", size, result.size()); //$NON-NLS-1$
iter = result.iterator();
while (iter.hasNext()) {
ListenerHook.ListenerInfo info = (ListenerHook.ListenerInfo) iter.next();
BundleContext c = info.getBundleContext();
String f = info.getFilter();
if ((c == testContext) && (f == filterString2)) {
fail("second listener not removed"); //$NON-NLS-1$
}
}
testContext.removeServiceListener(testSL);
assertEquals("added called", 3, hookCalled[0]); //$NON-NLS-1$
assertEquals("removed called", 2, hookCalled[1]); //$NON-NLS-1$
assertEquals("listener removed", size, result.size()); //$NON-NLS-1$
} catch (InvalidSyntaxException e) {
fail(e.getMessage());
} finally {
if (regHook != null) {
regHook.unregister();
}
}
}
}