/*
* Copyright (C) 2015 Red Hat, Inc. and/or its affiliates.
*
* 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.errai.ioc.tests.wiring.client;
import org.jboss.errai.ioc.client.container.IOC;
import org.jboss.errai.ioc.client.test.AbstractErraiIOCTest;
import org.jboss.errai.ioc.tests.wiring.client.res.BeanWithProvidedBeansInjected;
import org.jboss.errai.ioc.tests.wiring.client.res.DependentBean;
import org.jboss.errai.ioc.tests.wiring.client.res.DependentBeanWithDisposer;
import org.jboss.errai.ioc.tests.wiring.client.res.NestedDependentBean;
import org.jboss.errai.ioc.tests.wiring.client.res.NestedDependentBeanWIthDisposer;
import org.jboss.errai.ioc.tests.wiring.client.res.SingletonBeanWithDisposer;
/**
* @author Mike Brock
*/
public class DisposerTest extends AbstractErraiIOCTest {
@Override
public String getModuleName() {
return "org.jboss.errai.ioc.tests.wiring.IOCWiringTests";
}
public void testDisposerFailsToDestroyAppScope() {
final SingletonBeanWithDisposer outerBean = IOC.getBeanManager().lookupBean(SingletonBeanWithDisposer.class).getInstance();
assertNotNull(outerBean);
assertNotNull(outerBean.getDependentBeanDisposer());
final DependentBean innerBean = outerBean.getBean();
assertNotNull(innerBean);
outerBean.dispose();
assertFalse("inner bean should have been disposed", IOC.getBeanManager().isManaged(innerBean));
assertTrue("outer bean should not have been disposed", IOC.getBeanManager().isManaged(outerBean));
assertTrue("bean's destructor should have been called", innerBean.isPreDestroyCalled());
}
public void testDisposerWorksWithDependentScope() {
final DependentBeanWithDisposer outerBean = IOC.getBeanManager().lookupBean(DependentBeanWithDisposer.class).getInstance();
assertNotNull(outerBean);
assertNotNull(outerBean.getDependentBeanDisposer());
final DependentBean innerBean = outerBean.getBean();
assertNotNull(innerBean);
outerBean.dispose();
assertFalse("inner bean should have been disposed", IOC.getBeanManager().isManaged(innerBean));
assertTrue("outer bean should not have been disposed", IOC.getBeanManager().isManaged(outerBean));
assertTrue("inner bean's destructor should have been called", innerBean.isPreDestroyCalled());
}
public void testDisposerWorksWithNestedDependentScopedBeans() throws Exception {
final NestedDependentBeanWIthDisposer outerBean = IOC.getBeanManager().lookupBean(NestedDependentBeanWIthDisposer.class).getInstance();
assertNotNull(outerBean);
final NestedDependentBean middleBean = outerBean.getNestedBean();
assertNotNull(middleBean);
final DependentBean innerBean = middleBean.getBean();
assertNotNull(innerBean);
outerBean.dispose();
assertTrue("outer bean should not have been disposed", IOC.getBeanManager().isManaged(outerBean));
assertFalse("middle bean should have been disposed", IOC.getBeanManager().isManaged(middleBean));
assertTrue("middle bean's destructor should have been called", middleBean.isPreDestroyCalled());
assertFalse("inner bean should have been disposed", IOC.getBeanManager().isManaged(innerBean));
assertTrue("inner bean's destructor should have been called", innerBean.isPreDestroyCalled());
}
public void testDisposerMethodCalledOnProviderWhenProvidedBeanIsDestroyed() throws Exception {
final BeanWithProvidedBeansInjected module = IOC.getBeanManager().lookupBean(BeanWithProvidedBeansInjected.class).getInstance();
assertFalse("Bean was prematurely destroyed.", module.providedBean.isDestroyed());
IOC.getBeanManager().destroyBean(module.providedBean);
assertTrue("Disposer method not called after bean was destroyed.", module.providedBean.isDestroyed());
}
public void testDisposerMethodCalledOnContextualProviderWhenProvidedBeanIsDestroyed() throws Exception {
final BeanWithProvidedBeansInjected module = IOC.getBeanManager().lookupBean(BeanWithProvidedBeansInjected.class).getInstance();
assertFalse("Bean was prematurely destroyed.", module.contextuallyProvidedBean.isDestroyed());
IOC.getBeanManager().destroyBean(module.contextuallyProvidedBean);
assertTrue("Disposer method not called after bean was destroyed.", module.contextuallyProvidedBean.isDestroyed());
}
}