/******************************************************************************* * 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; } }