blob: 2c659d8fcdedacb794ada505a1082233ed59eb1c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.deltaspike.test.core.api.provider;
import org.apache.deltaspike.core.api.provider.BeanProvider;
import org.apache.deltaspike.core.api.provider.DependentProvider;
import org.apache.deltaspike.test.util.ArchiveUtils;
import org.apache.deltaspike.test.utils.CdiContainerUnderTest;
import org.apache.deltaspike.test.utils.Serializer;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.junit.Arquillian;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.JavaArchive;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.junit.Assert;
import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
@RunWith(Arquillian.class)
public class BeanProviderTest
{
private static final String CONTAINER_OWB_1_1_x = "owb-1\\.1\\..*";
private static final String CONTAINER_TOMEE_1_5_x = "tomee-1\\.5\\..*";
/**
*X TODO creating a WebArchive is only a workaround because JavaArchive cannot contain other archives.
*/
@Deployment
public static WebArchive deploy()
{
JavaArchive testJar = ShrinkWrap.create(JavaArchive.class, "beanProviderTest.jar")
.addPackage(BeanProviderTest.class.getPackage())
.addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
return ShrinkWrap.create(WebArchive.class, "beanProvider.war")
.addAsLibraries(ArchiveUtils.getDeltaSpikeCoreArchive())
.addAsLibraries(testJar)
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}
/**
* lookup by type
*/
@Test
public void simpleBeanLookupByType()
{
TestBean testBean = BeanProvider.getContextualReference(TestBean.class, false);
Assert.assertNotNull(testBean);
}
/**
* lookup by name with expected type
*/
@Test
public void simpleBeanLookupByName()
{
TestBean testBean = BeanProvider.getContextualReference("extraNameBean", false, TestBean.class);
Assert.assertNotNull(testBean);
}
/**
* lookup by name without type
*/
@Test
public void simpleBeanLookupByNameWithoutType()
{
{
// test with the convenient operator (optional=false implied)
Object testBean = BeanProvider.getContextualReference("extraNameBean");
Assert.assertNotNull(testBean);
Assert.assertTrue(testBean instanceof TestBean);
TestBean tb = (TestBean) testBean;
Assert.assertEquals(4711, tb.getI());
}
{
// test with the 'optional' flag set to false
Object testBean = BeanProvider.getContextualReference("extraNameBean", false);
Assert.assertNotNull(testBean);
Assert.assertTrue(testBean instanceof TestBean);
TestBean tb = (TestBean) testBean;
Assert.assertEquals(4711, tb.getI());
}
{
// test by name lookup with the 'optional' flag set to false
try
{
Object testBean = BeanProvider.getContextualReference("thisBeanDoesNotExist");
Assert.fail("BeanProvider#getContextualReference should have blown up with a non-existing bean!");
}
catch(IllegalStateException ise)
{
// all is well, this is exactly what should happen!
}
}
{
// test by type lookup with the 'optional' flag set to false
try
{
// guess we can safely assume that there is no producer for a ConcurrentHashMap in the system...
ConcurrentHashMap chm = BeanProvider.getContextualReference(ConcurrentHashMap.class);
Assert.fail("BeanProvider#getContextualReference should have blown up with a non-existing bean!");
}
catch(IllegalStateException ise)
{
// all is well, this is exactly what should happen!
}
}
}
/*
* lookup without result
*/
@Test
public void optionalBeanLookup()
{
NoBean result = BeanProvider.getContextualReference(NoBean.class, true);
Assert.assertNull(result);
}
/*
* lookup of all beans of a given type
*/
@Test
public void multiBeanLookupWithDependentBean() throws Exception
{
List<MultiBean> result = BeanProvider.getContextualReferences(MultiBean.class, false);
Assert.assertNotNull(result);
Assert.assertEquals(2, result.size());
}
/*
* lookup of all beans of a given type which aren't dependent scoped
*/
@Test
public void multiBeanLookupWithoutDependentBean() throws Exception
{
List<MultiBean> result = BeanProvider.getContextualReferences(MultiBean.class, false, false);
Assert.assertNotNull(result);
Assert.assertEquals(1, result.size());
}
/*
* create a manual instance, inject dependencies, set values of the dependencies and check the referenced cdi bean
*/
@Test
public void injectBeansInNonManagedInstance() throws Exception
{
ManualBean manualBean = new ManualBean();
Assert.assertNull(manualBean.getTestBean());
BeanProvider.injectFields(manualBean);
Assert.assertNotNull(manualBean.getTestBean());
Assert.assertEquals(4711, manualBean.getTestBean().getI());
int newValue = 14;
manualBean.getTestBean().setI(newValue);
Assert.assertEquals(newValue, manualBean.getTestBean().getI());
TestBean testBean = BeanProvider.getContextualReference(TestBean.class);
Assert.assertEquals(newValue, testBean.getI());
testBean.setI(4711); // reset the value if this test is executed first
}
@Test
public void testDependentBeanResolving() throws Exception
{
DependentProvider<DependentTestBean> dependentTestBeanProvider = BeanProvider.getDependent(DependentTestBean.class);
checkDependentProvider(dependentTestBeanProvider);
}
@Test
public void testNamedDependentBeanResolving() throws Exception
{
DependentProvider<DependentTestBean> dependentTestBeanProvider = BeanProvider.getDependent("dependentTestBean");
checkDependentProvider(dependentTestBeanProvider);
}
@Test
public void testDependentBeanSerialization() throws Exception
{
// this test is known to not work under owb-1.1.x as ManagedBean for Dependent scoped classes did not implement PassivationCapable.
Assume.assumeTrue(!CdiContainerUnderTest.is(CONTAINER_OWB_1_1_x));
Assume.assumeTrue(!CdiContainerUnderTest.is(CONTAINER_TOMEE_1_5_x));
DependentProvider<DependentTestBean> dependentTestBeanProvider = BeanProvider.getDependent(DependentTestBean.class);
Serializer<DependentProvider<DependentTestBean>> serializer = new Serializer<DependentProvider<DependentTestBean>>();
DependentProvider<DependentTestBean> provider2 = serializer.roundTrip(dependentTestBeanProvider);
Assert.assertNotNull(provider2);
}
private void checkDependentProvider(DependentProvider<DependentTestBean> dependentTestBeanProvider)
{
Assert.assertNotNull(dependentTestBeanProvider);
DependentTestBean instance = dependentTestBeanProvider.get();
Assert.assertNotNull(instance);
Assert.assertEquals(42, instance.getI());
instance.setI(21);
Assert.assertEquals(21, instance.getI());
Assert.assertFalse(instance.isDestroyed());
dependentTestBeanProvider.destroy();
Assert.assertTrue(instance.isDestroyed());
}
}