Try to reproduce the issue described in http://www.mail-archive.com/users@felix.apache.org/msg09205.html

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1045175 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C1.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C1.java
new file mode 100644
index 0000000..a1e6f57
--- /dev/null
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C1.java
@@ -0,0 +1,11 @@
+package org.apache.felix.ipojo.test.scenarios.component.inner;
+
+import org.apache.felix.ipojo.test.scenarios.service.dependency.service.Call;
+
+public class C1 implements Call {
+
+	public String callMe() {
+		return "called";
+	}
+
+}
diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C2.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C2.java
new file mode 100644
index 0000000..b0e23ab
--- /dev/null
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C2.java
@@ -0,0 +1,13 @@
+package org.apache.felix.ipojo.test.scenarios.component.inner;
+
+import org.apache.felix.ipojo.test.scenarios.service.dependency.service.Call;
+
+public class C2 {
+
+	private Call c1;
+
+	public String authenticate() {
+		return c1.callMe();
+	}
+
+}
diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C3.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C3.java
new file mode 100644
index 0000000..c9bd632
--- /dev/null
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/C3.java
@@ -0,0 +1,19 @@
+package org.apache.felix.ipojo.test.scenarios.component.inner;
+
+public class C3 {
+
+	private C2 c2;
+
+	public MyFilter getFilter()	{
+		return new MyFilter() {
+			public String authenticate() {
+				System.out.println("My Filter ...");
+				String r = c2.authenticate();
+				System.out.println(" ... " + r);
+				return r;
+			}
+		};
+
+	}
+
+}
diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/MyFilter.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/MyFilter.java
new file mode 100644
index 0000000..2b5adc2
--- /dev/null
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inner/MyFilter.java
@@ -0,0 +1,7 @@
+package org.apache.felix.ipojo.test.scenarios.component.inner;
+
+public interface MyFilter {
+
+	public String authenticate();
+
+}
diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyTestSuite.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyTestSuite.java
index 0803a30..51045e2 100644
--- a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyTestSuite.java
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/DependencyTestSuite.java
@@ -22,6 +22,7 @@
 

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

 import org.apache.felix.ipojo.test.scenarios.service.dependency.di.DefaultImplementationTestSuite;

+import org.apache.felix.ipojo.test.scenarios.service.dependency.inner.InnerProxyMixTest;

 import org.osgi.framework.BundleContext;

 

 public class DependencyTestSuite {

@@ -63,6 +64,7 @@
         ots.addTestSuite(ModifyDependencies.class);

         ots.addTestSuite(ProxyTest.class);

         ots.addTestSuite(NonProxiedNotInterfaceDependencies.class);

+        ots.addTestSuite(InnerProxyMixTest.class);

         return ots;

     }

 

diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/inner/InnerProxyMixTest.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/inner/InnerProxyMixTest.java
new file mode 100644
index 0000000..1a59c0a
--- /dev/null
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/inner/InnerProxyMixTest.java
@@ -0,0 +1,66 @@
+package org.apache.felix.ipojo.test.scenarios.service.dependency.inner;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.junit4osgi.helpers.IPOJOHelper;
+import org.apache.felix.ipojo.test.scenarios.component.inner.C1;
+import org.apache.felix.ipojo.test.scenarios.component.inner.C2;
+import org.apache.felix.ipojo.test.scenarios.component.inner.C3;
+
+public class InnerProxyMixTest extends OSGiTestCase {
+
+	public static String C1 = C1.class.getName();
+	public static String C2 = C2.class.getName();
+	public static String C3 = C3.class.getName();
+
+	IPOJOHelper ipojo;
+	private ComponentInstance instancec1;
+	private ComponentInstance instancec2;
+	private ComponentInstance instancec3;
+
+	public void setUp() {
+		ipojo = new IPOJOHelper(this);
+		// Create the instances
+		instancec1 = ipojo.createComponentInstance(C1);
+		instancec2 = ipojo.createComponentInstance(C2);
+		instancec3 = ipojo.createComponentInstance(C3);
+	}
+
+	public void tearDown() {
+		ipojo.dispose();
+	}
+
+	public void testMix() {
+		// Check that everything is OK
+		assertEquals(ComponentInstance.VALID, instancec1.getState());
+		assertEquals(ComponentInstance.VALID, instancec2.getState());
+		assertEquals(ComponentInstance.VALID, instancec3.getState());
+
+		// Call C3
+		C3 svc = (C3) getServiceObject(C3, null);
+		assertNotNull(svc);
+		assertEquals("called", svc.getFilter().authenticate());
+
+		// So far, all right
+
+		//We stop c1 and c2.
+		instancec1.stop();
+		instancec2.stop();
+
+		assertEquals(ComponentInstance.INVALID, instancec3.getState()); // C2 dependency invalid
+
+		instancec1.start();
+		instancec2.start();
+
+		// Check that everything is OK
+		assertEquals(ComponentInstance.VALID, instancec1.getState());
+		assertEquals(ComponentInstance.VALID, instancec2.getState());
+		assertEquals(ComponentInstance.VALID, instancec3.getState());
+
+		// Call C3
+		svc = (C3) getServiceObject(C3, null);
+		assertNotNull(svc);
+		assertEquals("called", svc.getFilter().authenticate());
+	}
+
+}
diff --git a/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/service/Call.java b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/service/Call.java
new file mode 100644
index 0000000..34513fb
--- /dev/null
+++ b/ipojo/tests/core/service-dependency/src/main/java/org/apache/felix/ipojo/test/scenarios/service/dependency/service/Call.java
@@ -0,0 +1,8 @@
+package org.apache.felix.ipojo.test.scenarios.service.dependency.service;
+
+public interface Call {
+
+
+	public String callMe();
+
+}
diff --git a/ipojo/tests/core/service-dependency/src/main/resources/metadata.xml b/ipojo/tests/core/service-dependency/src/main/resources/metadata.xml
index 1571e43..e4e3a7f 100644
--- a/ipojo/tests/core/service-dependency/src/main/resources/metadata.xml
+++ b/ipojo/tests/core/service-dependency/src/main/resources/metadata.xml
@@ -1045,4 +1045,20 @@
     <requires field="map"/>

   </component>

 

+	<!-- Inner + Proxy mix -->

+  <component

+  	classname="org.apache.felix.ipojo.test.scenarios.component.inner.C1">

+  		<provides/>

+  </component>

+  <component

+  	classname="org.apache.felix.ipojo.test.scenarios.component.inner.C2">

+  		<provides specifications="org.apache.felix.ipojo.test.scenarios.component.inner.C2"/>

+		<requires field="c1"/>

+  </component>

+  <component

+  	classname="org.apache.felix.ipojo.test.scenarios.component.inner.C3">

+  		<provides specifications="org.apache.felix.ipojo.test.scenarios.component.inner.C3"/>

+		<requires field="c2"/>

+  </component>

+

 </ipojo>