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 *****************************************************************************/
010package org.picocontainer.injectors;
011
012import static org.junit.Assert.assertSame;
013
014import java.lang.reflect.Constructor;
015import java.lang.reflect.InvocationTargetException;
016import java.lang.reflect.Member;
017import java.lang.reflect.Type;
018import java.util.HashMap;
019import java.util.Map;
020
021import org.junit.Before;
022import org.junit.Test;
023import org.picocontainer.ComponentAdapter;
024import org.picocontainer.ComponentMonitor;
025import org.picocontainer.LifecycleStrategy;
026import org.picocontainer.Parameter;
027import org.picocontainer.PicoCompositionException;
028import org.picocontainer.PicoContainer;
029import org.picocontainer.containers.EmptyPicoContainer;
030import org.picocontainer.lifecycle.NullLifecycleStrategy;
031import org.picocontainer.monitors.NullComponentMonitor;
032
033@SuppressWarnings("serial")
034public class AbstractInjectorTestCase {
035
036    private AbstractInjector ai;
037    Constructor<HashMap> ctor;
038
039    @Before
040    public void setUp() throws NoSuchMethodException {
041        ai = new MyAbstractInjector(Map.class, HashMap.class, new Parameter[0], new NullComponentMonitor(), false);
042        ctor = HashMap.class.getConstructor();
043    }
044
045    @Test public void testCaughtIllegalAccessExceptionInvokesMonitorAndThrows() {
046        final EmptyPicoContainer epc = new EmptyPicoContainer();
047        final IllegalAccessException iae = new IllegalAccessException("foo");
048        NullComponentMonitor ncm = new NullComponentMonitor() {
049            public void instantiationFailed(PicoContainer container,
050                                            ComponentAdapter componentAdapter,
051                                            Constructor constructor,
052                                            Exception e) {
053                assertSame(epc, container);
054                assertSame(ai, componentAdapter);
055                assertSame(ctor, constructor);
056                assertSame(iae, e);
057            }
058        };
059        try {
060            ai.caughtIllegalAccessException(ncm, ctor, iae, epc);
061        } catch (PicoCompositionException e) {
062            assertSame(iae, e.getCause());
063        }
064    }
065
066    @Test public void testCaughtInstantiationExceptionInvokesMonitorAndThrows() {
067        final EmptyPicoContainer epc = new EmptyPicoContainer();
068        final InstantiationException ie = new InstantiationException("foo");
069        NullComponentMonitor ncm = new NullComponentMonitor() {
070            public void instantiationFailed(PicoContainer container,
071                                            ComponentAdapter componentAdapter,
072                                            Constructor constructor,
073                                            Exception e) {
074                assertSame(epc, container);
075                assertSame(ai, componentAdapter);
076                assertSame(ctor, constructor);
077                assertSame(ie, e);
078            }
079        };
080        try {
081            ai.caughtInstantiationException(ncm, ctor, ie, epc);
082        } catch (PicoCompositionException e) {
083            assertSame("Should never get here", e.getMessage());
084        }
085    }
086
087    @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsRuntimeIfRuntimeInTheFirstPlace() {
088        final InvocationTargetException ite = new InvocationTargetException(new RuntimeException("foo"));
089        NullComponentMonitor ncm = new NullComponentMonitor() {
090            public void invocationFailed(Member member, Object instance, Exception e) {
091                assertSame(ctor, member);
092                assertSame("bar", instance);
093                assertSame(ite, e);
094            }
095        };
096        try {
097            ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
098        } catch (RuntimeException e) {
099            assertSame("foo", e.getMessage());
100        }
101    }
102
103    @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsErrorIfErrorInTheFirstPlace() {
104        final InvocationTargetException ite = new InvocationTargetException(new Error("foo"));
105        NullComponentMonitor ncm = new NullComponentMonitor() {
106            public void invocationFailed(Member member, Object instance, Exception e) {
107                assertSame(ctor, member);
108                assertSame("bar", instance);
109                assertSame(ite, e);
110            }
111        };
112        try {
113            ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
114        } catch (Error e) {
115            assertSame("foo", e.getMessage());
116        }
117    }
118
119    @Test public void testCaughtInvocationTargetExceptionInvokesMonitorAndReThrowsAsCompositionIfNotRuntimeOrError() {
120        final InvocationTargetException ite = new InvocationTargetException(new Exception("foo"));
121        NullComponentMonitor ncm = new NullComponentMonitor() {
122            public void invocationFailed(Member member, Object instance, Exception e) {
123                assertSame(ctor, member);
124                assertSame("bar", instance);
125                assertSame(ite, e);
126            }
127        };
128        try {
129            ai.caughtInvocationTargetException(ncm, ctor, "bar", ite);
130        } catch (PicoCompositionException e) {
131            assertSame("foo", e.getCause().getMessage());
132        }
133    }
134
135
136
137    private static class MyAbstractInjector extends AbstractInjector {
138
139        public MyAbstractInjector(Object componentKey,
140                                  Class componentImplementation,
141                                  Parameter[] parameters,
142                                  ComponentMonitor monitor,
143                                  boolean useNames) {
144            super(componentKey, componentImplementation, parameters, monitor, useNames);
145        }
146
147        @Override
148        public void verify(PicoContainer container) throws PicoCompositionException {
149                }
150
151        public Object getComponentInstance(PicoContainer container, Type into) throws PicoCompositionException {
152            return null;
153        }
154
155        public String getDescriptor() {
156            return null;
157        }
158    }
159}