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ø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    }