You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by pd...@apache.org on 2014/03/09 23:43:38 UTC

svn commit: r1575778 - /felix/sandbox/pderop/dependencymanager-prototype/dm.it/src/dm/it/InstanceBoundDependencyTest.java

Author: pderop
Date: Sun Mar  9 22:43:38 2014
New Revision: 1575778

URL: http://svn.apache.org/r1575778
Log:
Added more test cases, especially concerning auto config (but not instance bound) fields.

Modified:
    felix/sandbox/pderop/dependencymanager-prototype/dm.it/src/dm/it/InstanceBoundDependencyTest.java

Modified: felix/sandbox/pderop/dependencymanager-prototype/dm.it/src/dm/it/InstanceBoundDependencyTest.java
URL: http://svn.apache.org/viewvc/felix/sandbox/pderop/dependencymanager-prototype/dm.it/src/dm/it/InstanceBoundDependencyTest.java?rev=1575778&r1=1575777&r2=1575778&view=diff
==============================================================================
--- felix/sandbox/pderop/dependencymanager-prototype/dm.it/src/dm/it/InstanceBoundDependencyTest.java (original)
+++ felix/sandbox/pderop/dependencymanager-prototype/dm.it/src/dm/it/InstanceBoundDependencyTest.java Sun Mar  9 22:43:38 2014
@@ -19,13 +19,23 @@
 package dm.it;
 
 import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceReference;
 
 import dm.Component;
 import dm.DependencyManager;
 import junit.framework.Assert;
 
+/**
+ * This test does some injection tests on components being in INSTANTIATED_AND_WAITING_FOR_REQUIRED state.
+ */
 public class InstanceBoundDependencyTest extends TestBase {
     Ensure m_e;
     
@@ -33,91 +43,116 @@ public class InstanceBoundDependencyTest
         DependencyManager m = new DependencyManager(context);
         m_e = new Ensure();
         
-        Component myComponent = m.createComponent().setImplementation(new MyComponent());
-        myComponent.add(m.createServiceDependency().setService(Service1.class).setRequired(true).setCallbacks("add", "change", "remove"));
-        m.add(myComponent);
-        
-        Component s1_1 = m.createComponent().setImplementation(new Service1Impl()).setInterface(Service1.class.getName(), null);
+        // Create a "C" component: it depends on some S1 services, and on some S2 instance-bound services (declared from C.init() method)        
+        C cimpl = new C();
+        Component c = m.createComponent().setImplementation(cimpl);
+        c.add(m.createServiceDependency().setService(S1.class).setRequired(true).setCallbacks("addS1", "changeS1", "removeS1").setAutoConfig(true));
+        m.add(c);
+        
+        // Add S1 (s1_1): C.add(S1 s1) is called, then init() is called where a dependency is declared on S2
+        Properties s1_1_props = new Properties();
+        s1_1_props.put("name", "s1_1");
+        s1_1_props.put(Constants.SERVICE_RANKING, new Integer(10));
+        S1Impl s1_1_impl = new S1Impl();
+        Component s1_1 = m.createComponent().setImplementation(s1_1_impl).setInterface(S1.class.getName(), s1_1_props);
         m.add(s1_1);
-        m_e.waitForStep(2, 5000);
-        Component s1_2 = m.createComponent().setImplementation(new Service1Impl()).setInterface(Service1.class.getName(), null);
+        m_e.waitForStep(1, 5000); // wait until C.init called
+        ServiceReference ref = cimpl.getS1("s1_1");
+        Assert.assertNotNull(ref);
+        Assert.assertNotNull(cimpl.getS1());
+        Assert.assertEquals(s1_1_impl, cimpl.getS1());
+        
+        // At this point, MyComponent is in INSTANTIATED_AND_WAITING_FOR_REQUIRED state. 
+        // add now add another higher ranked S1 (s1_2) instance. C.add(s1_2) method should be called (the S1 dependency 
+        // is not instance bound), and m_s1 autoconfig field should be updated.
+        Properties s1_2_props = new Properties();
+        s1_2_props.put(Constants.SERVICE_RANKING, new Integer(20));
+        s1_2_props.put("name", "s1_2");
+        S1Impl s1_2_impl = new S1Impl();
+        Component s1_2 = m.createComponent().setImplementation(s1_2_impl).setInterface(S1.class.getName(), s1_2_props);
         m.add(s1_2);
-        m_e.waitForStep(3, 5000);
-        s1_2.setServiceProperties(new Hashtable() {{ put("foo", "bar");}});
-        m_e.waitForStep(4, 5000);
-        m.remove(s1_2);
-        m_e.waitForStep(5, 5000);
-        Component s2_1 = m.createComponent().setImplementation(new Service2Impl()).setInterface(Service2.class.getName(), null);
-        m.add(s2_1);
-        m_e.waitForStep(6, 5000);
-        Component s2_2 = m.createComponent().setImplementation(new Service2Impl()).setInterface(Service2.class.getName(), null);
-        m.add(s2_2);
-        m_e.waitForStep(7, 5000);
-        s2_2.setServiceProperties(new Hashtable() {{ put("foo", "bar");}});
-        m_e.waitForStep(8, 5000);
-        m.remove(s2_2);
-        m_e.waitForStep(9, 5000);
+        ref = cimpl.getS1("s1_2");
+        Assert.assertNotNull(ref);
+        Assert.assertNotNull(cimpl.getS1()); 
+        Assert.assertEquals(s1_2_impl, cimpl.getS1()); // must return s1_2 with ranking = 20
+
+        // Now, change the s1_1 service properties: C.changed(s1_1) should be called, and C.m_s1AutoConfig should be updated
+        s1_1_props.put(Constants.SERVICE_RANKING, new Integer(30));
+        s1_1.setServiceProperties(s1_1_props);
+        ref = cimpl.getS1("s1_1");
+        Assert.assertNotNull(ref);
+        Assert.assertEquals(new Integer(30), ref.getProperty(Constants.SERVICE_RANKING));
+        Assert.assertNotNull(cimpl.getS1());
+        Assert.assertEquals(s1_1_impl, cimpl.getS1());
+        
+        // Now, remove the s1_1: C.remove(s1_1) should be called, and C.m_s1AutoConfig should be updated
+        m.remove(s1_1);
+        ref = cimpl.getS1("s1_1");
+        Assert.assertNull(cimpl.getS1("s1_1"));
+        Assert.assertNotNull(cimpl.getS1());
+        Assert.assertEquals(s1_2_impl, cimpl.getS1());
+        m.clear();
     }
     
