/*
* JBoss, Home of Professional Open Source
* Copyright 2010, Red Hat, Inc., and individual contributors
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* 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.jboss.cdi.tck.tests.implementation.enterprise.newBean;
import static org.jboss.cdi.tck.TestGroups.INTEGRATION;
import static org.jboss.cdi.tck.cdi.Sections.NEW_EE;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import java.lang.reflect.Type;
import java.util.Set;
import javax.enterprise.context.Dependent;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.Default;
import javax.enterprise.inject.New;
import javax.enterprise.inject.spi.Bean;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.cdi.tck.AbstractTest;
import org.jboss.cdi.tck.shrinkwrap.WebArchiveBuilder;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jboss.shrinkwrap.descriptor.api.Descriptors;
import org.jboss.shrinkwrap.descriptor.api.beans11.BeansDescriptor;
import org.jboss.test.audit.annotations.SpecAssertion;
import org.jboss.test.audit.annotations.SpecAssertions;
import org.jboss.test.audit.annotations.SpecVersion;
import org.testng.annotations.Test;
@Test(groups = INTEGRATION)
@SpecVersion(spec = "cdi", version = "2.0-PFD")
public class NewEnterpriseBeanTest extends AbstractTest {
@Deployment
public static WebArchive createTestArchive() {
return new WebArchiveBuilder()
.withTestClassPackage(NewEnterpriseBeanTest.class)
.withExcludedClasses(Tiger.class.getName(), Spell.class.getName(), Staff.class.getName(),
Dragon.class.getName(), NewEnterpriseBeanICTest.class.getName(), Hat.class.getName(),
Fireball.class.getName())
.withLibrary(Tiger.class, Spell.class, Staff.class, Dragon.class, Hat.class, Fireball.class)
.withBeansXml(
Descriptors.create(BeansDescriptor.class).getOrCreateInterceptors().clazz(OrderInterceptor.class.getName())
.up()).build();
}
@Test
@SpecAssertion(section = NEW_EE, id = "p")
public void testNewBeanIsDependentScoped() {
Set<Bean<WrappedEnterpriseBeanLocal>> beans = getBeans(WrappedEnterpriseBeanLocal.class, New.Literal.of(
WrappedEnterpriseBean.class));
assert beans.size() == 1;
Bean<WrappedEnterpriseBeanLocal> newEnterpriseBean = beans.iterator().next();
assert Dependent.class.equals(newEnterpriseBean.getScope());
}
@Test
@SpecAssertion(section = NEW_EE, id = "r")
public void testNewBeanHasOnlyOneQualifier() {
Set<Bean<WrappedEnterpriseBeanLocal>> beans = getBeans(WrappedEnterpriseBeanLocal.class, New.Literal.of(
WrappedEnterpriseBean.class));
assert beans.size() == 1;
Bean<WrappedEnterpriseBeanLocal> newEnterpriseBean = beans.iterator().next();
assert newEnterpriseBean.getQualifiers().size() == 1;
assert newEnterpriseBean.getQualifiers().iterator().next().annotationType().equals(New.class);
}
@Test
@SpecAssertion(section = NEW_EE, id = "s")
public void testNewBeanHasNoBeanELName() {
Set<Bean<WrappedEnterpriseBeanLocal>> beans = getBeans(WrappedEnterpriseBeanLocal.class, New.Literal.of(
WrappedEnterpriseBean.class));
assert beans.size() == 1;
Bean<WrappedEnterpriseBeanLocal> newEnterpriseBean = beans.iterator().next();
assert newEnterpriseBean.getName() == null;
}
@Test
@SpecAssertion(section = NEW_EE, id = "t")
public void testNewBeanHasNoStereotypes() {
Bean<MonkeyLocal> monkeyBean = getBeans(MonkeyLocal.class).iterator().next();
Bean<MonkeyLocal> newMonkeyBean = getBeans(MonkeyLocal.class, New.Literal.of(Monkey.class)).iterator().next();
assert monkeyBean.getScope().equals(RequestScoped.class);
assert newMonkeyBean.getScope().equals(Dependent.class);
assert monkeyBean.getName().equals("monkey");
assert newMonkeyBean.getName() == null;
}
@Test
@SpecAssertion(section = NEW_EE, id = "u")
public void testNewBeanHasNoObservers() {
// Should just be 1 observer from bean, not new bean
assert getCurrentManager().resolveObserverMethods("event").size() == 1;
}
@Test
@SpecAssertions({ @SpecAssertion(section = NEW_EE, id = "j"), @SpecAssertion(section = NEW_EE, id = "k") })
public void testForEachEnterpriseBeanANewBeanExists() {
Bean<OrderLocal> orderBean = getBeans(OrderLocal.class).iterator().next();
Set<Bean<OrderLocal>> newOrderBeans = getBeans(OrderLocal.class, New.Literal.of(Order.class));
assert newOrderBeans.size() == 1;
Bean<OrderLocal> newOrderBean = newOrderBeans.iterator().next();
assert orderBean.getQualifiers().size() == 2;
assert orderBean.getQualifiers().contains(Default.Literal.INSTANCE);
assert orderBean.getQualifiers().contains(Any.Literal.INSTANCE);
assert orderBean.getTypes().equals(newOrderBean.getTypes());
assert orderBean.getBeanClass().equals(newOrderBean.getBeanClass());
assert newOrderBean.getQualifiers().size() == 1;
assert newOrderBean.getQualifiers().iterator().next().annotationType().equals(New.class);
Set<Bean<LionLocal>> lionBeans = getBeans(LionLocal.class, TameLiteral.INSTANCE);
Set<Bean<LionLocal>> newLionBeans = getBeans(LionLocal.class, New.Literal.of(Lion.class));
assert lionBeans.size() == 1;
assert newLionBeans.size() == 1;
Bean<LionLocal> lionBean = lionBeans.iterator().next();
Bean<LionLocal> newLionBean = newLionBeans.iterator().next();
assert lionBean.getQualifiers().size() == 2;
assert lionBean.getQualifiers().contains(TameLiteral.INSTANCE);
assert lionBean.getQualifiers().contains(Any.Literal.INSTANCE);
assert newLionBean.getQualifiers().size() == 1;
assert newLionBean.getQualifiers().iterator().next().annotationType().equals(New.class);
assert lionBean.getTypes().equals(newLionBean.getTypes());
assert lionBean.getBeanClass().equals(newLionBean.getBeanClass());
}
@Test
@SpecAssertion(section = NEW_EE, id = "n")
public void testNewBeanHasSameInjectedFields() {
Bean<InitializerSimpleBeanLocal> simpleBean = getBeans(InitializerSimpleBeanLocal.class).iterator().next();
Bean<InitializerSimpleBeanLocal> newSimpleBean = getBeans(InitializerSimpleBeanLocal.class,
New.Literal.of(InitializerSimpleBean.class)).iterator().next();
assert !newSimpleBean.getInjectionPoints().isEmpty();
assert simpleBean.getInjectionPoints().equals(newSimpleBean.getInjectionPoints());
}
@Test
@SpecAssertion(section = NEW_EE, id = "o")
public void testNewBeanHasTheSameInterceptorBindings() {
// Method foo() is intercepted
assertTrue(getContextualReference(NewSessionBeanConsumer.class).getOrder().ping());
}
@Test(dataProvider = ARQUILLIAN_DATA_PROVIDER)
@SpecAssertions({ @SpecAssertion(section = NEW_EE, id = "yb") })
public void testNewBeanCreatedForFieldInjectionPoint(Wizard wizard) {
Bean<Tiger> bean = getUniqueBean(Tiger.class, New.Literal.INSTANCE);
checkNewQualifiedBean(bean, Object.class, Tiger.class);
assertTrue(wizard.getTiger().ping());
}
@Test(dataProvider = ARQUILLIAN_DATA_PROVIDER)
@SpecAssertions({ @SpecAssertion(section = NEW_EE, id = "yd") })
public void testNewBeanCreatedForInitializerInjectionPoint(Wizard wizard) {
Bean<Staff> bean = getUniqueBean(Staff.class, New.Literal.INSTANCE);
checkNewQualifiedBean(bean, Object.class, Staff.class);
assertTrue(wizard.getStaff().ping());
}
@Test(dataProvider = ARQUILLIAN_DATA_PROVIDER)
@SpecAssertions({ @SpecAssertion(section = NEW_EE, id = "yf") })
public void testNewBeanCreatedForConstructorInjectionPoint(Wizard wizard) {
Bean<Spell> bean = getUniqueBean(Spell.class, New.Literal.INSTANCE);
checkNewQualifiedBean(bean, Object.class, Spell.class);
assertTrue(wizard.getSpell().ping());
}
@Test(dataProvider = ARQUILLIAN_DATA_PROVIDER)
@SpecAssertions({ @SpecAssertion(section = NEW_EE, id = "yh") })
public void testNewBeanCreatedForProducerMethod(Wizard wizard) {
Bean<Dragon> bean = getUniqueBean(Dragon.class, New.Literal.INSTANCE);
checkNewQualifiedBean(bean, Object.class, Dragon.class);
assertTrue(wizard.getDragon().ping());
}
@Test(dataProvider = ARQUILLIAN_DATA_PROVIDER)
@SpecAssertions({ @SpecAssertion(section = NEW_EE, id = "yj") })
public void testNewBeanCreatedForObserverMethod(Wizard wizard) {
Bean<Hat> bean = getUniqueBean(Hat.class, New.Literal.INSTANCE);
checkNewQualifiedBean(bean, Object.class, Hat.class);
getCurrentManager().fireEvent(new Wizard());
assertTrue(wizard.getHat().ping());
}
@Test(dataProvider = ARQUILLIAN_DATA_PROVIDER)
@SpecAssertions({ @SpecAssertion(section = NEW_EE, id = "yl") })
public void testNewBeanCreatedForDisposerMethod(DragonProducer producer) {
Bean<Fireball> bean = getUniqueBean(Fireball.class, New.Literal.INSTANCE);
checkNewQualifiedBean(bean, Object.class, Fireball.class);
Bean<Dragon> dragonBean = getUniqueBean(Dragon.class, TameLiteral.INSTANCE);
CreationalContext<Dragon> ctx = getCurrentManager().createCreationalContext(dragonBean);
Dragon dragon = dragonBean.create(ctx);
dragonBean.destroy(dragon, ctx);
assertTrue(producer.isDragonDestroyed());
}
private <T> void checkNewQualifiedBean(Bean<T> bean, Type... requiredTypes) {
assertTrue(typeSetMatches(bean.getTypes(), requiredTypes));
// Has scope @Dependent,
assertEquals(bean.getScope(), Dependent.class);
// Has exactly one qualifier...
assertTrue(annotationSetMatches(bean.getQualifiers(), New.Literal.of(bean.getBeanClass())));
// Has no bean EL name
assertNull(bean.getName());
// Has no stereotypes
assertTrue(bean.getStereotypes() == null || bean.getStereotypes().isEmpty());
// Is not an alternative
assertFalse(bean.isAlternative());
}
}