    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.monitors;
    011
    012    import static org.junit.Assert.assertEquals;
    013    import static org.picocontainer.monitors.ComponentMonitorHelper.ctorToString;
    014    import static org.picocontainer.monitors.ComponentMonitorHelper.format;
    015    import static org.picocontainer.monitors.ComponentMonitorHelper.methodToString;
    016    import static org.picocontainer.monitors.ComponentMonitorHelper.parmsToString;
    017
    018    import java.io.StringWriter;
    019    import java.io.Writer;
    020    import java.lang.reflect.Constructor;
    021    import java.lang.reflect.Method;
    022    import java.lang.reflect.Type;
    023    import java.util.HashMap;
    024    import java.util.Map;
    025
    026    import org.junit.Assert;
    027    import org.junit.Before;
    028    import org.junit.Test;
    029    import org.picocontainer.ComponentMonitor;
    030    import org.picocontainer.PicoCompositionException;
    031    import org.picocontainer.PicoContainer;
    032    import org.picocontainer.PicoLifecycleException;
    033    import org.picocontainer.adapters.AbstractAdapter;
    034    import org.picocontainer.containers.TransientPicoContainer;
    035
    036    /**
    037     * @author Aslak Helles&oslash;y
    038     * @author Mauro Talevi
    039     */
    040    @SuppressWarnings("serial")
    041    public class WriterComponentMonitorTestCase  {
    042
    043        private Writer out;
    044        private ComponentMonitor componentMonitor;
    045        private static final String NL = System.getProperty("line.separator");
    046        private Constructor constructor;
    047        private Method method;
    048
    049        @Before
    050        public void setUp() throws Exception {
    051            out = new StringWriter();
    052            constructor = getClass().getConstructor((Class[])null);
    053            method = getClass().getDeclaredMethod("setUp", (Class[])null);
    054            componentMonitor = new WriterComponentMonitor(out);
    055        }
    056
    057        @SuppressWarnings("unchecked")
    058        @Test public void testShouldTraceInstantiating() {
    059            componentMonitor.instantiating(null, null, constructor);
    060            assertEquals(format(ComponentMonitorHelper.INSTANTIATING, ctorToString(constructor)) +NL,  out.toString());
    061        }
    062
    063        @SuppressWarnings("unchecked")
    064        @Test public void testShouldTraceInstantiatedWithInjected() {
    065            Object[] injected = new Object[0];
    066            Object instantiated = new Object();
    067            componentMonitor.instantiated(null, null, constructor, instantiated, injected, 543);
    068            Assert.assertEquals(format(ComponentMonitorHelper.INSTANTIATED,
    069                                                       ctorToString(constructor),
    070                                                       (long)543,
    071                                                       instantiated.getClass().getName(), parmsToString(injected)) +NL,  out.toString());
    072        }
    073
    074        @SuppressWarnings("unchecked")
    075        @Test public void testShouldTraceInstantiationFailed() {
    076            componentMonitor.instantiationFailed(null, null, constructor, new RuntimeException("doh"));
    077            Assert.assertEquals(format(ComponentMonitorHelper.INSTANTIATION_FAILED,
    078                                                       ctorToString(constructor), "doh") +NL,  out.toString());
    079        }
    080
    081        @Test public void testShouldTraceInvoking() {
    082            componentMonitor.invoking(null, null, method, this, new Object[0]);
    083            Assert.assertEquals(format(ComponentMonitorHelper.INVOKING,
    084                                                       methodToString(method), this) +NL,  out.toString());
    085        }
    086
    087        @Test public void testShouldTraceInvoked() {
    088            componentMonitor.invoked(null, null, method, this, 543, new Object[0], null);
    089            Assert.assertEquals(format(ComponentMonitorHelper.INVOKED,
    090                                                       methodToString(method), this,
    091                                                       (long)543) +NL,  out.toString());
    092        }
    093
    094        @Test public void testShouldTraceInvocatiationFailed() {
    095            componentMonitor.invocationFailed(method, this, new RuntimeException("doh"));
    096            Assert.assertEquals(format(ComponentMonitorHelper.INVOCATION_FAILED,
    097                                                       methodToString(method), this, "doh") +NL,  out.toString());
    098        }
    099
    100        @SuppressWarnings("unchecked")
    101        @Test public void testShouldTraceLifecycleInvocationFailed() {
    102            try {
    103                componentMonitor.lifecycleInvocationFailed(new TransientPicoContainer(),
    104                                                           new AbstractAdapter(Map.class, HashMap.class) {
    105                                                               public Object getComponentInstance(PicoContainer container) throws PicoCompositionException {
    106                                                                   return getComponentInstance(container, null);
    107                                                               }
    108
    109                                                               public Object getComponentInstance(PicoContainer container, Type into)
    110                                                                   throws PicoCompositionException {
    111                                                                   return "x";
    112                                                               }
    113
    114                                                               public void verify(PicoContainer container)
    115                                                                   throws PicoCompositionException{
    116                                                               }
    117
    118                                                               public String getDescriptor() {
    119                                                                   return null;
    120                                                               }
    121                                                           },
    122                                                           method,
    123                                                           "fooooo",
    124                                                           new RuntimeException("doh"));
    125                Assert.fail("should have barfed");
    126            } catch (PicoLifecycleException e) {
    127                //expected
    128            }
    129            Assert.assertEquals(format(ComponentMonitorHelper.LIFECYCLE_INVOCATION_FAILED,
    130                                                       methodToString(method), "fooooo", "doh") + NL,
    131                         out.toString());
    132        }
    133
    134        @Test public void testNoComponent() {
    135
    136            componentMonitor.noComponentFound(new TransientPicoContainer(), "foo");
    137            Assert.assertEquals(format(ComponentMonitorHelper.NO_COMPONENT,
    138                                                       "foo") +NL,  out.toString());
    139        }
    140
    141
    142    }