All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sun.faces.htmlunit.HtmlUnitFacesTestCase Maven / Gradle / Ivy

Go to download

Run time jsf-extensions mvn -Prelease-sign-artifacts -Dgpg.passphrase=PASSPHRASE deploy

There is a newer version: 2.4
Show newest version
/*
 * $Id: HtmlUnitFacesTestCase.java,v 1.16 2006/07/31 23:05:00 rlubke Exp $
 */

/*
 * The contents of this file are subject to the terms
 * of the Common Development and Distribution License
 * (the License). You may not use this file except in
 * compliance with the License.
 * 
 * You can obtain a copy of the License at
 * https://javaserverfaces.dev.java.net/CDDL.html or
 * legal/CDDLv1.0.txt. 
 * See the License for the specific language governing
 * permission and limitations under the License.
 * 
 * When distributing Covered Code, include this CDDL
 * Header Notice in each file and include the License file
 * at legal/CDDLv1.0.txt.    
 * If applicable, add the following below the CDDL Header,
 * with the fields enclosed by brackets [] replaced by
 * your own identifying information:
 * "Portions Copyrighted [year] [name of copyright owner]"
 * 
 * [Name of File] [ver.__] [Date]
 * 
 * Copyright 2005 Sun Microsystems Inc. All Rights Reserved
 */

package com.sun.faces.htmlunit;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.CookieManager;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.ProxyConfig;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.WebRequestSettings;
import com.gargoylesoftware.htmlunit.WebResponse;
import com.gargoylesoftware.htmlunit.html.HtmlBody;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import java.util.logging.Level;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Vector;
import java.util.logging.Logger;


