View Javadoc

1   /**
2    * Copyright 2004-2014 The Kuali Foundation
3    *
4    * Licensed under the Educational Community License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    * http://www.opensource.org/licenses/ecl2.php
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
15   */
16  package org.kuali.hr;
17  
18  import java.io.File;
19  import java.util.ArrayList;
20  import java.util.Arrays;
21  import java.util.List;
22  
23  import org.apache.log4j.Logger;
24  import org.kuali.kpme.core.rice.test.lifecycles.KPMEXmlDataLoaderLifecycle;
25  import org.kuali.kpme.core.util.ClearDatabaseLifecycle;
26  import org.kuali.kpme.core.util.DatabaseCleanupDataLifecycle;
27  import org.kuali.kpme.core.util.HrContext;
28  import org.kuali.kpme.core.util.LoadDatabaseDataLifeCycle;
29  import org.kuali.rice.core.api.config.property.Config;
30  import org.kuali.rice.core.api.config.property.ConfigContext;
31  import org.kuali.rice.core.api.lifecycle.BaseLifecycle;
32  import org.kuali.rice.core.api.lifecycle.Lifecycle;
33  import org.kuali.rice.core.impl.services.CoreImplServiceLocator;
34  import org.kuali.rice.krad.UserSession;
35  import org.kuali.rice.krad.util.GlobalVariables;
36  import org.kuali.rice.krad.util.MessageMap;
37  import org.kuali.rice.test.RiceInternalSuiteDataTestCase;
38  import org.kuali.rice.test.TransactionalLifecycle;
39  import org.kuali.rice.test.lifecycles.JettyServerLifecycle;
40  import org.kuali.rice.test.lifecycles.JettyServerLifecycle.ConfigMode;
41  import org.springframework.cache.CacheManager;
42  
43  import com.gargoylesoftware.htmlunit.BrowserVersion;
44  import com.gargoylesoftware.htmlunit.WebClient;
45  
46  /**
47   *  Default test base for a full KPME unit test.
48   */
49  public abstract class KPMEWebTestCase extends RiceInternalSuiteDataTestCase {
50  
51  	private static final String FILE_PREFIX = System.getProperty("user.dir") + "/../db/src/main/config/workflow/";
52  
53  	private static final String RELATIVE_WEBAPP_ROOT = "/src/main/webapp";
54  	
55  	private TransactionalLifecycle transactionalLifecycle;
56      private WebClient webClient;
57  	
58  	@Override
59  	protected String getModuleName() {
60  		return "kpme";
61  	}
62  
63  	@Override
64  	public void setUp() throws Exception {
65  	    if (System.getProperty("basedir") == null) {
66  	        System.setProperty("basedir", System.getProperty("user.dir") + "/");
67  	    }
68  	    
69  		super.setUp();
70  
71  		GlobalVariables.setMessageMap(new MessageMap());
72  		
73  		final boolean needsSpring = false;
74  		if (needsSpring) {
75  			transactionalLifecycle = new TransactionalLifecycle();
76  			//transactionalLifecycle.setTransactionManager(KRADServiceLocatorInternal.getTransactionManager());
77  			transactionalLifecycle.start();
78  		}
79  
80  	    new ClearDatabaseLifecycle().start();
81  	
82  		new LoadDatabaseDataLifeCycle(this.getClass()).start();
83  	
84  	    //lets try to create a user session
85  	    GlobalVariables.setUserSession(new UserSession("admin"));
86          setWebClient(new WebClient(BrowserVersion.FIREFOX_17));
87          getWebClient().getOptions().setJavaScriptEnabled(true);
88          getWebClient().getOptions().setTimeout(0);
89  	}
90  	
91  	@Override
92  	public void tearDown() throws Exception {
93  	    // runs custom SQL at the end of each test.
94  	    // useful for difficult to reset test additions, not handled by
95  	    // our ClearDatabaseLifecycle.
96          HrContext.clearTargetUser();
97          getWebClient().closeAllWindows();
98  	    new DatabaseCleanupDataLifecycle(this.getClass()).start();
99  
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 }