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>