/**
 * 

Abstract base class for test cases utilizing HtmlUnit.

*/ public abstract class HtmlUnitFacesTestCase extends TestCase { // ------------------------------------------------------------ Constructors /** * Construct a new instance of this test case. * * @param name Name of the test case */ public HtmlUnitFacesTestCase(String name) { super(name); this.testName = name; } // ------------------------------------------------------ Instance Variables /** * The Log instance for this class. */ protected static final Logger log = Logger.getLogger(HtmlUnitFacesTestCase.class.getName()); protected String testName; // System property values used to configure the HTTP connection protected String contextPath = null; protected String host = null; protected int port = 0; protected Integer virtualServerPort = null; // The current session identifier protected String sessionId = null; // The WebClient instance for this test case protected WebClient client = null; // The URL for our test application protected URL domainURL = null; // The cookie manager protected CookieManager cmanager = null; // The last requested page protected HtmlPage lastpage = null; // Possible containers - these should be the uppercase values of the possible container values in build.properties protected enum Container { GLASSFISH, GLASSFISHV3PRELUDE, GLASSFISHV3, GLASSFISHV3_1, GLASSFISHV3_1_NO_CLUSTER, TOMCAT6, TOMCAT7, WLS_10_3_4_NO_CLUSTER, WLS_12_1_1_NO_CLUSTER } // Per-container exclusions protected Map> exclusions = null; // Instance numbers for clustering private List instanceNumbers; protected boolean forceNoCluster = false; private Random rand = new Random(); protected boolean isVirtualServer = false; // ---------------------------------------------------- Overall Test Methods /** * Set up instance variables required by this test case. */ @Override public void setUp() throws Exception { BrowserVersion browserVersion; isVirtualServer = Boolean.parseBoolean(System.getProperty("virtual-server")); String instanceNumbersStr = System.getProperty("instance.numbers"); if (null != instanceNumbersStr && 0 < instanceNumbersStr.length() && !("${instance.numbers}".equals(instanceNumbersStr))) { String [] strs = instanceNumbersStr.split(","); List instNums = getInstanceNumbers(); for (String cur : strs) { try { instNums.add(Integer.parseInt(cur)); } catch (NumberFormatException e) { System.out.println(e.getMessage()); } } } String forceNoClusterStr = System.getProperty("force.no.cluster"); forceNoCluster = (null != forceNoClusterStr && 0 < forceNoClusterStr.length()); contextPath = System.getProperty("context.path"); host = System.getProperty("host"); port = Integer.parseInt(System.getProperty("port")); String browser = System.getProperty("browser"); if ("FF3".equals(browser)) { browserVersion = BrowserVersion.FIREFOX_3; } else if ("FF2".equals(browser)) { browserVersion = BrowserVersion.FIREFOX_2; } else if ("IE6".equals(browser)) { browserVersion = BrowserVersion.INTERNET_EXPLORER_6; } else { browserVersion = BrowserVersion.INTERNET_EXPLORER_7; } String proxyHost = System.getProperty("proxyHost"); String proxyPort = System.getProperty("proxyPort"); client = new WebClient(browserVersion); cmanager = client.getCookieManager(); // Add an ajax controller to synchronize all ajax calls client.setAjaxController(new NicelyResynchronizingAjaxController()); domainURL = getURL("/"); WebRequestSettings settings = new WebRequestSettings(domainURL); if (null != proxyHost && null != proxyPort) { settings.setProxyHost(proxyHost); int proxyPortInt = Integer.parseInt(proxyPort); settings.setProxyPort(proxyPortInt); ProxyConfig config = client.getProxyConfig(); config.setProxyHost(proxyHost); config.setProxyPort(proxyPortInt); } WebResponse response = client.getWebConnection().getResponse(settings); } protected List getInstanceNumbers() { if (null == instanceNumbers) { instanceNumbers = new ArrayList(); } return instanceNumbers; } /** * Return the tests included in this test suite. */ public static Test suite() { return (new TestSuite(HtmlUnitFacesTestCase.class)); } /** * Tear down instance variables required by this test case. */ public void tearDown() { client = null; domainURL = null; cmanager = null; } // ------------------------------------------------- Individual Test Methods // --------------------------------------------------------- Private Methods /** *

Extract and return the result of calling asText() * on the <body> element of this page.

* * @param page The HtmlPage to process */ protected String getBodyText(HtmlPage page) { Object body = page.getDocumentElement().getHtmlElementsByTagName("body").get(0); if (body != null) { if (body instanceof HtmlBody) { return (((HtmlBody) body).asText()); } } fail("This page does not have a element"); return (null); // To satisfy the compiler } /** *

Return the page for the specified context-relative path, * maintaining session affinity if sessionId is not null.

* * @param path Context-relative part of the path */ protected HtmlPage getPage(String path) throws Exception { /* Cookies seem to be maintained automatically now if (sessionId != null) { // System.err.println("Joining session " + sessionId); client.addRequestHeader("Cookie", "JSESSIONID=" + sessionId); } */ lastpage = (HtmlPage) client.getPage(getURL(path)); if (sessionId == null) { parseSession(lastpage); } return lastpage; } protected HtmlPage getPageWithRetry(String path, int retries) throws Exception { int i = 0; boolean success = false; do { try { getPage(path); success = true; } catch (FailingHttpStatusCodeException fhse) { Thread.sleep(3000); } } while (!success && ++i < retries); return lastpage; } protected HtmlPage getPageSticky(String path) throws Exception { /* Cookies seem to be maintained automatically now if (sessionId != null) { // System.err.println("Joining session " + sessionId); client.addRequestHeader("Cookie", "JSESSIONID=" + sessionId); } */ lastpage = (HtmlPage) client.getPage(getURLSticky(path)); if (sessionId == null) { parseSession(lastpage); } return lastpage; } protected HtmlPage getPageFromInstanceN(String path, int instanceNumber) throws Exception { /* Cookies seem to be maintained automatically now if (sessionId != null) { // System.err.println("Joining session " + sessionId); client.addRequestHeader("Cookie", "JSESSIONID=" + sessionId); } */ lastpage = (HtmlPage) client.getPage(getURLFromInstanceN(path, instanceNumber)); if (sessionId == null) { parseSession(lastpage); } return lastpage; } protected int getPort() { if (null != virtualServerPort) { return virtualServerPort.intValue(); } int result = port; List instNums = getInstanceNumbers(); if (!instNums.isEmpty() && (!forceNoCluster || isVirtualServer)) { int instanceNumberIndex = rand.nextInt(instNums.size()); try { String num = instNums.get(instanceNumberIndex).toString() + port; result = Integer.parseInt(num); } catch (NumberFormatException e) { System.out.println(e.getMessage()); throw e; } } if (isVirtualServer) { virtualServerPort = (Integer) result; } return result; } protected int getFirstPort() { int result = port; List instNums = getInstanceNumbers(); if (!instNums.isEmpty() && !forceNoCluster) { int instanceNumberIndex = 0; try { String num = instNums.get(instanceNumberIndex).toString() + port; result = Integer.parseInt(num); } catch (NumberFormatException e) { System.out.println(e.getMessage()); throw e; } } return result; } protected int getNthPort(int instanceNumber) { int result = port; if (!forceNoCluster) { try { String num = instanceNumber + "" + port; result = Integer.parseInt(num); } catch (NumberFormatException e) { System.out.println(e.getMessage()); throw e; } } return result; } /** * The same as {@link #getPage(String)} except this uses the specified * WebClient. * * @param path context-relative path * @param client WebClient * @return an HtmlPage instance * @throws Exception if an error occurs */ protected HtmlPage getPage(String path, WebClient client) throws Exception { lastpage = (HtmlPage) client.getPage(getURL(path)); if (sessionId == null) { parseSession(lastpage); } return lastpage; } /** *

Return a URL for the specified context-relative * path.

* * @param path Context relative path */ protected URL getURL(String path) throws Exception { StringBuffer sb = new StringBuffer("http://"); sb.append(host); int myPort = getPort(); if (myPort != 80) { sb.append(":"); sb.append("" + myPort); } sb.append(contextPath); sb.append(path); if (log.isLoggable(Level.INFO)) { log.info(sb.toString()); } return (new URL(sb.toString())); } protected URL getURLSticky(String path) throws Exception { StringBuffer sb = new StringBuffer("http://"); sb.append(host); int myPort = getFirstPort(); if (myPort != 80) { sb.append(":"); sb.append("" + myPort); } sb.append(contextPath); sb.append(path); if (log.isLoggable(Level.INFO)) { log.info(sb.toString()); } return (new URL(sb.toString())); } protected URL getURLFromInstanceN(String path, int instanceNumber) throws Exception { StringBuilder sb = new StringBuilder("http://"); sb.append(host); int myPort = getNthPort(instanceNumber); if (myPort != 80) { sb.append(":"); sb.append("").append(myPort); } sb.append(contextPath); sb.append(path); if (log.isLoggable(Level.INFO)) { log.info(sb.toString()); } return (new URL(sb.toString())); } /** *

Parse and save any session identifier from the specified page.

* * @param page The current page */ protected void parseSession(HtmlPage page) { String value = page.getWebResponse().getResponseHeaderValue("Set-Cookie"); if (value == null) { return; } int equals = value.indexOf("JSESSIONID="); if (equals < 0) { return; } value = value.substring(equals + "JSESSIONID=".length()); int semi = value.indexOf(";"); if (semi >= 0) { value = value.substring(0, semi); } sessionId = value; // System.err.println("Beginning session " + sessionId); } protected boolean clearAllCookies() { cmanager.clearCookies(); return true; } // Return the form with the specified "id" from the specified page // (HtmlPage.getFormByName() looks at "name" instead) protected HtmlForm getFormById(HtmlPage page, String id) { Iterator forms = page.getForms().iterator(); while (forms.hasNext()) { HtmlForm form = (HtmlForm) forms.next(); if (id.equals(form.getAttributeValue("id"))) { return (form); } } return (null); } /** *

Added to compensate for changes in the HtmlUnit 1.4 API.

* * @see #getAllElementsOfGivenClass(com.gargoylesoftware.htmlunit.html.HtmlElement, java.util.List, Class) */ protected List getAllElementsOfGivenClass(HtmlPage root, List list, Class matchClass) { return getAllElementsOfGivenClass(root.getDocumentElement(), list, matchClass); } /** * Depth first search from root to find all children that are * instances of HtmlInput. Add them to the list. */ protected List getAllElementsOfGivenClass(HtmlElement root, List list, Class matchClass) { if (null == root) { return list; } if (null == list) { list = new ArrayList(); } Iterable iterable = root.getAllHtmlChildElements(); Iterator iter = iterable.iterator(); while (iter.hasNext()) { getAllElementsOfGivenClass((HtmlElement) iter.next(), list, matchClass); } if (matchClass.isInstance(root)) { if (!list.contains(root)) { list.add(root); } } return list; } protected HtmlInput getInputContainingGivenId(HtmlPage root, String id) { List list; int i; HtmlInput result = null; list = getAllElementsOfGivenClass(root, null, HtmlInput.class); for (i = 0; i < list.size(); i++) { result = (HtmlInput) list.get(i); if (-1 != result.getIdAttribute().indexOf(id)) { break; } result = null; } return result; } protected HtmlInput getNthInputContainingGivenId(HtmlPage root, String id, int whichInput) { List list; int i, hitCount = 0; HtmlInput result = null; list = getAllElementsOfGivenClass(root, null, HtmlInput.class); for (i = 0; i < list.size(); i++) { result = (HtmlInput) list.get(i); if (-1 != result.getIdAttribute().indexOf(id) && hitCount++ == whichInput) { break; } result = null; } return result; } protected HtmlInput getNthFromLastInputContainingGivenId(HtmlPage root, String id, int whichInput) { List list; int i, hitCount = 0; HtmlInput result = null; list = getAllElementsOfGivenClass(root, null, HtmlInput.class); for (i = list.size() - 1; i >= 0; i--) { result = (HtmlInput) list.get(i); if (-1 != result.getIdAttribute().indexOf(id) && hitCount++ == whichInput) { break; } result = null; } return result; } protected String getText(String element) { return ((HtmlElement)lastpage.getHtmlElementById(element)).asText(); } /* Check that the text of the element is equal to the supplied string */ protected boolean check(String element, String expected) { return expected.equals(getText(element)); } protected void checkTrue(String element, String expected) { assertTrue(element+":- Expected '"+expected+"', but received '"+getText(element)+"'", check(element,expected)); } @Override protected void runTest() throws Throwable { String currentContainer = System.getProperty("container"); boolean doRunTest = true; if(currentContainer == null) { log.warning("Test exclusions not taken into account since no container property could be found"); } else if(exclusions != null) { Vector excludedTests = this.exclusions.get(Container.valueOf(currentContainer.toUpperCase().replaceAll("\\.", "_"))); if(null != excludedTests && !excludedTests.isEmpty() && excludedTests.contains(testName)) { log.log(Level.INFO, "Skipping execution of test ''{0}'' for container {1}", new Object[]{testName, currentContainer}); doRunTest = false; } } if (doRunTest) { super.runTest(); } } /** * Adds an exclusion for a particular test method in the TestCase * @param container the container for which the exclusion should be applied * @param testName the name of the test method to exclude */ protected void addExclusion(Container container, String testName) { if(exclusions == null) { exclusions = new HashMap>(); } Vector excluded = this.exclusions.get(container); if(excluded == null) { excluded = new Vector(); exclusions.put(container, excluded); } excluded.add(testName); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy