/*
* JBoss, Home of Professional Open Source
* Copyright 2015, 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.weld.environment.se.test.builder;
import static org.jboss.weld.environment.se.ContainerLifecycleObserver.afterBeanDiscovery;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.event.ObserverException;
import javax.enterprise.inject.Any;
import javax.enterprise.inject.spi.DefinitionException;
import javax.enterprise.inject.spi.InterceptionType;
import org.jboss.weld.Container;
import org.jboss.weld.bootstrap.spi.BeanDeploymentArchive;
import org.jboss.weld.config.ConfigurationKey;
import org.jboss.weld.config.WeldConfiguration;
import org.jboss.weld.environment.se.ContainerLifecycleObserver;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import org.jboss.weld.environment.se.test.builder.alphas.Alpha1;
import org.jboss.weld.environment.se.test.builder.alphas.Alpha2;
import org.jboss.weld.environment.se.test.builder.alphas.betas.Beta1;
import org.jboss.weld.environment.se.test.builder.alphas.betas.Beta2;
import org.jboss.weld.manager.BeanManagerImpl;
import org.junit.Test;
/**
*
* @author Martin Kouba
*/
public class WeldBuilderTest {
@Test
public void testSyntheticBeanArchive() throws Exception {
Weld weld = new Weld().disableDiscovery();
try (WeldContainer container = weld.containerId("FOO").beanClasses(Foo.class, Bar.class, Cat.class).initialize()) {
assertEquals(10, container.select(Foo.class).get().getVal());
assertTrue(container.select(Bar.class).isUnsatisfied());
assertTrue(container.select(Cat.class).isUnsatisfied());
assertTrue(container.select(Qux.class).isUnsatisfied());
}
// Test AutoCloseable
assertNull(WeldContainer.instance("FOO"));
// Test alternatives selected for the synthetic BDA
try (WeldContainer container = weld.beanClasses(Foo.class, Bar.class, Cat.class).alternatives(Bar.class)
.alternativeStereotypes(AlternativeStereotype.class).initialize()) {
assertEquals(10, container.select(Foo.class).get().getVal());
assertEquals(1, container.select(Bar.class).get().getVal());
assertEquals(5, container.select(Cat.class).get().getVal());
}
// Test interceptor enabled for the synthetic BDA
try (WeldContainer container = weld.reset().beanClasses(Qux.class, MonitoringInterceptor.class).interceptors(MonitoringInterceptor.class)
.initialize()) {
assertEquals(Integer.valueOf(11), container.select(Qux.class).get().ping());
}
// Test decorator enabled for the synthetic BDA
try (WeldContainer container = weld.reset().beanClasses(Foo.class, CoolDecorator.class).decorators(CoolDecorator.class).initialize()) {
assertEquals("NOK", container.select(Foo.class).get().methodToBeDecorated());
}
// Test addBeanClass()
try (WeldContainer container = weld.reset().beanClasses(Bar.class).addBeanClass(Foo.class).alternatives(Bar.class).initialize()) {
assertEquals(10, container.select(Foo.class).get().getVal());
assertEquals(1, container.select(Bar.class).get().getVal());
assertTrue(container.select(Baz.class).isUnsatisfied());
}
}
@Test
public void testMultipleWeldInstancesCreated() {
Baz.DESTROYED.clear();
Weld weld = new Weld().disableDiscovery();
int loop = 5;
List<WeldContainer> containers = new ArrayList<WeldContainer>();
for (int i = 0; i < loop; i++) {
containers.add(weld.containerId("" + i).beanClasses(Baz.class).initialize());
WeldContainer.getRunningContainerIds().contains(String.valueOf(i));
assertTrue(WeldContainer.getRunningContainerIds().size() == i + 1);
}
for (WeldContainer container : containers) {
assertTrue(container.isRunning());
assertEquals(container.getId(), container.select(Baz.class).get().getVal());
}
weld.shutdown();
assertEquals(loop, Baz.DESTROYED.size());
for (int i = 0; i < loop; i++) {
assertTrue(Baz.DESTROYED.contains("" + i));
}
for (WeldContainer container : containers) {
assertFalse(container.isRunning());
}
}
@Test
public void testConfigurationProperties() {
try (WeldContainer container = new Weld().disableDiscovery().beanClasses(Foo.class).property(ConfigurationKey.CONCURRENT_DEPLOYMENT.get(), false)
.initialize()) {
assertFalse(container.select(BeanManagerImpl.class).get().getServices().get(WeldConfiguration.class)
.getBooleanProperty(ConfigurationKey.CONCURRENT_DEPLOYMENT));
}
}
@Test
public void testReset() {
Weld weld = new Weld().containerId("FOO").disableDiscovery().property(ConfigurationKey.BEAN_IDENTIFIER_INDEX_OPTIMIZATION.get(), true)
.beanClasses(Foo.class);
weld.reset();
assertFalse(weld.isDiscoveryEnabled());
assertEquals("FOO", weld.getContainerId());
try (WeldContainer container = weld.beanClasses(Bar.class).initialize()) {
assertTrue(container.select(Foo.class).isUnsatisfied());
assertTrue(container.select(BeanManagerImpl.class).get().getServices().get(WeldConfiguration.class)
.getBooleanProperty(ConfigurationKey.BEAN_IDENTIFIER_INDEX_OPTIMIZATION));
}
}
@Test
public void testResetAll() {
Weld weld = new Weld().containerId("FOO").disableDiscovery().property(ConfigurationKey.RELAXED_CONSTRUCTION.get(), false).beanClasses(Foo.class);
weld.resetAll();
assertTrue(weld.isDiscoveryEnabled());
assertNull(weld.getContainerId());
weld.disableDiscovery();
try (WeldContainer container = weld.beanClasses(Bar.class).initialize()) {
assertTrue(container.select(Foo.class).isUnsatisfied());
assertTrue(container.select(BeanManagerImpl.class).get().getServices().get(WeldConfiguration.class)
.getBooleanProperty(ConfigurationKey.BEAN_IDENTIFIER_INDEX_OPTIMIZATION));
}
}
@Test
public void testLifecycle() {
Weld weld = new Weld().disableDiscovery().beanClasses(Foo.class, DependentFoo.class);
try (WeldContainer container = weld.initialize()) {
container.select(DependentFoo.class).get().getVal();
}
assertTrue(DependentFoo.destroyCallbackCalled.get());
DependentFoo.reset();
try (WeldContainer container = weld.initialize()) {
DependentFoo dependentFoo = container.select(DependentFoo.class).get();
dependentFoo.getVal();
container.destroy(dependentFoo);
assertTrue(DependentFoo.destroyCallbackCalled.get());
}
}
@Test
public void testSyntheticBeanArchivePackages() throws Exception {
Weld weld = new Weld().disableDiscovery();
try (WeldContainer container = weld.packages(Alpha1.class).initialize()) {
assertEquals(1, container.select(Alpha1.class).get().getVal());
assertEquals(2, container.select(Alpha2.class).get().getVal());
assertTrue(container.select(Beta1.class).isUnsatisfied());
assertTrue(container.select(Beta2.class).isUnsatisfied());
}
try (WeldContainer container = weld.reset().addPackage(true, Alpha2.class).initialize()) {
assertEquals(1, container.select(Alpha1.class).get().getVal());
assertEquals(2, container.select(Alpha2.class).get().getVal());
assertEquals(11, container.select(Beta1.class).get().getVal());
assertEquals(22, container.select(Beta2.class).get().getVal());
}
try (WeldContainer container = weld.reset().addPackages(true, Beta1.class).initialize()) {
assertTrue(container.select(Alpha1.class).isUnsatisfied());
assertTrue(container.select(Alpha2.class).isUnsatisfied());
assertEquals(11, container.select(Beta1.class).get().getVal());
assertEquals(22, container.select(Beta2.class).get().getVal());
}
// Scan the package from cdi-api.jar
try (WeldContainer container = weld.reset().packages(ObserverException.class).initialize()) {
assertFalse(container.select(ObserverException.class).isUnsatisfied());
}
// Scan the package recursively from cdi-api.jar
try (WeldContainer container = weld.reset().addPackage(true, Any.class).initialize()) {
// There is no managed bean discovered, therefore we only check the the bean class was found
boolean found = false;
for (BeanDeploymentArchive beanDeploymentArchive : Container.instance(container.getId()).beanDeploymentArchives().keySet()) {
if (beanDeploymentArchive.getBeanClasses().contains(DefinitionException.class.getName())) {
found = true;
break;
}
}
assertTrue(found);
}
}
@Test
public void testExtensions() {
try (WeldContainer container = new Weld().disableDiscovery().beanClasses(Bar.class).extensions(new TestExtension()).initialize()) {
assertEquals(10, container.select(Foo.class).get().getVal());
assertFalse(container.select(TestExtension.class).isUnsatisfied());
}
}
@Test(expected = IllegalStateException.class)
public void testNoBeanArchivesFound() {
new Weld().disableDiscovery().initialize();
}
@Test
public void testAccessibility() {
try (WeldContainer container = new Weld().beanClasses(Oof.class).extensions(new OofExtension()).initialize()) {
assertEquals(10, container.select(Oof.class).get().getVal());
}
}
@Test
public void testBeanBuilder() {
try (WeldContainer container = new Weld().disableDiscovery()
.addContainerLifecycleObserver(
afterBeanDiscovery((e) -> e.addBean().addType(Integer.class).produceWith((i) -> 42).addQualifier(Juicy.Literal.INSTANCE)))
.initialize()) {
assertEquals(Integer.valueOf(42), container.select(Integer.class, Juicy.Literal.INSTANCE).get());
}
}
@Test
public void testInterceptorBuilder() {
try (WeldContainer container = new Weld().disableDiscovery().beanClasses(Coorge.class, BuilderInterceptorBinding.class)
.addContainerLifecycleObserver(ContainerLifecycleObserver
.afterBeanDiscovery((e) -> e.addInterceptor().addBinding(new BuilderInterceptorBinding.BuilderInterceptorBindingLiteral())
.priority(2500).intercept(InterceptionType.AROUND_INVOKE, invocationContext -> {
try {
Integer result = ((Integer) invocationContext.proceed());
return result + 10;
} catch (Exception exception) {
exception.printStackTrace();
}
return null;
})))
.initialize()) {
Coorge coorge = container.select(Coorge.class).get();
assertEquals(coorge.ping(), 11);
}
}
}