/* * 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.producer.method.lifecycle; import static org.jboss.cdi.tck.cdi.Sections.CONTEXTUAL; import static org.jboss.cdi.tck.cdi.Sections.PRODUCER_METHOD; import static org.jboss.cdi.tck.cdi.Sections.PRODUCER_METHOD_LIFECYCLE; import static org.jboss.cdi.tck.cdi.Sections.PRODUCER_OR_DISPOSER_METHODS_INVOCATION; import static org.jboss.cdi.tck.cdi.Sections.SPECIALIZATION; import java.util.Set; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.CreationException; import javax.enterprise.inject.IllegalProductException; import javax.enterprise.inject.spi.Bean; import javax.enterprise.util.AnnotationLiteral; 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.test.audit.annotations.SpecAssertion; import org.jboss.test.audit.annotations.SpecAssertions; import org.jboss.test.audit.annotations.SpecVersion; import org.testng.annotations.Test; /** * NOTE May be able to get rid of some of the binding types if the producer method precedence question is resolved */ @SpecVersion(spec = "cdi", version = "2.0-PFD") public class ProducerMethodLifecycleTest extends AbstractTest { private AnnotationLiteral<Pet> PET_LITERAL = new AnnotationLiteral<Pet>() { }; private AnnotationLiteral<FirstBorn> FIRST_BORN_LITERAL = new AnnotationLiteral<FirstBorn>() { }; private AnnotationLiteral<Fail> FAIL_LITERAL = new AnnotationLiteral<Fail>() { }; private AnnotationLiteral<Null> NULL_LITERAL = new AnnotationLiteral<Null>() { }; @Deployment public static WebArchive createTestArchive() { return new WebArchiveBuilder().withTestClassPackage(ProducerMethodLifecycleTest.class).withBeansXml("beans.xml") .build(); } @Test @SpecAssertion(section = PRODUCER_METHOD_LIFECYCLE, id = "ea") public void testProducerMethodBeanCreate() { PreferredSpiderProducer.reset(); Bean<Tarantula> tarantulaBean = getBeans(Tarantula.class, PET_LITERAL).iterator().next(); CreationalContext<Tarantula> tarantulaCc = getCurrentManager().createCreationalContext(tarantulaBean); Tarantula tarantula = tarantulaBean.create(tarantulaCc); assert PreferredSpiderProducer.getTarantulaCreated() == tarantula; assert PreferredSpiderProducer.getInjectedWeb() != null; assert PreferredSpiderProducer.getInjectedWeb().isDestroyed(); } @Test @SpecAssertions({ @SpecAssertion(section = PRODUCER_METHOD_LIFECYCLE, id = "ea") }) public void testProducerMethodInvokedOnCreate() { Bean<SpiderEgg> eggBean = getBeans(SpiderEgg.class, FIRST_BORN_LITERAL).iterator().next(); CreationalContext<SpiderEgg> eggCc = getCurrentManager().createCreationalContext(eggBean); assert eggBean.create(eggCc) != null; } @Test @SpecAssertion(section = PRODUCER_METHOD, id = "j") public void testWhenApplicationInvokesProducerMethodParametersAreNotInjected() { try { getContextualReference(BrownRecluse.class).layAnEgg(null); } catch (AssertionError e) { return; } assert false : "The BeanManager should not have been injected into the producer method"; } @Test @SpecAssertions({ @SpecAssertion(section = PRODUCER_OR_DISPOSER_METHODS_INVOCATION, id = "c"), @SpecAssertion(section = SPECIALIZATION, id = "cb") }) public void testProducerMethodFromSpecializedBeanUsed() { SpiderProducer.reset(); PreferredSpiderProducer.reset(); Bean<Tarantula> spiderBean = getBeans(Tarantula.class, PET_LITERAL).iterator().next(); CreationalContext<Tarantula> spiderBeanCc = getCurrentManager().createCreationalContext(spiderBean); Tarantula tarantula = spiderBean.create(spiderBeanCc); assert PreferredSpiderProducer.getTarantulaCreated() == tarantula; assert !SpiderProducer.isTarantulaCreated(); } @Test @SpecAssertions({ @SpecAssertion(section = PRODUCER_METHOD_LIFECYCLE, id = "k") }) public void testCreateReturnsNullIfProducerDoesAndDependent() { Bean<Spider> nullSpiderBean = getBeans(Spider.class, NULL_LITERAL).iterator().next(); CreationalContext<Spider> nullSpiderBeanCc = getCurrentManager().createCreationalContext(nullSpiderBean); assert nullSpiderBean.create(nullSpiderBeanCc) == null; } @Test(expectedExceptions = IllegalProductException.class) @SpecAssertions({ @SpecAssertion(section = PRODUCER_METHOD_LIFECYCLE, id = "l") }) public void testCreateFailsIfProducerReturnsNullAndNotDependent() { Bean<PotatoChip> potatoChipBean = getBeans(PotatoChip.class, NULL_LITERAL).iterator().next(); assert potatoChipBean != null; CreationalContext<PotatoChip> chipCc = getCurrentManager().createCreationalContext(potatoChipBean); potatoChipBean.create(chipCc); assert false; } @Test @SpecAssertions({ @SpecAssertion(section = PRODUCER_METHOD_LIFECYCLE, id = "ma"), @SpecAssertion(section = PRODUCER_METHOD_LIFECYCLE, id = "r") }) public void testProducerMethodBeanDestroy() { PreferredSpiderProducer.reset(); Set<Bean<?>> beans = getCurrentManager().getBeans(Tarantula.class, PET_LITERAL); Bean<?> bean = getCurrentManager().resolve(beans); assert bean.getBeanClass().equals(PreferredSpiderProducer.class); assert bean.getTypes().contains(Tarantula.class); Bean<Tarantula> tarantulaBean = (Bean<Tarantula>) bean; CreationalContext<Tarantula> tarantulaCc = getCurrentManager().createCreationalContext(tarantulaBean); Tarantula tarantula = tarantulaBean.create(tarantulaCc); PreferredSpiderProducer.resetInjections(); tarantulaBean.destroy(tarantula, tarantulaCc); assert PreferredSpiderProducer.getTarantulaDestroyed() == tarantula; assert PreferredSpiderProducer.isDestroyArgumentsSet(); assert PreferredSpiderProducer.getInjectedWeb() != null; assert PreferredSpiderProducer.getInjectedWeb().isDestroyed(); } @Test(expectedExceptions = FooException.class) @SpecAssertions({ @SpecAssertion(section = CONTEXTUAL, id = "aa") }) public void testCreateRethrowsUncheckedException() { Bean<Ship> shipBean = getBeans(Ship.class, FAIL_LITERAL).iterator().next(); CreationalContext<Ship> shipCc = getCurrentManager().createCreationalContext(shipBean); shipBean.create(shipCc); assert false; } @Test(expectedExceptions = CreationException.class) @SpecAssertions({ @SpecAssertion(section = CONTEXTUAL, id = "aa") }) public void testCreateWrapsCheckedExceptionAndRethrows() { Bean<Lorry> lorryBean = getBeans(Lorry.class, FAIL_LITERAL).iterator().next(); CreationalContext<Lorry> lorryCc = getCurrentManager().createCreationalContext(lorryBean); lorryBean.create(lorryCc); assert false; } }