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