-    public interface Service1 {        
+    // C component depends on some S1 required services
+    public interface S1 {
     }
     
-    public class Service1Impl implements Service1 {        
+    public class S1Impl implements S1 {
     }
     
-    public interface Service2 {        
+    public interface S2 {        
     }
     
-    public class Service2Impl implements Service2 {        
+    public class S2Impl implements S2 {        
     }
     
-    class MyComponent {
-        final List<Service1> m_service1List = new ArrayList();
-        final List<Service2> m_service2List = new ArrayList();
+    // Our "C" component: it depends on S1 (required) and S2 (required/instance bound)
+    class C {        
+        final Map<String, ServiceReference> m_s1Map = new HashMap();
+        final Map<String, ServiceReference> m_s2Map = new HashMap();
+        volatile S1 m_s1; // auto configured
+        
+        S1 getS1() {
+            return m_s1;
+        }
 
-        void add(Service1 s1) {
-            Assert.assertEquals(0, m_service2List.size());
-            m_service1List.add(s1);
-            if (m_service1List.size() == 1) {
-                m_e.step(1);
-            } else if (m_service1List.size() == 2) {
-                m_e.step(3);
-            }
+        void addS1(ServiceReference s1) {
+            m_s1Map.put((String) s1.getProperty("name"), s1);
         }
         
-        void change(Service1 s1) {
-            m_e.step(4);
+        void changeS1(ServiceReference s1) {
+            m_s1Map.put((String) s1.getProperty("name"), s1);
         }
         
-        void remove(Service1 s1) {
-            m_service1List.remove(s1);
-            Assert.assertEquals(1,  m_service1List.size());
-            m_e.step(5);
+        void removeS1(ServiceReference s1) {
+            m_s1Map.remove((String) s1.getProperty("name"));
         }
         
-        void init(Component c) {
-            DependencyManager m = c.getDependencyManager();
-            c.add(m.createServiceDependency().setService(Service2.class).setRequired(true).setCallbacks("add", "change", "remove"));
-            m_e.step(2);
+        void addS2(ServiceReference s2) {
+            m_s2Map.put((String) s2.getProperty("name"), s2);
+        }
+        
+        void changeS2(ServiceReference s2) {
+            m_s2Map.put((String) s2.getProperty("name"), s2);
         }
         
-        void add(Service2 s2) {
-            m_service2List.add(s2);
-            if (m_service2List.size() == 1) {
-                m_e.step(6);
-            } else if (m_service2List.size() == 2) {
-                m_e.step(7);
-            }  
+        void removeS2(ServiceReference s2) {
+            m_s2Map.remove((String) s2.getProperty("name"));
         }
         
-        void change(Service2 s2) {
-            m_e.step(8);
+        ServiceReference getS1(String name) {
+            return m_s1Map.get(name);
         }
         
-        void remove(Service2 s2) {
-            m_service2List.remove(s2);
-            Assert.assertEquals(1, m_service2List.size());
-            m_e.step(9);
+        ServiceReference getS2(String name) {
+            return m_s2Map.get(name);
+        }
+        
+        void init(Component c) {
+            DependencyManager m = c.getDependencyManager();
+            c.add(m.createServiceDependency().setService(S2.class).setRequired(true).setCallbacks("addS2", "changeS2", "removeS2"));
+            m_e.step(1);
         }
     }
 }