001    /*
002     * Copyright 2007 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.ken.test;
017    
018    import org.kuali.rice.core.api.lifecycle.BaseLifecycle;
019    import org.kuali.rice.core.api.lifecycle.Lifecycle;
020    import org.kuali.rice.core.impl.resourceloader.RiceResourceLoaderFactory;
021    import org.kuali.rice.core.impl.resourceloader.SpringResourceLoader;
022    import org.kuali.rice.ken.core.SpringNotificationServiceLocator;
023    import org.kuali.rice.ksb.api.KsbApiServiceLocator;
024    import org.kuali.rice.test.BaselineTestCase;
025    import org.kuali.rice.test.BaselineTestCase.BaselineMode;
026    import org.kuali.rice.test.BaselineTestCase.Mode;
027    import org.kuali.rice.test.CompositeBeanFactory;
028    import org.kuali.rice.test.lifecycles.KEWXmlDataLoaderLifecycle;
029    import org.kuali.rice.test.lifecycles.SQLDataLoaderLifecycle;
030    import org.quartz.Scheduler;
031    import org.quartz.SchedulerException;
032    import org.springframework.beans.factory.BeanFactory;
033    import org.springframework.transaction.PlatformTransactionManager;
034    
035    import javax.xml.namespace.QName;
036    import java.util.ArrayList;
037    import java.util.List;
038    
039    
040    /**
041     * Base test case for KEN that extends RiceTestCase
042     * @author Kuali Rice Team (rice.collab@kuali.org)
043     */
044    @BaselineMode(Mode.CLEAR_DB)
045    public abstract class KENTestCase extends BaselineTestCase {
046        private static final String KEN_MODULE_NAME = "ken";
047        private static final String TX_MGR_BEAN_NAME = "transactionManager";
048    
049        protected SpringNotificationServiceLocator services;
050        protected PlatformTransactionManager transactionManager;
051    
052        public KENTestCase() {
053            super(KEN_MODULE_NAME);
054        }   
055        
056        
057        
058        @Override
059            protected List<Lifecycle> getSuiteLifecycles() {
060                    List<Lifecycle> suiteLifecycles = super.getSuiteLifecycles();
061                    suiteLifecycles.add(new KEWXmlDataLoaderLifecycle("classpath:org/kuali/rice/ken/test/DefaultSuiteTestData.xml"));
062                    return suiteLifecycles;
063            }
064        
065        @Override
066            protected Lifecycle getLoadApplicationLifecycle() {
067            SpringResourceLoader springResourceLoader = new SpringResourceLoader(new QName("KENTestHarnessApplicationResourceLoader"), "classpath:KENTestHarnessSpringBeans.xml", null);
068            springResourceLoader.setParentSpringResourceLoader(getTestHarnessSpringResourceLoader());
069            return springResourceLoader;
070            }
071    
072            @Override
073        protected List<Lifecycle> getPerTestLifecycles() {
074            List<Lifecycle> lifecycles = super.getPerTestLifecycles();
075            lifecycles.add(new ClearCacheLifecycle());
076            lifecycles.addAll(getNotificationPerTestLifecycles());
077            return lifecycles;
078        }
079        
080            protected List<Lifecycle> getNotificationPerTestLifecycles() {
081            List<Lifecycle> lifecycles = new ArrayList<Lifecycle>();
082            lifecycles.add(new BaseLifecycle() {
083                @Override
084                public void start() throws Exception {
085                    // get the composite Rice Spring context
086                    BeanFactory moduleContext = CompositeBeanFactory.createBeanFactory(RiceResourceLoaderFactory.getSpringResourceLoaders());
087                    // This method sets up the Spring services so that they can be accessed by the tests.
088                    services = new SpringNotificationServiceLocator(moduleContext);
089                    // grab the module's transaction manager
090                    transactionManager = (PlatformTransactionManager) moduleContext.getBean(TX_MGR_BEAN_NAME, PlatformTransactionManager.class);
091                    super.start();
092                }
093    
094            });
095    
096            // clear out the KEW cache
097            lifecycles.add(new BaseLifecycle() {
098                @Override
099                public void start() throws Exception {
100                    super.start();
101    
102                    LOG.info("Status of Ken scheduler on start: " + (services.getScheduler().isStarted() ? "started" : "stopped"));
103                    // stop quartz if a test failed to do so
104                    disableQuartzJobs();
105                }
106                public void stop() throws Exception {
107                    //KsbApiServiceLocator.getCacheAdministrator().flushAll();
108    
109                    LOG.info("Status of Ken scheduler on stop: " + (services.getScheduler().isStarted() ? "started" : "stopped"));
110                    // stop quartz if a test failed to do so
111                    disableQuartzJobs();
112    
113                    super.stop();
114                }
115            });
116    
117            // load the default SQL
118            lifecycles.add(new SQLDataLoaderLifecycle("classpath:org/kuali/rice/ken/test/DefaultPerTestData.sql", ";"));
119            
120            lifecycles.add(new KEWXmlDataLoaderLifecycle("classpath:org/kuali/rice/ken/test/DefaultPerTestData.xml"));
121            
122    
123            return lifecycles;
124    
125        }
126        
127        /**
128             * Returns the List of tables that should be cleared on every test run.
129             */
130            protected List<String> getPerTestTablesToClear() {
131                    List<String> tablesToClear = new ArrayList<String>();
132                    tablesToClear.add("KREW_.*");
133                    tablesToClear.add("KRSB_.*");
134                    tablesToClear.add("KREN_.*");
135                    return tablesToClear;
136            }
137    
138        /**
139         * Flushes the KEW cache(s)
140         */
141        public class ClearCacheLifecycle extends BaseLifecycle {
142            @Override
143            public void stop() throws Exception {
144                //KsbApiServiceLocator.getCacheAdministrator().flushAll();
145                //KimApiServiceLocator.getIdentityManagementService().flushAllCaches();
146                //KimApiServiceLocator.getRoleService().flushRoleCaches();
147                super.stop();
148            }
149    
150        }
151        /**
152         * This method makes sure to disable the Quartz scheduler
153         * @throws SchedulerException
154         */
155        protected void disableQuartzJobs() throws SchedulerException {
156            // do this so that our quartz jobs don't go off - we don't care about
157            // these in our unit tests
158            Scheduler scheduler = services.getScheduler();
159            scheduler.standby();
160            //scheduler.shutdown();
161        }
162    
163        /**
164         * This method enables the Quartz scheduler
165         * @throws SchedulerException
166         */
167        protected void enableQuartzJobs() throws SchedulerException {
168            // do this so that our quartz jobs don't go off - we don't care about
169            // these in our unit tests
170            Scheduler scheduler = services.getScheduler();
171            scheduler.start();
172        }
173    
174    }