/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/portal/trunk/portal-render-engine-impl/pack/src/test/org/sakaiproject/portal/charon/test/http/AnonPortalTest.java $ * $Id: AnonPortalTest.java 105079 2012-02-24 23:08:11Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008 The Sakai Foundation * * Licensed under the Educational Community License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.opensource.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * **********************************************************************************/ package org.sakaiproject.portal.charon.test.http; import java.io.DataInputStream; import java.io.IOException; import java.net.ConnectException; import java.util.HashMap; import java.util.Map; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.xml.sax.SAXException; import com.meterware.httpunit.GetMethodWebRequest; import com.meterware.httpunit.HttpException; import com.meterware.httpunit.WebConversation; import com.meterware.httpunit.WebForm; import com.meterware.httpunit.WebLink; import com.meterware.httpunit.WebRequest; import com.meterware.httpunit.WebResponse; import com.meterware.servletunit.ServletUnitClient; /** * @author ieb */ public class AnonPortalTest extends TestCase { private static final Log log = LogFactory.getLog(AnonPortalTest.class); private static final String TEST_URL = "http://localhost:8080/library/js/headscripts.js"; private static final String BASE_URL = "http://localhost:8080/"; private static final String[] seedURLs = { "/portal", "/portal/pda", "/portal/worksite", "/portal/gallery" }; private static final String ADMIN_USER = "admin"; private static final String ADMIN_PASSWORD = "admin"; private static final ActionHandler loginHandler = new LoginActionHandler(ADMIN_USER,ADMIN_PASSWORD); private static final ActionHandler[] actionHandlers = { loginHandler }; ServletUnitClient client = null; private WebConversation wc; private boolean enabled = true; private byte[] buffer; private Map<String, String> visited; /* * (non-Javadoc) * * @see junit.framework.TestCase#setUp() */ @Override protected void setUp() throws Exception { try { wc = new WebConversation(); WebRequest req = new GetMethodWebRequest(TEST_URL); WebResponse resp = wc.getResponse(req); DataInputStream inputStream = new DataInputStream(resp.getInputStream()); buffer = new byte[resp.getContentLength()]; inputStream.readFully(buffer); visited = new HashMap<String, String>(); } catch (Exception notfound) { enabled = false; } } /* * (non-Javadoc) * * @see junit.framework.TestCase#tearDown() */ @Override protected void tearDown() throws Exception { super.tearDown(); } public void testSinglePage() { if (enabled) { log.info("Single Page Test Enabled"); } else { log.info("Tests Disabled, please start tomcat with sdata installed"); } } public void testFrontPage() throws Exception { if (enabled) { WebResponse resp = null; try { for (String seed : seedURLs) { log.info("Testing Seed URL "+seed); WebRequest req = new GetMethodWebRequest(BASE_URL + seed); resp = wc.getResponse(req); clickAll(resp, 0, 10); } } catch (HttpException hex) { log.error("Failed with ", hex); fail(hex.getMessage()); } } else { log.info("Tests Disabled, please start tomcat with sdata installed"); } } /** * @param resp * @param i * @throws SAXException * @throws IOException */ private void clickAll(WebResponse resp, int i, int maxDepth) throws SAXException, IOException { if (i > maxDepth) return; processLinks(resp,i+1,maxDepth); WebForm[] formst = resp.getForms(); log.info("Found "+formst.length+" forms"); for ( WebForm f : formst ) { log.info("Processing "+f.getMethod()+" "+f.getAction()); if ( "post".equals(f.getMethod()) ) { WebResponse formResp = performAction(f); if ( formResp != null ) { processLinks(formResp,i+1,maxDepth); } } } } /** * @param resp * @param i * @param maxDepth * @throws SAXException * @throws IOException */ private void processLinks(WebResponse resp, int i, int maxDepth) throws SAXException, IOException { char[] p = new char[i]; for (int j = 0; j < i; j++) { p[j] = ' '; } String pad = new String(p); WebLink[] links = resp.getLinks(); for (WebLink link : links) { String url = link.getURLString(); if (visited.get(url) == null) { visited.put(url, url); if (isLocal(url)) { log.info("Getting " + pad + link.getURLString()); WebResponse response = null; try { response = link.click(); } catch (HttpException ex) { log.warn("Failed to get Link " + url + " code:" + ex.getResponseCode() + " cause:" + ex.getResponseMessage()); } catch (ConnectException cex) { log.error("Failed to get Connection to "+url); } if (response != null) { clickAll(response, i, maxDepth); } } else { log.info("Ignoring External URL " + url); } } } } /** * @param url * @return */ private boolean isLocal(String url) { return url.startsWith("/") || (url.indexOf("//") > 0 && url.startsWith(BASE_URL)); } /** * @param f * @throws SAXException * @throws IOException */ private WebResponse performAction(WebForm f) throws IOException, SAXException { String action = f.getAction(); if ( isLocal(action) ) { action = getLocalUrl(action); for( ActionHandler ah : actionHandlers ) { WebResponse resp = ah.post(wc,f,action); if ( resp != null ) { return resp; } } } return null; } /** * @param action * @return */ private String getLocalUrl(String action) { if ( action.startsWith(BASE_URL) ) { action = action.substring(BASE_URL.length()); if ( action.charAt(0) != '/' ) { return "/"+action; } } return action; } }