001 /* 002 * Copyright 2007-2008 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.kew.edl; 017 018 import org.apache.log4j.Logger; 019 import org.junit.Test; 020 import org.kuali.rice.core.config.ConfigContext; 021 import org.kuali.rice.core.web.jetty.JettyServer; 022 import org.kuali.rice.kew.actiontaken.ActionTakenValue; 023 import org.kuali.rice.kew.dto.NetworkIdDTO; 024 import org.kuali.rice.kew.postprocessor.ActionTakenEvent; 025 import org.kuali.rice.kew.postprocessor.DeleteEvent; 026 import org.kuali.rice.kew.postprocessor.DocumentRouteLevelChange; 027 import org.kuali.rice.kew.postprocessor.DocumentRouteStatusChange; 028 import org.kuali.rice.kew.service.WorkflowDocument; 029 import org.kuali.rice.kew.test.KEWTestCase; 030 import org.kuali.rice.kew.util.KEWConstants; 031 032 033 /** 034 * This is a Test class to verify the edoc lite post processor. 035 * 036 * @author Kuali Rice Team (rice.collab@kuali.org) 037 * 038 */ 039 public class EDocLitePostProcessorTest extends KEWTestCase { 040 private static final Logger LOG = Logger.getLogger(EDocLitePostProcessorTest.class); 041 042 private static final String CONTEXT_NAME = "/edl-test"; 043 044 @Test 045 public void testPostEvent() throws Exception { 046 String dummyData = "testing this stuff"; 047 Integer testServerPort = Integer.valueOf(getJettyServerPort() + 1); 048 WorkflowDocument document = new WorkflowDocument(new NetworkIdDTO("ewestfal"), "TestDocumentType"); 049 String applicationContent = "<data><edlContent><edl><eventNotificationURL>" + ConfigContext.getCurrentContextConfig().getProperty(KEWConstants.KEW_URL_HOST) + ":" + testServerPort + CONTEXT_NAME + "</eventNotificationURL><testThisData>" + dummyData + "</testThisData></edl></edlContent></data>"; 050 document.setApplicationContent(applicationContent); 051 document.saveRoutingData(); 052 053 JettyServer server = null; 054 try { 055 server = new JettyServer(testServerPort.intValue(), CONTEXT_NAME, EDocLiteTestServlet.class); 056 server.setTestMode(true); 057 server.setFailOnContextFailure(true); 058 server.start(); 059 060 EDocLitePostProcessor postProcessor = new EDocLitePostProcessor(); 061 postProcessor.doActionTaken(new ActionTakenEvent(document.getRouteHeaderId(), document.getAppDocId(), new ActionTakenValue())); 062 String eventType = EDocLitePostProcessor.EVENT_TYPE_ACTION_TAKEN; 063 testPostProcessorMethod(document.getRouteHeaderId(), dummyData, eventType); 064 065 postProcessor = new EDocLitePostProcessor(); 066 postProcessor.doRouteLevelChange(new DocumentRouteLevelChange(document.getRouteHeaderId(), document.getAppDocId(), 1, 2, null, null, null, null)); 067 eventType = EDocLitePostProcessor.EVENT_TYPE_ROUTE_LEVEL_CHANGE; 068 testPostProcessorMethod(document.getRouteHeaderId(), dummyData, eventType); 069 070 postProcessor = new EDocLitePostProcessor(); 071 postProcessor.doRouteStatusChange(new DocumentRouteStatusChange(document.getRouteHeaderId(), document.getAppDocId(), KEWConstants.ROUTE_HEADER_INITIATED_CD, KEWConstants.ROUTE_HEADER_ENROUTE_CD)); 072 eventType = EDocLitePostProcessor.EVENT_TYPE_ROUTE_STATUS_CHANGE; 073 testPostProcessorMethod(document.getRouteHeaderId(), dummyData, eventType); 074 075 postProcessor = new EDocLitePostProcessor(); 076 postProcessor.doDeleteRouteHeader(new DeleteEvent(document.getRouteHeaderId(), document.getAppDocId())); 077 eventType = EDocLitePostProcessor.EVENT_TYPE_DELETE_ROUTE_HEADER; 078 testPostProcessorMethod(document.getRouteHeaderId(), dummyData, eventType); 079 080 } finally { 081 if (server != null) { 082 try { 083 server.stop(); 084 } catch (Exception e) { 085 LOG.warn("Failed to shutdown one of the lifecycles!", e); 086 } 087 } 088 } 089 } 090 091 private void testPostProcessorMethod(Long routeHeaderId, String dummyData, String eventType) { 092 int maxWaitSeconds = EDocLitePostProcessor.SUBMIT_URL_MILLISECONDS_WAIT + 10000; 093 assertTrue("Test Servlet data map should not be null after wait period", waitForData(maxWaitSeconds, 5000)); 094 testForStringExistence("Route Header Id", routeHeaderId.toString()); 095 testForStringExistence("Dummy Data", dummyData); 096 testForStringExistence("Event Type '" + eventType + "'", eventType); 097 } 098 099 private void testForStringExistence(String dataDescriptor, String dataToFind) { 100 assertTrue(dataDescriptor = " should come back as part of the post data but didn't", EDocLiteTestServlet.postData.contains(dataToFind)); 101 } 102 103 public static boolean waitForData(int maxWaitMilliseconds, int pauseMilliseconds) { 104 boolean valueNotNull = false; 105 boolean interrupted = false; 106 long startTimeMs = System.currentTimeMillis(); 107 long endTimeMs = startTimeMs + maxWaitMilliseconds; 108 109 try { 110 Thread.sleep(pauseMilliseconds / 10); // the first time through, sleep a fraction of the specified time 111 } catch (InterruptedException e) { 112 interrupted = true; 113 } 114 valueNotNull = EDocLiteTestServlet.postData != null; 115 LOG.debug("starting wait loop"); 116 while (!interrupted && !valueNotNull && (System.currentTimeMillis() < endTimeMs)) { 117 try { 118 if (LOG.isDebugEnabled()) { 119 LOG.debug("sleeping for " + pauseMilliseconds + " ms"); 120 } 121 Thread.sleep(pauseMilliseconds); 122 } catch (InterruptedException e) { 123 interrupted = true; 124 } 125 LOG.debug("checking wait loop sentinel"); 126 valueNotNull = EDocLiteTestServlet.postData != null; 127 } 128 LOG.debug("finished wait loop (" + valueNotNull + ")"); 129 130 return valueNotNull; 131 } 132 }