001    /**
002     * Copyright 2004-2014 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.hr;
017    
018    import java.io.File;
019    import java.util.ArrayList;
020    import java.util.Arrays;
021    import java.util.List;
022    
023    import org.apache.log4j.Logger;
024    import org.kuali.kpme.core.rice.test.lifecycles.KPMEXmlDataLoaderLifecycle;
025    import org.kuali.kpme.core.util.ClearDatabaseLifecycle;
026    import org.kuali.kpme.core.util.DatabaseCleanupDataLifecycle;
027    import org.kuali.kpme.core.util.HrContext;
028    import org.kuali.kpme.core.util.LoadDatabaseDataLifeCycle;
029    import org.kuali.rice.core.api.config.property.Config;
030    import org.kuali.rice.core.api.config.property.ConfigContext;
031    import org.kuali.rice.core.api.lifecycle.BaseLifecycle;
032    import org.kuali.rice.core.api.lifecycle.Lifecycle;
033    import org.kuali.rice.core.impl.services.CoreImplServiceLocator;
034    import org.kuali.rice.krad.UserSession;
035    import org.kuali.rice.krad.util.GlobalVariables;
036    import org.kuali.rice.krad.util.MessageMap;
037    import org.kuali.rice.test.RiceInternalSuiteDataTestCase;
038    import org.kuali.rice.test.TransactionalLifecycle;
039    import org.kuali.rice.test.lifecycles.JettyServerLifecycle;
040    import org.kuali.rice.test.lifecycles.JettyServerLifecycle.ConfigMode;
041    import org.springframework.cache.CacheManager;
042    
043    import com.gargoylesoftware.htmlunit.BrowserVersion;
044    import com.gargoylesoftware.htmlunit.WebClient;
045    
046    /**
047     *  Default test base for a full KPME unit test.
048     */
049    public abstract class KPMEWebTestCase extends RiceInternalSuiteDataTestCase {
050    
051            private static final String FILE_PREFIX = System.getProperty("user.dir") + "/../db/src/main/config/workflow/";
052    
053            private static final String RELATIVE_WEBAPP_ROOT = "/src/main/webapp";
054            
055            private TransactionalLifecycle transactionalLifecycle;
056        private WebClient webClient;
057            
058            @Override
059            protected String getModuleName() {
060                    return "kpme";
061            }
062    
063            @Override
064            public void setUp() throws Exception {
065                if (System.getProperty("basedir") == null) {
066                    System.setProperty("basedir", System.getProperty("user.dir") + "/");
067                }
068                
069                    super.setUp();
070    
071                    GlobalVariables.setMessageMap(new MessageMap());
072                    
073                    final boolean needsSpring = false;
074                    if (needsSpring) {
075                            transactionalLifecycle = new TransactionalLifecycle();
076                            //transactionalLifecycle.setTransactionManager(KRADServiceLocatorInternal.getTransactionManager());
077                            transactionalLifecycle.start();
078                    }
079    
080                new ClearDatabaseLifecycle().start();
081            
082                    new LoadDatabaseDataLifeCycle(this.getClass()).start();
083            
084                //lets try to create a user session
085                GlobalVariables.setUserSession(new UserSession("admin"));
086            setWebClient(new WebClient(BrowserVersion.FIREFOX_17));
087            getWebClient().getOptions().setJavaScriptEnabled(true);
088            getWebClient().getOptions().setTimeout(0);
089            }
090            
091            @Override
092            public void tearDown() throws Exception {
093                // runs custom SQL at the end of each test.
094                // useful for difficult to reset test additions, not handled by
095                // our ClearDatabaseLifecycle.
096            HrContext.clearTargetUser();
097            getWebClient().closeAllWindows();
098                new DatabaseCleanupDataLifecycle(this.getClass()).start();
099    
100                    final boolean needsSpring = true;
101                    if (needsSpring) {
102                        if ( (transactionalLifecycle != null) && (transactionalLifecycle.isStarted()) ) {
103                            transactionalLifecycle.stop();
104                        }
105                    }
106                    
107                    GlobalVariables.setMessageMap(new MessageMap());
108                    
109                    super.tearDown();
110            }
111    
112        @Override
113        protected List<Lifecycle> getPerTestLifecycles() {
114            List<Lifecycle> lifecycles = super.getPerTestLifecycles();
115            lifecycles.add(new ClearCacheLifecycle());
116            return lifecycles;
117        }
118    
119            @Override
120            protected List<Lifecycle> getSuiteLifecycles() {
121                    List<Lifecycle> lifecycles = super.getPerTestLifecycles();
122                lifecycles.add(new Lifecycle() {
123                            boolean started = false;
124            
125                            public boolean isStarted() {
126                                    return this.started;
127                            }
128            
129                            public void start() throws Exception {
130                                    setModuleName(getModuleName());
131                                    setBaseDirSystemProperty(getModuleName());
132                                    Config config = getTestHarnessConfig();
133                                    ConfigContext.init(config);
134                                    this.started = true;
135                            }
136            
137                            public void stop() throws Exception {
138                                    this.started = false;
139                            }
140                    });
141                /**
142                 * Loads the TestHarnessSpringBeans.xml file which obtains connections to the DB for us
143                 */
144    /*          lifecycles.add(getTestHarnessSpringResourceLoader());*/
145            
146                /**
147                 * Establishes the TestHarnessServiceLocator so that it has a reference to the Spring context
148                 * created from TestHarnessSpringBeans.xml
149                 */
150    /*          lifecycles.add(new BaseLifecycle() {
151                    @Override
152                    public void start() throws Exception {
153                        TestHarnessServiceLocator.setContext(getTestHarnessSpringResourceLoader().getContext());
154                        super.start();
155                    }
156                });*/
157            
158                lifecycles.add(new Lifecycle() {
159                            private JettyServerLifecycle jettyServerLifecycle;
160            
161                            public boolean isStarted() {
162                                    return jettyServerLifecycle.isStarted();
163                            }
164            
165                            public void start() throws Exception {
166                        System.setProperty("web.bootstrap.spring.file", "classpath:TestHarnessSpringBeans.xml");
167                        jettyServerLifecycle = new JettyServerLifecycle(getPort(), getContext(), RELATIVE_WEBAPP_ROOT);
168                        jettyServerLifecycle.setConfigMode(ConfigMode.OVERRIDE);
169                                    jettyServerLifecycle.start();
170                            }
171            
172                            public void stop() throws Exception {
173                                    this.jettyServerLifecycle.stop();
174                            }
175                    });
176            
177                ClearDatabaseLifecycle clearDatabaseLifecycle = new ClearDatabaseLifecycle();
178                clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_T");
179                clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_RSP_T");
180                clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_DLGN_RSP_T");
181                clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_ATTR_T");
182                clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_RULE_TMPL_T");
183                clearDatabaseLifecycle.getAlternativeTablesToClear().add("KREW_DOC_TYP_T");
184                lifecycles.add(clearDatabaseLifecycle);
185            
186                File[] files = new File(FILE_PREFIX).listFiles();
187                if (files != null) {
188                Arrays.sort(files);
189                    for (File file : files) {
190                        if (file.getName().endsWith(".xml")) {
191                            lifecycles.add(new KPMEXmlDataLoaderLifecycle(FILE_PREFIX + file.getName()));
192                        }
193                    }
194                }
195                    return lifecycles;
196            }
197    
198    /*      public void futureEffectiveDateValidation(String baseUrl) throws Exception {
199                    HtmlPage page = HtmlUnitUtil.gotoPageAndLogin(getWebClient(), baseUrl);
200                    Assert.assertNotNull(page);
201            
202                    HtmlForm form = page.getFormByName("KualiForm");
203                    Assert.assertNotNull("Search form was missing from page.", form);
204                    // use past dates
205                setFieldValue(page, "document.newMaintainableObject.effectiveDate", "04/01/2011");
206                HtmlInput  input  = HtmlUnitUtil.getInputContainingText(form, "methodToCall.route");
207                Assert.assertNotNull("Could not locate submit button", input);
208                    page = ((HtmlButtonInput)page.getElementByName("methodToCall.route")).click();
209                    Assert.assertTrue("page text does not contain:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR));
210                    LocalDate futureDate = LocalDate.now().plusYears(2); // 2 years in the future
211                    String futureDateString = "01/01/" + Integer.toString(futureDate.getYear());
212                    
213                    // use dates 2 years in the future
214                setFieldValue(page, "document.newMaintainableObject.effectiveDate", futureDateString);
215                    page = ((HtmlButtonInput)page.getElementByName("methodToCall.route")).click();
216                    Assert.assertTrue("page text does not contain:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR));
217                    LocalDate validDate = LocalDate.now().plusMonths(5); // 5 month in the future
218                    String validDateString = Integer.toString(validDate.getMonthOfYear()) + '/' + Integer.toString(validDate.getDayOfMonth()) 
219                            + '/' + Integer.toString(validDate.getYear());
220                    setFieldValue(page, "document.newMaintainableObject.effectiveDate", validDateString);
221                    page = ((HtmlElement)page.getElementByName("methodToCall.route")).click();
222                    Assert.assertFalse("page text contains:\n" + HrTestConstants.EFFECTIVE_DATE_ERROR, page.asText().contains(HrTestConstants.EFFECTIVE_DATE_ERROR));
223            }
224    */
225        public class ClearCacheLifecycle extends BaseLifecycle {
226            private final Logger LOG = Logger.getLogger(ClearCacheLifecycle.class);
227    
228            @Override
229            public void start() throws Exception {
230                long startTime = System.currentTimeMillis();
231                LOG.info("Starting cache flushing");
232                List<CacheManager> cms = new ArrayList<CacheManager>(CoreImplServiceLocator.getCacheManagerRegistry().getCacheManagers());
233                for (CacheManager cm : cms) {
234                    for (String cacheName : cm.getCacheNames()) {
235                        //LOG.info("Clearing cache: " + cacheName);
236                        cm.getCache(cacheName).clear();
237                    }
238                }
239                long endTime = System.currentTimeMillis();
240                LOG.info("Caches cleared in " + (endTime - startTime) + "ms");
241            }
242    
243            @Override
244            public void stop() throws Exception {
245                super.stop();
246            }
247    
248        }
249    
250        public WebClient getWebClient() {
251            return this.webClient;
252        }
253    
254        public void setWebClient(WebClient webClient) {
255            this.webClient = webClient;
256        }
257        
258        public static String getBaseURL() {
259                return ConfigContext.getCurrentContextConfig().getProperty("application.url");
260        }
261        
262        public static String getContext() {
263            return "/" + ConfigContext.getCurrentContextConfig().getProperty("app.context.name");
264        }
265    
266        public static String getTempDir() {
267            return ConfigContext.getCurrentContextConfig().getProperty("temp.dir");
268        }
269    
270        public static Integer getPort() {
271                return new Integer(ConfigContext.getCurrentContextConfig().getProperty("kns.test.port"));
272        }
273    
274        /*protected List<String> getConfigLocations() {
275            List<String> configLocations = new ArrayList<String>();
276            //configLocations.add(getRiceMasterDefaultConfigFile());
277            configLocations.add("classpath:META-INF/kpme-test-config.xml");
278    
279            //module specific overrides:
280            configLocations.add(getModuleTestConfigLocation());
281            return configLocations;
282        }*/
283    
284    }