jndi test

Signed-off-by: Raymond Augé <rotty3000@apache.org>
diff --git a/cdi-bom/pom.xml b/cdi-bom/pom.xml
index f1b0a15..489acb7 100644
--- a/cdi-bom/pom.xml
+++ b/cdi-bom/pom.xml
@@ -132,7 +132,7 @@
 			<dependency>
 				<groupId>org.eclipse.platform</groupId>
 				<artifactId>org.eclipse.osgi</artifactId>
-				<version>3.13.200</version>
+				<version>3.15.0</version>
 				<scope>runtime</scope>
 			</dependency>
 			<dependency>
diff --git a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
index bb77503..1f8e157 100644
--- a/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
+++ b/cdi-extender/src/main/java/org/apache/aries/cdi/container/internal/container/ContainerState.java
@@ -365,6 +365,11 @@
 		return promise;
 	}
 
+	@Override
+	public String toString() {
+		return _bundle.toString();
+	}
+
 	private final BundleClassLoader _aggregateClassLoader;
 	private volatile Deferred<BeanManager> _beanManagerDeferred;
 	private final BeansModel _beansModel;
diff --git a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ExtensionPhaseTest.java b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ExtensionPhaseTest.java
index c3e7a98..39eb794 100644
--- a/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ExtensionPhaseTest.java
+++ b/cdi-extender/src/test/java/org/apache/aries/cdi/container/internal/phase/ExtensionPhaseTest.java
@@ -14,9 +14,13 @@
 
 package org.apache.aries.cdi.container.internal.phase;
 
-import static org.apache.aries.cdi.container.internal.util.Reflection.*;
-import static org.junit.Assert.*;
-import static org.mockito.Mockito.*;
+import static org.apache.aries.cdi.container.internal.util.Reflection.cast;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
 import java.util.Collection;
diff --git a/cdi-itests/bnd.bnd b/cdi-itests/bnd.bnd
index 1c801b6..cf366ef 100644
--- a/cdi-itests/bnd.bnd
+++ b/cdi-itests/bnd.bnd
@@ -62,7 +62,8 @@
 	tb17.jar,\
 	tb18.jar,\
 	tb19.jar,\
-	tb20.jar
+	tb20.jar,\
+	tb21.jar
 
 # Don't forget that we had to coax the `maven-jar-plugin` NOT to include the `sub-bundle` packages in
 # the root bundle:
diff --git a/cdi-itests/bnd/tb21.bnd b/cdi-itests/bnd/tb21.bnd
new file mode 100644
index 0000000..9fb36bf
--- /dev/null
+++ b/cdi-itests/bnd/tb21.bnd
@@ -0,0 +1,13 @@
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+
+Export-Package: ${p}.tb21.*;-split-package:=first
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/package-info.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/package-info.java
index ea059f0..d99def2 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/package-info.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/beans/package-info.java
@@ -13,12 +13,6 @@
  */
 
 @Beans
-@Requirement(
-	namespace = CDIConstants.CDI_EXTENSION_PROPERTY,
-	name = "aries.cdi.jndi"
-)
 package org.apache.aries.cdi.test.beans;
 
-import org.osgi.annotation.bundle.Requirement;
-import org.osgi.service.cdi.CDIConstants;
 import org.osgi.service.cdi.annotations.Beans;
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java
index ce06d32..c0445c7 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/JndiExtensionTests.java
@@ -28,18 +28,23 @@
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.wiring.BundleWiring;
 import org.osgi.util.tracker.BundleTracker;
+import org.osgi.util.tracker.ServiceTracker;
 
