    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 Joerg Schaible                                           *
    009     *****************************************************************************/
    010    package org.picocontainer.defaults;
    011
    012    import static org.junit.Assert.assertEquals;
    013    import static org.junit.Assert.assertNull;
    014    import static org.junit.Assert.assertSame;
    015    import static org.junit.Assert.assertTrue;
    016
    017    import java.io.ByteArrayOutputStream;
    018    import java.io.IOException;
    019    import java.io.PrintStream;
    020    import java.io.PrintWriter;
    021    import java.util.HashSet;
    022    import java.util.List;
    023    import java.util.Set;
    024
    025    import org.junit.Test;
    026    import org.picocontainer.ComponentAdapter;
    027    import org.picocontainer.DefaultPicoContainer;
    028    import org.picocontainer.PicoCompositionException;
    029    import org.picocontainer.PicoException;
    030    import org.picocontainer.injectors.AbstractInjector;
    031    import org.picocontainer.injectors.ConstructorInjector;
    032    import org.picocontainer.lifecycle.NullLifecycleStrategy;
    033    import org.picocontainer.monitors.AbstractComponentMonitor;
    034
    035    /**
    036     * Unit tests for the several PicoException classes.
    037     */
    038    @SuppressWarnings("serial")
    039    public class PicoExceptionsTestCase {
    040
    041        final static public String MESSAGE = "Message of the exception";
    042        final static public Throwable THROWABLE = new Throwable();
    043
    044        @SuppressWarnings({ "unchecked" })
    045        final void executeTestOfStandardException(final Class clazz) {
    046            final ComponentAdapter componentAdapter = new ConstructorInjector(clazz, clazz, null, new AbstractComponentMonitor(),
    047                                                                              new NullLifecycleStrategy(), false, false);
    048            DefaultPicoContainer pico = new DefaultPicoContainer();
    049            pico.addComponent(MESSAGE);
    050            try {
    051                final Exception exception = (Exception) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
    052                assertEquals(MESSAGE, exception.getMessage());
    053            } catch (final AbstractInjector.UnsatisfiableDependenciesException ex) {
    054                final Set<Object> set = new HashSet<Object>();
    055                for (Object o : ex.getUnsatisfiableDependencies()) {
    056                    final List<Object> list = (List<Object>)o;
    057                    set.addAll(list);
    058                }
    059                assertTrue(set.contains(Throwable.class));
    060            }
    061            pico = new DefaultPicoContainer();
    062            pico.addComponent(THROWABLE);
    063            try {
    064                final PicoException exception = (PicoException) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
    065                assertSame(THROWABLE, exception.getCause());
    066            } catch (final AbstractInjector.UnsatisfiableDependenciesException ex) {
    067                final Set<Object> set = new HashSet<Object>();
    068                for (Object o : ex.getUnsatisfiableDependencies()) {
    069                    final List<Object> list = (List<Object>)o;
    070                    set.addAll(list);
    071                }
    072                assertTrue(set.contains(String.class));
    073            }
    074            pico.addComponent(MESSAGE);
    075            final PicoException exception = (PicoException) componentAdapter.getComponentInstance(pico, ComponentAdapter.NOTHING.class);
    076            assertEquals(MESSAGE, exception.getMessage());
    077            assertSame(THROWABLE, exception.getCause());
    078        }
    079
    080        @Test public void testPicoInitializationException() {
    081            executeTestOfStandardException(PicoCompositionException.class);
    082        }
    083
    084        @Test public void testPicoInitializationExceptionWithDefaultConstructor() {
    085            TestException e = new TestException(null);
    086            assertNull(e.getMessage());
    087            assertNull(e.getCause());
    088        }
    089
    090        private static class TestException extends PicoCompositionException {
    091            public TestException(final String message) {
    092                super(message);
    093            }
    094        }
    095
    096        @Test public void testPrintStackTrace() throws IOException {
    097            PicoException nestedException = new PicoException("Outer", new Exception("Inner")) {
    098            };
    099            PicoException simpleException = new PicoException("Outer") {
    100            };
    101            ByteArrayOutputStream out = new ByteArrayOutputStream();
    102            PrintStream printStream = new PrintStream(out);
    103            nestedException.printStackTrace(printStream);
    104            simpleException.printStackTrace(printStream);
    105            out.close();
    106            assertTrue(out.toString().indexOf("Caused by:") > 0);
    107            out = new ByteArrayOutputStream();
    108            PrintWriter writer = new PrintWriter(out);
    109            nestedException.printStackTrace(writer);
    110            simpleException.printStackTrace(writer);
    111            writer.flush();
    112            out.close();
    113            assertTrue(out.toString().indexOf("Caused by:") > 0);
    114            //simpleException.printStackTrace();
    115        }
    116    }