blob: 6e5fea53c4cc2aa3161a9971e7f283a3c4093dcc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 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.Hashtable;
import junit.framework.Test;
import junit.framework.TestSuite;
import org.eclipse.osgi.tests.OSGiTestsActivator;
import org.eclipse.osgi.tests.bundles.AbstractBundleTests;
import org.osgi.framework.*;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
public class ServiceTrackerTests extends AbstractBundleTests {
public static Test suite() {
return new TestSuite(ServiceTrackerTests.class);
}
public void testServiceTracker01() {
final String testMethodName = getName();
// simple ServiceTracker test
Runnable runIt = new Runnable() {
public void run() {
// nothing
}
};
Hashtable props = new Hashtable();
props.put(testMethodName, Boolean.TRUE);
ServiceRegistration reg = OSGiTestsActivator.getContext().registerService(Runnable.class.getName(), runIt, props);
ServiceTracker testTracker = null;
try {
final boolean[] results = new boolean[] {false, false, false};
ServiceTrackerCustomizer testCustomizer = new ServiceTrackerCustomizer() {
public Object addingService(ServiceReference reference) {
results[0] = true;
return reference;
}
public void modifiedService(ServiceReference reference, Object service) {
results[1] = true;
}
public void removedService(ServiceReference reference, Object service) {
results[2] = true;
}
};
try {
testTracker = new ServiceTracker(OSGiTestsActivator.getContext(), FrameworkUtil.createFilter("(&(objectclass=java.lang.Runnable)(" + testMethodName.toLowerCase() + "=true))"), testCustomizer); //$NON-NLS-1$ //$NON-NLS-2$
} catch (InvalidSyntaxException e) {
fail("filter error", e); //$NON-NLS-1$
}
testTracker.open();
assertTrue("Did not call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to still match
props.put("testChangeProp", Boolean.FALSE); //$NON-NLS-1$
reg.setProperties(props);
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertTrue("Did not call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to no longer match
props.put(testMethodName, Boolean.FALSE);
reg.setProperties(props);
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertTrue("Did not call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to no longer match
props.put("testChangeProp", Boolean.TRUE); //$NON-NLS-1$
reg.setProperties(props);
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props back to match
props.put(testMethodName, Boolean.TRUE);
reg.setProperties(props);
assertTrue("Did not call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
} finally {
if (reg != null)
reg.unregister();
if (testTracker != null)
testTracker.close();
}
}
public void testServiceTracker02() {
final String testMethodName = getName();
// simple ServiceTracker test
Runnable runIt = new Runnable() {
public void run() {
// nothing
}
};
Hashtable props = new Hashtable();
props.put(testMethodName, Boolean.FALSE);
ServiceRegistration reg = OSGiTestsActivator.getContext().registerService(Runnable.class.getName(), runIt, props);
ServiceTracker testTracker = null;
try {
final boolean[] results = new boolean[] {false, false, false};
ServiceTrackerCustomizer testCustomizer = new ServiceTrackerCustomizer() {
public Object addingService(ServiceReference reference) {
results[0] = true;
return reference;
}
public void modifiedService(ServiceReference reference, Object service) {
results[1] = true;
}
public void removedService(ServiceReference reference, Object service) {
results[2] = true;
}
};
try {
testTracker = new ServiceTracker(OSGiTestsActivator.getContext(), FrameworkUtil.createFilter("(&(objectclass=java.lang.Runnable)(" + testMethodName.toLowerCase() + "=true))"), testCustomizer); //$NON-NLS-1$ //$NON-NLS-2$
} catch (InvalidSyntaxException e) {
fail("filter error", e); //$NON-NLS-1$
}
testTracker.open();
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to match
props.put(testMethodName, Boolean.TRUE);
reg.setProperties(props);
assertTrue("Did not call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to still match
props.put("testChangeProp", Boolean.TRUE); //$NON-NLS-1$
reg.setProperties(props);
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertTrue("Did not call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to no longer match
props.put(testMethodName, Boolean.FALSE);
reg.setProperties(props);
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertTrue("Did not call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to no longer match
props.put("testChangeProp", Boolean.FALSE); //$NON-NLS-1$
reg.setProperties(props);
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
} finally {
if (reg != null)
reg.unregister();
if (testTracker != null)
testTracker.close();
}
}
public void testServiceTracker03() {
final String testMethodName = getName();
// simple ServiceTracker test
Runnable runIt = new Runnable() {
public void run() {
// nothing
}
};
Hashtable props = new Hashtable();
props.put(testMethodName, Boolean.TRUE);
ServiceRegistration reg = OSGiTestsActivator.getContext().registerService(Runnable.class.getName(), runIt, props);
ServiceTracker testTracker = null;
try {
final boolean[] results = new boolean[] {false, false, false};
ServiceTrackerCustomizer testCustomizer = new ServiceTrackerCustomizer() {
public Object addingService(ServiceReference reference) {
results[0] = true;
return reference;
}
public void modifiedService(ServiceReference reference, Object service) {
results[1] = true;
}
public void removedService(ServiceReference reference, Object service) {
results[2] = true;
}
};
try {
testTracker = new ServiceTracker(OSGiTestsActivator.getContext(), FrameworkUtil.createFilter("(&(objectclass=java.lang.Runnable)(" + testMethodName.toLowerCase() + "=true))"), testCustomizer); //$NON-NLS-1$ //$NON-NLS-2$
} catch (InvalidSyntaxException e) {
fail("filter error", e); //$NON-NLS-1$
}
testTracker.open();
assertTrue("Did not call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to not match
props.put(testMethodName, Boolean.FALSE);
reg.setProperties(props);
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertTrue("Did not call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to match
props.put(testMethodName, Boolean.TRUE);
reg.setProperties(props);
assertTrue("Did not call addingService", results[0]); //$NON-NLS-1$
assertFalse("Did call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
// change props to still match
props.put("testChangeProp", Boolean.FALSE); //$NON-NLS-1$
reg.setProperties(props);
assertFalse("Did call addingService", results[0]); //$NON-NLS-1$
assertTrue("Did not call modifiedService", results[1]); //$NON-NLS-1$
assertFalse("Did call removedService", results[2]); //$NON-NLS-1$
clearResults(results);
} finally {
if (reg != null)
reg.unregister();
if (testTracker != null)
testTracker.close();
}
}
private void clearResults(boolean[] results) {
for (int i = 0; i < results.length; i++)
results[i] = false;
}
}