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 }