001    /*
002     * Copyright 2007-2008 The Kuali Foundation
003     * 
004     * Licensed under the Educational Community License, Version 2.0 (the "License"); you may not use this file except in
005     * compliance with the License. You may obtain a copy of the License at
006     * 
007     * http://www.opensource.org/licenses/ecl2.php
008     * 
009     * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS
010     * IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
011     * language governing permissions and limitations under the License.
012     */
013    package org.kuali.rice.test;
014    
015    import java.lang.reflect.Method;
016    import java.util.HashMap;
017    import java.util.Iterator;
018    import java.util.Map;
019    
020    import org.apache.log4j.Level;
021    import org.apache.log4j.Logger;
022    import org.junit.After;
023    import org.junit.Assert;
024    import org.junit.Before;
025    import org.junit.runner.RunWith;
026    import org.kuali.rice.test.lifecycles.PerTestDataLoaderLifecycle;
027    import org.kuali.rice.test.runners.RiceUnitTestClassRunner;
028    
029    /**
030     * A generic Rice Unit Test base class.
031     * 
032     * 1) Sets up a generic logger.
033     * 2) Sets the name of the class being run to mimic jUnit 3 functionality.
034     * 3) Stores the name of the method being run for use by subclasses (set by {@link RiceUnitTestClassRunner}
035     * 4) Sets the PerTestDataLoaderLifecycle that will load sql for the currently running test.
036     * 
037     * @author Kuali Rice Team (rice.collab@kuali.org)
038     * @since 0.9
039     */
040    @RunWith(RiceUnitTestClassRunner.class)
041    public abstract class BaseRiceTestCase extends Assert implements MethodAware {
042    
043            protected final Logger log = Logger.getLogger(getClass());
044    
045            private static final Map<String, Level> changedLogLevels = new HashMap<String, Level>();
046            
047            private String name;
048            private PerTestDataLoaderLifecycle perTestDataLoaderLifecycle;
049            protected Method method;
050    
051            public BaseRiceTestCase() {
052                    super();
053            }
054    
055            public String getName() {
056                    return this.name;
057            }
058    
059            public void setName(String name) {
060                    this.name = name;
061            }
062        
063            @Before
064            public void setUp() throws Exception {
065            }
066            
067        @After
068        public void tearDown() throws Exception {
069            resetLogLevels();
070        }
071        
072        /**
073         * Changes the logging-level associated with the given loggerName to the
074         * given level. The original logging-level is saved, and will be
075         * automatically restored at the end of each test.
076         * 
077         * @param loggerName
078         *            name of the logger whose level to change
079         * @param newLevel
080         *            the level to change to
081         */
082        protected void setLogLevel(String loggerName, Level newLevel) {
083            Logger logger = Logger.getLogger(loggerName);
084    
085            if (!changedLogLevels.containsKey(loggerName)) {
086                Level originalLevel = logger.getLevel();
087                changedLogLevels.put(loggerName, originalLevel);
088            }
089    
090            logger.setLevel(newLevel);
091        }
092    
093        /**
094         * Restores the logging-levels changed through calls to setLogLevel to their
095         * original values.
096         */
097        protected void resetLogLevels() {
098            for (Iterator i = changedLogLevels.entrySet().iterator(); i.hasNext();) {
099                Map.Entry e = (Map.Entry) i.next();
100    
101                String loggerName = (String) e.getKey();
102                Level originalLevel = (Level) e.getValue();
103    
104                Logger.getLogger(loggerName).setLevel(originalLevel);
105            }
106            changedLogLevels.clear();
107        }
108        
109            /**
110             * @see org.kuali.rice.test.MethodAware#setTestMethod(java.lang.reflect.Method)
111             */
112            public void setTestMethod(Method testMethod) {
113            this.method = testMethod;
114    
115            perTestDataLoaderLifecycle = new PerTestDataLoaderLifecycle(method);
116        }
117            
118        protected PerTestDataLoaderLifecycle getPerTestDataLoaderLifecycle() {
119                    return this.perTestDataLoaderLifecycle;
120            }
121    }