-public class JndiExtensionTests extends AbstractTestCase {
+public class JndiExtensionTests extends SlimTestCase {
 
 	@Ignore("I think there's an issue with Aries JNDI. It doesn't work well with service objects")
 	@Test
 	public void testGetBeanManagerThroughJNDI() throws Exception {
-		assertNotNull(getBeanManager(cdiBundle));
+		Bundle testBundle = installBundle("tb21.jar", false);
+
+		testBundle.start();
+
+		assertNotNull(getBeanManager(testBundle));
 
 		Thread currentThread = Thread.currentThread();
 		ClassLoader contextClassLoader = currentThread.getContextClassLoader();
 		try {
-			BundleWiring bundleWiring = cdiBundle.adapt(BundleWiring.class);
+			BundleWiring bundleWiring = testBundle.adapt(BundleWiring.class);
 			currentThread.setContextClassLoader(bundleWiring.getClassLoader());
 
 			BeanManager beanManager = (BeanManager)InitialContext.doLookup("java:comp/BeanManager");
@@ -65,12 +70,20 @@
 		};
 		bundleTracker.open();
 
+		Bundle testBundle = installBundle("tb21.jar", false);
+
+		testBundle.start();
+
+		ServiceTracker<Pojo, Pojo> st = new ServiceTracker<Pojo, Pojo>(
+			bundleContext, Pojo.class, null);
+		st.open(true);
+
 		try {
 			assertFalse(bundleTracker.isEmpty());
 
 			Bundle extensionBundle = bundleTracker.getBundles()[0];
 
-			try (CloseableTracker<BeanManager, BeanManager> bmTracker = trackBM(cdiBundle);) {
+			try (CloseableTracker<BeanManager, BeanManager> bmTracker = trackBM(testBundle);) {
 				assertNotNull(bmTracker.waitForService(timeout));
 
 				extensionBundle.stop();
@@ -79,18 +92,19 @@
 					Thread.sleep(100);
 				}
 
-				assertThat(bmTracker).matches(CloseableTracker::isEmpty);
+				assertThat(bmTracker).matches(CloseableTracker::isEmpty, "Is empty");
 
 				extensionBundle.start();
 
-				for (int i = 20; (i > 0) && bmTracker.isEmpty(); i--) {
+				for (int i = 100; (i > 0) && bmTracker.isEmpty(); i--) {
 					Thread.sleep(100);
 				}
 
-				assertThat(bmTracker).matches(c -> !c.isEmpty());
+				assertThat(bmTracker).matches(c -> !c.isEmpty(), "Not empty");
 			}
 		}
 		finally {
+			testBundle.uninstall();
 			bundleTracker.close();
 		}
 	}
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/Test152_3_1_1.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/Test152_3_1_1.java
index ca30927..92618ff 100644
--- a/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/Test152_3_1_1.java
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/cases/Test152_3_1_1.java
@@ -60,9 +60,9 @@
 		AtomicReference<Deferred<Object[]>> b = new AtomicReference<>(new Deferred<>());
 		AtomicReference<Deferred<Object[]>> c = new AtomicReference<>(new Deferred<>());
 
-		Consumer<Object[]> onInitialized = (o) -> a.get().resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.get().resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.get().resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.get().resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.get().resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.get().resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -96,6 +96,8 @@
 				a.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
 
 				configuration = configurationAdmin.getConfiguration("prototypeFactory", "?");
+
+				// this will trigger the onInitialized because of the tracker
 				configuration.update(new Hashtable() {{put("foo", "bar");}});
 
 				// should only work with single configuration instances
@@ -108,11 +110,12 @@
 
 				assertThat(tracker.waitForService(50)).isNotNull();
 
-				// we still didn't do a "get" so this should still fail
-				a.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
-
 				ServiceObjects<Object> serviceObjects = bundleContext.getServiceObjects(tracker.getService());
 
+				a.set(new Deferred<>());
+				b.set(new Deferred<>());
+				c.set(new Deferred<>());
+
 				Object service = serviceObjects.getService();
 				assertThat(service).isNotNull();
 
@@ -212,7 +215,6 @@
 					s -> {
 						Object[] values = s.getValue();
 
-						assertThat(other).isEqualTo(values[0]);
 						assertThat((Map<String, Object>)values[1]).contains(
 							entry("component.name", "prototypeFactory")
 						).contains(
@@ -232,7 +234,6 @@
 					s -> {
 						Object[] values = s.getValue();
 
-						assertThat(other).isEqualTo(values[0]);
 						assertThat((Map<String, Object>)values[1]).contains(
 							entry("component.name", "prototypeFactory")
 						).contains(
@@ -276,9 +277,11 @@
 		AtomicReference<Deferred<Object[]>> b = new AtomicReference<>(new Deferred<>());
 		AtomicReference<Deferred<Object[]>> c = new AtomicReference<>(new Deferred<>());
 
-		Consumer<Object[]> onInitialized = (o) -> a.get().resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.get().resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.get().resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {
+			try {
+				a.get().resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.get().resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.get().resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -312,23 +315,14 @@
 				a.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
 
 				configuration = configurationAdmin.getConfiguration("prototypeSingle_C", "?");
+
+				// this will trigger the onInitialized because of the tracker
 				configuration.update(new Hashtable() {{put("foo", "bar");}});
 
-				assertThat(tracker.waitForService(50)).isNotNull();
-
-				// we still didn't do a "get" so this should still fail
-				a.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
-
-				ServiceObjects<Object> serviceObjects = bundleContext.getServiceObjects(tracker.getService());
-
-				Object service = serviceObjects.getService();
-				assertThat(service).isNotNull();
-
 				a.get().getPromise().timeout(timeout).then(
 					s -> {
 						Object[] values = s.getValue();
 
-						assertThat(service).isEqualTo(values[0]);
 						assertThat((Map<String, Object>)values[1]).contains(
 							entry("component.name", "prototypeSingle_C")
 						).contains(
@@ -344,14 +338,16 @@
 
 				a.set(new Deferred<>());
 
-				Object other = serviceObjects.getService();
-				assertThat(other).isNotNull();
+				ServiceObjects<Object> serviceObjects = bundleContext.getServiceObjects(tracker.getService());
+
+				Object instance1 = serviceObjects.getService();
+				assertThat(instance1).isNotNull();
 
 				a.get().getPromise().timeout(timeout).then(
 					s -> {
 						Object[] values = s.getValue();
 
-						assertThat(other).isEqualTo(values[0]);
+						assertThat(instance1).isEqualTo(values[0]);
 						assertThat((Map<String, Object>)values[1]).contains(
 							entry("component.name", "prototypeSingle_C")
 						).contains(
@@ -365,15 +361,38 @@
 				b.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
 				c.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
 
-				assertThat(service).isNotEqualTo(other);
+				a.set(new Deferred<>());
 
-				serviceObjects.ungetService(service);
+				Object instance2 = serviceObjects.getService();
+				assertThat(instance2).isNotNull();
+
+				a.get().getPromise().timeout(timeout).then(
+					s -> {
+						Object[] values = s.getValue();
+
+						assertThat(instance2).isEqualTo(values[0]);
+						assertThat((Map<String, Object>)values[1]).contains(
+							entry("component.name", "prototypeSingle_C")
+						).contains(
+							entry("foo", "bar")
+						);
+
+						return s;
+					},
+					f -> fail(f.toString())
+				).getValue();
+				b.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
+				c.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
+
+				assertThat(instance1).isNotEqualTo(instance2);
+
+				serviceObjects.ungetService(instance1);
 
 				b.get().getPromise().timeout(timeout).then(
 					s -> {
 						Object[] values = s.getValue();
 
-						assertThat(service).isEqualTo(values[0]);
+						assertThat(instance1).isEqualTo(values[0]);
 						assertThat((Map<String, Object>)values[1]).contains(
 							entry("component.name", "prototypeSingle_C")
 						);
@@ -387,7 +406,7 @@
 					s -> {
 						Object[] values = s.getValue();
 
-						assertThat(service).isEqualTo(values[0]);
+						assertThat(instance1).isEqualTo(values[0]);
 						assertThat((Map<String, Object>)values[1]).contains(
 							entry("component.name", "prototypeSingle_C")
 						);
@@ -406,7 +425,6 @@
 					s -> {
 						Object[] values = s.getValue();
 
-						assertThat(other).isEqualTo(values[0]);
 						assertThat((Map<String, Object>)values[1]).contains(
 							entry("component.name", "prototypeSingle_C")
 						);
@@ -420,7 +438,6 @@
 					s -> {
 						Object[] values = s.getValue();
 
-						assertThat(other).isEqualTo(values[0]);
 						assertThat((Map<String, Object>)values[1]).contains(
 							entry("component.name", "prototypeSingle_C")
 						);
@@ -458,9 +475,9 @@
 		AtomicReference<Deferred<Object[]>> b = new AtomicReference<>(new Deferred<>());
 		AtomicReference<Deferred<Object[]>> c = new AtomicReference<>(new Deferred<>());
 
-		Consumer<Object[]> onInitialized = (o) -> a.get().resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.get().resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.get().resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.get().resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.get().resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.get().resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -489,11 +506,10 @@
 			try (CloseableTracker<Object, ServiceReference<Object>> tracker = trackSR("(objectClass=%s)", Pojo.class.getName())) {
 				assertThat(tracker.waitForService(50)).isNotNull();
 
-				// we didn't do a "get" yet
-				a.get().getPromise().timeout(timeout).then(assertFailed).getFailure();
-
 				ServiceObjects<Object> serviceObjects = bundleContext.getServiceObjects(tracker.getService());
 
+				a.set(new Deferred<>());
+
 				Object service = serviceObjects.getService();
 				assertThat(service).isNotNull();
 
@@ -619,9 +635,9 @@
 		Deferred<Object[]> b = new Deferred<>();
 		Deferred<Object[]> c = new Deferred<>();
 
-		Consumer<Object[]> onInitialized = (o) -> a.resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -891,9 +907,9 @@
 		Deferred<Object[]> b = new Deferred<>();
 		Deferred<Object[]> c = new Deferred<>();
 
-		Consumer<Object[]> onInitialized = (o) -> a.resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -985,9 +1001,9 @@
 		Deferred<Object[]> b = new Deferred<>();
 		Deferred<Object[]> c = new Deferred<>();
 
-		Consumer<Object[]> onInitialized = (o) -> a.resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -1124,9 +1140,9 @@
 		Deferred<Object[]> b = new Deferred<>();
 		Deferred<Object[]> c = new Deferred<>();
 
-		Consumer<Object[]> onInitialized = (o) -> a.resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -1248,9 +1264,9 @@
 		Deferred<Object[]> b = new Deferred<>();
 		Deferred<Object[]> c = new Deferred<>();
 
-		Consumer<Object[]> onInitialized = (o) -> a.resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -1335,9 +1351,9 @@
 		Deferred<Object[]> b = new Deferred<>();
 		Deferred<Object[]> c = new Deferred<>();
 
-		Consumer<Object[]> onInitialized = (o) -> a.resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -1442,9 +1458,9 @@
 		Deferred<Object[]> b = new Deferred<>();
 		Deferred<Object[]> c = new Deferred<>();
 
-		Consumer<Object[]> onInitialized = (o) -> a.resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
@@ -1539,9 +1555,9 @@
 		Deferred<Object[]> b = new Deferred<>();
 		Deferred<Object[]> c = new Deferred<>();
 
-		Consumer<Object[]> onInitialized = (o) -> a.resolve(o);
-		Consumer<Object[]> onBeforeDestroyed = (o) -> b.resolve(o);
-		Consumer<Object[]> onDestroyed = (o) -> c.resolve(o);
+		Consumer<Object[]> onInitialized = (o) -> {try {a.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onBeforeDestroyed = (o) -> {try {b.resolve(o);} catch (Exception e) {}};
+		Consumer<Object[]> onDestroyed = (o) -> {try {c.resolve(o);} catch (Exception e) {}};
 
 		ServiceRegistration<Consumer> onInitializedReg = bundleContext.registerService(
 			Consumer.class, onInitialized,
diff --git a/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb21/A.java b/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb21/A.java
new file mode 100644
index 0000000..7f7a96d
--- /dev/null
+++ b/cdi-itests/src/main/java/org/apache/aries/cdi/test/tb21/A.java
@@ -0,0 +1,41 @@
+/**
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.aries.cdi.test.tb21;
+
+import org.apache.aries.cdi.test.interfaces.Pojo;
+import org.osgi.annotation.bundle.Requirement;
+import org.osgi.service.cdi.CDIConstants;
+import org.osgi.service.cdi.annotations.Bean;
+import org.osgi.service.cdi.annotations.Service;
+
+@Bean
+@Requirement(
+	namespace = CDIConstants.CDI_EXTENSION_PROPERTY,
+	name = "aries.cdi.jndi"
+)
+@Service
+public class A implements Pojo {
+
+	@Override
+	public String foo(String input) {
+		return "JNDI:" + input;
+	}
+
+	@Override
+	public int getCount() {
+		return 0;
+	}
+
+}