001    /*****************************************************************************
002     * Copyright (C) PicoContainer Organization. All rights reserved.            *
003     * ------------------------------------------------------------------------- *
004     * The software in this package is published under the terms of the BSD      *
005     * style license a copy of which has been included with this distribution in *
006     * the LICENSE.txt file.                                                     *
007     *                                                                           *
008     * Original code by                                                          *
009     *****************************************************************************/
010    package org.picocontainer.behaviors;
011    
012    
013    import static org.junit.Assert.assertEquals;
014    import static org.junit.Assert.fail;
015    
016    import org.junit.Test;
017    import org.picocontainer.Characteristics;
018    import org.picocontainer.ComponentAdapter;
019    import org.picocontainer.ComponentFactory;
020    import org.picocontainer.DefaultPicoContainer;
021    import static org.picocontainer.Characteristics.GUARD;
022    import org.picocontainer.adapters.InstanceAdapter;
023    import org.picocontainer.containers.EmptyPicoContainer;
024    import org.picocontainer.injectors.ConstructorInjection;
025    import org.picocontainer.injectors.ConstructorInjector;
026    import org.picocontainer.lifecycle.NullLifecycleStrategy;
027    import org.picocontainer.monitors.NullComponentMonitor;
028    import org.picocontainer.tck.AbstractComponentFactoryTest;
029    
030    
031    /**
032     * @author Paul Hammant
033     */
034    public class GuardingTestCase extends AbstractComponentFactoryTest {
035    
036        protected ComponentFactory createComponentFactory() {
037            return new Guarding().wrap(new ConstructorInjection());
038        }
039    
040        @Test public void testAddComponentUsesGuardingBehavior() {
041            DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer());
042            pico.addComponent("guard", MyGuard.class);
043            pico.as(GUARD).addComponent("foo", String.class);
044            ComponentAdapter fooAdapter = pico.getComponentAdapter("foo");
045            assertEquals(Guarded.class, fooAdapter.getClass());
046            assertEquals(ConstructorInjector.class, ((AbstractBehavior) fooAdapter).getDelegate().getClass());
047            try {
048                String foo = (String) pico.getComponent("foo");
049                fail("should have barfed");
050            } catch (Exception e) {
051                assertEquals("not so fast", e.getMessage());
052            }
053        }
054    
055        public static class MyGuard {
056            public MyGuard() {
057                throw new RuntimeException("not so fast");
058            }
059        }
060    
061        @Test public void testAddComponentDoesNotUseGuardingBehaviorIfNoProperty() {
062            DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer());
063            pico.addComponent("guard", MyGuard.class);
064            pico.addComponent("foo", String.class);
065            ComponentAdapter fooAdapter = pico.getComponentAdapter("foo");
066            assertEquals(ConstructorInjector.class, fooAdapter.getClass());
067            String foo = (String) pico.getComponent("foo");
068        }
069    
070        @Test public void testAddComponentUsesGuardingBehaviorWithCustomGuardKey() {
071            DefaultPicoContainer pico = new DefaultPicoContainer(createComponentFactory(), new NullLifecycleStrategy(), new EmptyPicoContainer());
072            pico.addComponent("my_guard", MyGuard.class);
073            pico.as(GUARD("my_guard")).addComponent("foo", String.class);
074            ComponentAdapter fooAdapter = pico.getComponentAdapter("foo");
075            assertEquals(Guarded.class, fooAdapter.getClass());
076            assertEquals(ConstructorInjector.class, fooAdapter.getDelegate().getClass());
077            try {
078                String foo = (String) pico.getComponent("foo");
079                fail("should have barfed");
080            } catch (Exception e) {
081                assertEquals("not so fast", e.getMessage());
082            }
083        }
084    
085        @Test public void testAddComponentUsesGuardingBehaviorByAdapitveDefault() {
086            DefaultPicoContainer pico = new DefaultPicoContainer(new NullLifecycleStrategy(), new EmptyPicoContainer());
087            pico.addComponent("guard", MyGuard.class);
088            pico.as(GUARD).addComponent("foo", String.class);
089            ComponentAdapter fooAdapter = pico.getComponentAdapter("foo");
090            assertEquals(Guarded.class, fooAdapter.getClass());
091            assertEquals(ConstructorInjector.class, fooAdapter.getDelegate().getClass());
092            try {
093                String foo = (String) pico.getComponent("foo");
094                fail("should have barfed");
095            } catch (Exception e) {
096                assertEquals("not so fast", e.getMessage());
097            }
098        }
099    
100    }