Added tests for auto configuration and callbacks with multiple services.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@884346 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/dependencymanager/test/src/test/java/org/apache/felix/dependencymanager/test/MultipleServiceDependencyTest.java b/dependencymanager/test/src/test/java/org/apache/felix/dependencymanager/test/MultipleServiceDependencyTest.java
index 691d551..927ea37 100644
--- a/dependencymanager/test/src/test/java/org/apache/felix/dependencymanager/test/MultipleServiceDependencyTest.java
+++ b/dependencymanager/test/src/test/java/org/apache/felix/dependencymanager/test/MultipleServiceDependencyTest.java
@@ -19,84 +19,130 @@
@RunWith(JUnit4TestRunner.class)
public class MultipleServiceDependencyTest {
- @Configuration
- public static Option[] configuration() {
- return options(
- provision(
- mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version("4.2.0"),
- mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
- )
- );
- }
+ @Configuration
+ public static Option[] configuration() {
+ return options(
+ provision(
+ mavenBundle().groupId("org.osgi").artifactId("org.osgi.compendium").version("4.2.0"),
+ mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.dependencymanager").versionAsInProject()
+ )
+ );
+ }
- @Test
- public void testMultipleServiceRegistrationAndConsumption(BundleContext context) {
- DependencyManager m = new DependencyManager(context, new Logger(context));
- // helper class that ensures certain steps get executed in sequence
- Ensure e = new Ensure();
- // create a service provider and consumer
- Service provider = m.createService().setImplementation(new ServiceProvider(e)).setInterface(ServiceInterface.class.getName(), null);
- Service providerWithHighRank = m.createService().setImplementation(new ServiceProvider2(e)).setInterface(ServiceInterface.class.getName(), new Properties() {{ put(Constants.SERVICE_RANKING, Integer.valueOf(5)); }});
- Service consumer = m.createService().setImplementation(new ServiceConsumer(e)).add(m.createServiceDependency().setService(ServiceInterface.class).setRequired(true));
- m.add(provider);
- m.add(providerWithHighRank);
- m.add(consumer);
- e.waitForStep(3, 1000);
- m.remove(providerWithHighRank);
- e.step(4);
- e.waitForStep(5, 1000);
- m.remove(provider);
- m.remove(consumer);
- e.waitForStep(6, 1000);
- }
-
- static interface ServiceInterface {
- public void invoke();
- }
+ @Test
+ public void testMultipleServiceRegistrationAndConsumption(BundleContext context) {
+ DependencyManager m = new DependencyManager(context, new Logger(context));
+ // helper class that ensures certain steps get executed in sequence
+ Ensure e = new Ensure();
+ // create a service provider and consumer
+ Service provider = m.createService().setImplementation(new ServiceProvider(e)).setInterface(ServiceInterface.class.getName(), null);
+ Service providerWithHighRank = m.createService().setImplementation(new ServiceProvider2(e)).setInterface(ServiceInterface.class.getName(), new Properties() {{ put(Constants.SERVICE_RANKING, Integer.valueOf(5)); }});
+ Service consumer = m.createService().setImplementation(new ServiceConsumer(e)).add(m.createServiceDependency().setService(ServiceInterface.class).setRequired(true));
+ m.add(provider);
+ m.add(providerWithHighRank);
+ m.add(consumer);
+ e.waitForStep(3, 1000);
+ m.remove(providerWithHighRank);
+ e.step(4);
+ e.waitForStep(5, 1000);
+ m.remove(provider);
+ m.remove(consumer);
+ e.waitForStep(6, 1000);
+ }
- static class ServiceProvider implements ServiceInterface {
- private final Ensure m_ensure;
- public ServiceProvider(Ensure e) {
- m_ensure = e;
- }
- public void invoke() {
- m_ensure.step(5);
- }
- }
+ @Test
+ public void testReplacementAutoConfig(BundleContext context) {
+ DependencyManager m = new DependencyManager(context, new Logger(context));
+ // helper class that ensures certain steps get executed in sequence
+ Ensure e = new Ensure();
+ // create a service provider and consumer
+ Service provider = m.createService().setImplementation(new ServiceProvider(e)).setInterface(ServiceInterface.class.getName(), null);
+ Service provider2 = m.createService().setImplementation(new ServiceProvider2(e)).setInterface(ServiceInterface.class.getName(), null);
+ Service consumer = m.createService().setImplementation(new ServiceConsumer(e)).add(m.createServiceDependency().setService(ServiceInterface.class).setRequired(true));
+ m.add(provider2);
+ m.add(consumer);
+ e.waitForStep(3, 1000);
+ m.add(provider);
+ m.remove(provider2);
+ e.step(4);
+ e.waitForStep(5, 1000);
+ m.remove(provider);
+ m.remove(consumer);
+ e.waitForStep(6, 1000);
+ }
- static class ServiceProvider2 implements ServiceInterface {
- private final Ensure m_ensure;
- public ServiceProvider2(Ensure e) {
- m_ensure = e;
- }
- public void invoke() {
- m_ensure.step(2);
- }
- }
+ @Test
+ public void testReplacementCallbacks(BundleContext context) {
+ DependencyManager m = new DependencyManager(context, new Logger(context));
+ // helper class that ensures certain steps get executed in sequence
+ Ensure e = new Ensure();
+ // create a service provider and consumer
+ Service provider = m.createService().setImplementation(new ServiceProvider(e)).setInterface(ServiceInterface.class.getName(), null);
+ Service provider2 = m.createService().setImplementation(new ServiceProvider2(e)).setInterface(ServiceInterface.class.getName(), null);
+ Service consumer = m.createService().setImplementation(new ServiceConsumer(e))
+ .add(m.createServiceDependency()
+ .setService(ServiceInterface.class)
+ .setRequired(true)
+ .setCallbacks("add", "remove"));
+ m.add(provider2);
+ m.add(consumer);
+ e.waitForStep(3, 1000);
+ m.add(provider);
+ m.remove(provider2);
+ e.step(4);
+ e.waitForStep(5, 1000);
+ m.remove(provider);
+ m.remove(consumer);
+ e.waitForStep(6, 1000);
+ }
- static class ServiceConsumer implements Runnable {
- private volatile ServiceInterface m_service;
- private final Ensure m_ensure;
+ static interface ServiceInterface {
+ public void invoke();
+ }
- public ServiceConsumer(Ensure e) {
- m_ensure = e;
- }
-
- public void init() {
- Thread t = new Thread(this);
- t.start();
- }
-
- public void run() {
- m_ensure.step(1);
- m_service.invoke();
- m_ensure.step(3);
- m_ensure.waitForStep(4, 1000);
- m_service.invoke();
- }
-
- public void destroy() {
- m_ensure.step(6);
- }
- }
-}
+ static class ServiceProvider implements ServiceInterface {
+ private final Ensure m_ensure;
+ public ServiceProvider(Ensure e) {
+ m_ensure = e;
+ }
+ public void invoke() {
+ m_ensure.step(5);
+ }
+ }
+
+ static class ServiceProvider2 implements ServiceInterface {
+ private final Ensure m_ensure;
+ public ServiceProvider2(Ensure e) {
+ m_ensure = e;
+ }
+ public void invoke() {
+ m_ensure.step(2);
+ }
+ }
+
+ static class ServiceConsumer implements Runnable {
+ private volatile ServiceInterface m_service;
+ private final Ensure m_ensure;
+
+ private void add(ServiceInterface service) { m_service = service; }
+ private void remove(ServiceInterface service) { if (m_service == service) { m_service = null; }};
+ public ServiceConsumer(Ensure e) { m_ensure = e; }
+
+ public void start() {
+ Thread t = new Thread(this);
+ t.start();
+ }
+
+ public void run() {
+ m_ensure.step(1);
+ m_service.invoke();
+ m_ensure.step(3);
+ m_ensure.waitForStep(4, 1000);
+ m_service.invoke();
+ }
+
+ public void stop() {
+ m_ensure.step(6);
+ }
+ }
+}
\ No newline at end of file