Add some tests checking that instances are consistently created and disposed according to their factories validity / invalidity.

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@683189 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/tests/core/external-handlers/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceHandler.java b/ipojo/tests/core/external-handlers/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceHandler.java
index ebb550b..a4a921a 100644
--- a/ipojo/tests/core/external-handlers/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceHandler.java
+++ b/ipojo/tests/core/external-handlers/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceHandler.java
@@ -86,9 +86,11 @@
 	}

 	

 	public void stateChanged(int state) {

-		changes++;

-		props.put("changes", new Integer(changes));

-		sr.setProperties(props);

+		if (sr != null) {

+		    changes++;

+		    props.put("changes", new Integer(changes));

+		    sr.setProperties(props);

+		}

 	}

 

 	public String getName() {

diff --git a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/component/SimpleType.java b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/component/SimpleType.java
new file mode 100644
index 0000000..6938eba
--- /dev/null
+++ b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/component/SimpleType.java
@@ -0,0 +1,7 @@
+package org.apache.felix.ipojo.test.scenarios.component;
+
+public class SimpleType {
+    
+    private boolean m_controller;
+
+}
diff --git a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/factories/ObedienceTest.java b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/factories/ObedienceTest.java
index 8ecdf56..b2b29ea 100644
--- a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/factories/ObedienceTest.java
+++ b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/factories/ObedienceTest.java
@@ -22,9 +22,13 @@
 

 import org.apache.felix.ipojo.ComponentFactory;

 import org.apache.felix.ipojo.ComponentInstance;

+import org.apache.felix.ipojo.Factory;

+import org.apache.felix.ipojo.HandlerManagerFactory;

+import org.apache.felix.ipojo.architecture.Architecture;

 import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;

 import org.apache.felix.ipojo.test.scenarios.factories.service.FooService;

 import org.apache.felix.ipojo.test.scenarios.util.Utils;

+import org.osgi.framework.ServiceReference;

 

 /**

  * Check that instances are disposed when the factory is stopped.

@@ -65,5 +69,48 @@
 		factory.start();

 		assertNull("Check no foo service", context.getServiceReference(FooService.class.getName()));

 	}

+	

+	public void testDisposeAfterFactoryInvalidation() {

+	    ComponentFactory cf = (ComponentFactory) Utils.getFactoryByName(context, "org.apache.felix.ipojo.test.scenarios.component.SimpleType");

+	    assertNotNull("Check factory availability -1", cf);

+	    assertEquals("Check factory state -1", Factory.VALID, cf.getState());

+	    

+	    ServiceReference ref_arch = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "SimpleInstance");

+	    assertNotNull("Check Architecture availability -1", ref_arch);

+	    

+        HandlerManagerFactory hf = (HandlerManagerFactory) Utils.getHandlerFactoryByName(context, "controller");

+        assertNotNull("Check handler availability -1", hf);

+        assertEquals("Check handler state -1", Factory.VALID, hf.getState());

+        

+        // Stop the handler

+        hf.stop();

+        HandlerManagerFactory hf2 = (HandlerManagerFactory) Utils.getHandlerFactoryByName(context, "controller");

+        assertNull("Check handler availability -2", hf2);

+        

+        // Check the factory invalidity

+        cf = (ComponentFactory) Utils.getFactoryByName(context, "org.apache.felix.ipojo.test.scenarios.component.SimpleType");

+        assertNotNull("Check factory availability -2", cf);

+        assertEquals("Check factory state -2", Factory.INVALID, cf.getState());

+        

+        // Check the instance disparition

+        ref_arch = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "SimpleInstance");

+        assertNull("Check Architecture availability -1", ref_arch);

+        

+        // Restart the handler

+        hf.start();

+        hf2 = (HandlerManagerFactory) Utils.getHandlerFactoryByName(context, "controller");

+        assertNotNull("Check handler availability -3", hf2);

+        

+        // Check the factory state

+        cf = (ComponentFactory) Utils.getFactoryByName(context, "org.apache.felix.ipojo.test.scenarios.component.SimpleType");

+        assertNotNull("Check factory availability -3", cf);

+        assertEquals("Check factory state -3", Factory.VALID, cf.getState());

+        

+        

+        // Check the instance re-creation

+        ref_arch = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "SimpleInstance");

+        assertNotNull("Check Architecture availability -3", ref_arch);

+        

+	}

 

 }

diff --git a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
index a684a6b..e4754a0 100644
--- a/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
+++ b/ipojo/tests/core/factories/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
@@ -26,9 +26,10 @@
 import org.apache.felix.ipojo.ComponentInstance;

 import org.apache.felix.ipojo.Factory;

 import org.apache.felix.ipojo.Handler;

+import org.apache.felix.ipojo.HandlerFactory;

 import org.apache.felix.ipojo.HandlerManagerFactory;

 import org.apache.felix.ipojo.ServiceContext;

-//import org.apache.felix.ipojo.composite.CompositeManager;

+import org.apache.felix.ipojo.architecture.Architecture;

 import org.osgi.framework.BundleContext;

 import org.osgi.framework.InvalidSyntaxException;

 import org.osgi.framework.ServiceReference;

@@ -54,7 +55,7 @@
     public static HandlerManagerFactory getHandlerFactoryByName(BundleContext bc, String factoryName) {

         ServiceReference[] refs;

         try {

-            refs = bc.getServiceReferences(Factory.class.getName(), "(" + Handler.HANDLER_NAME_PROPERTY + "=" + factoryName + ")");

+            refs = bc.getServiceReferences(HandlerFactory.class.getName(), "(" + Handler.HANDLER_NAME_PROPERTY + "=" + factoryName + ")");

             if (refs == null) {

                 System.err.println("Cannot get the factory " + factoryName);

                 return null;

@@ -141,6 +142,8 @@
         String filter = null;

         if (itf.equals(Factory.class.getName()) || itf.equals(ManagedServiceFactory.class.getName())) {

             filter = "(" + "factory.name" + "=" + name + ")";

+        } else if (itf.equals(Architecture.class.getName())) {

+            filter = "(" + "architecture.instance" + "=" + name + ")";

         } else {

             filter = "(" + "instance.name" + "=" + name + ")";

         }

diff --git a/ipojo/tests/core/factories/src/main/resources/metadata.xml b/ipojo/tests/core/factories/src/main/resources/metadata.xml
index c6abfe7..026b95e 100644
--- a/ipojo/tests/core/factories/src/main/resources/metadata.xml
+++ b/ipojo/tests/core/factories/src/main/resources/metadata.xml
@@ -66,4 +66,10 @@
 			<property name="bar" field="m_bar" />

 		</properties>

 	</component>

+	

+	<!-- type & instance used to check instance lifecycle against factory validation & invalidation -->

+	<component classname="org.apache.felix.ipojo.test.scenarios.component.SimpleType" architecture="true">

+		<controller field="m_controller"/>

+	</component>

+	<instance component="org.apache.felix.ipojo.test.scenarios.component.SimpleType" name="SimpleInstance"/>

 </ipojo>