001: /***************************************************************
002: * This file is part of the [fleXive](R) project.
003: *
004: * Copyright (c) 1999-2008
005: * UCS - unique computing solutions gmbh (http://www.ucs.at)
006: * All rights reserved
007: *
008: * The [fleXive](R) project is free software; you can redistribute
009: * it and/or modify it under the terms of the GNU General Public
010: * License as published by the Free Software Foundation;
011: * either version 2 of the License, or (at your option) any
012: * later version.
013: *
014: * The GNU General Public License can be found at
015: * http://www.gnu.org/copyleft/gpl.html.
016: * A copy is found in the textfile GPL.txt and important notices to the
017: * license from the author are found in LICENSE.txt distributed with
018: * these libraries.
019: *
020: * This library is distributed in the hope that it will be useful,
021: * but WITHOUT ANY WARRANTY; without even the implied warranty of
022: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
023: * GNU General Public License for more details.
024: *
025: * For further information about UCS - unique computing solutions gmbh,
026: * please see the company website: http://www.ucs.at
027: *
028: * For further information about [fleXive](R), please see the
029: * project website: http://www.flexive.org
030: *
031: *
032: * This copyright notice MUST APPEAR in all copies of the file!
033: ***************************************************************/package com.flexive.tests.browser;
034:
035: import com.flexive.shared.FxSharedUtils;
036: import com.thoughtworks.selenium.HttpCommandProcessor;
037: import org.apache.commons.lang.StringUtils;
038: import org.apache.commons.logging.Log;
039: import org.apache.commons.logging.LogFactory;
040: import org.testng.annotations.AfterClass;
041: import org.testng.annotations.BeforeClass;
042: import org.testng.annotations.Test;
043:
044: import java.io.IOException;
045: import java.io.InputStream;
046: import java.util.Properties;
047:
048: /**
049: * Base class for selenium browser tests. Note that a selenium server must
050: * be started externally. The server address and port can be set with the
051: * properties
052: * <code>tests.browser.selenium.host</code> and
053: * <code>tests.browser.selenium.port</code> in the <code>browser.properties</code> file.
054: *
055: * @author Daniel Lichtenberger (daniel.lichtenberger@flexive.com), UCS - unique computing solutions gmbh (http://www.ucs.at)
056: * @version $Rev: 181 $
057: */
058: @Test(groups="browser")
059: public abstract class AbstractSeleniumTest {
060: private static final transient Log LOG = LogFactory
061: .getLog(AbstractSeleniumTest.class);
062:
063: /**
064: * Property for setting the selenium server port
065: */
066: public static final String PROP_PORT = "tests.browser.selenium.port";
067: /**
068: * Property for setting the selenium server host IP
069: */
070: public static final String PROP_HOST = "tests.browser.selenium.host";
071: /**
072: * The base URL for all tests
073: */
074: public static final String PROP_BASEURL = "tests.browser.selenium.baseUrl";
075:
076: protected String initialUrl;
077: protected final String configName;
078: protected final Properties defaultProperties;
079: protected FlexiveSelenium selenium;
080: protected HttpCommandProcessor commandProcessor;
081:
082: /**
083: * Create a browser test for the given initial URL.
084: *
085: * @param initialUrl The initial URL of the browser. All subsequent open(..) requests will be appended to this URL.
086: */
087: protected AbstractSeleniumTest(String initialUrl) {
088: this (initialUrl, null, null);
089: }
090:
091: /**
092: * Creates a browser test for the given URL and default properties.
093: *
094: * @param initialUrl The initial URL of the browser. All subsequent open(..) requests will be appended to this URL.
095: * @param defaultProperties Default properties to be used if browser.properties is not available.
096: */
097: protected AbstractSeleniumTest(String initialUrl,
098: Properties defaultProperties) {
099: this (initialUrl, null, defaultProperties);
100: }
101:
102: /**
103: * Creates a browser test for the given URL and the given properties file name.
104: *
105: * @param initialUrl The initial URL of the browser. All subsequent open(..) requests will be appended to this URL.
106: * If null, it has to be specified in the properties file specified in the next parameter.
107: * @param configName The properties file name to be used for configuring the run-time parameters (default: browser.properties).
108: */
109: protected AbstractSeleniumTest(String initialUrl, String configName) {
110: this (initialUrl, configName, null);
111: }
112:
113: private AbstractSeleniumTest(String initialUrl, String configName,
114: Properties defaultProperties) {
115: this .initialUrl = initialUrl;
116: this .configName = configName;
117: this .defaultProperties = defaultProperties;
118: }
119:
120: /**
121: * Selenium setup code. Override this method in your actual test class and don't forget
122: * to add the @BeforeClass annotation.
123: */
124: @BeforeClass
125: public void beforeClass() {
126: final Properties properties = new Properties(defaultProperties);
127: if (StringUtils.isNotBlank(configName)) {
128: try {
129: InputStream inStream = this .getClass().getClassLoader()
130: .getResourceAsStream(configName);
131: if (inStream == null) {
132: String msg = "Missing "
133: + configName
134: + " file in src/framework/tests/java/com/flexive/tests/browser - copy from provided sample";
135: LOG.error(msg);
136: throw new RuntimeException(msg);
137: }
138: properties.load(inStream);
139: } catch (IOException e) {
140: throw new RuntimeException(e);
141: }
142: }
143: if (this .initialUrl == null) {
144: this .initialUrl = (String) properties.get(PROP_BASEURL);
145: }
146: final int port = Integer.parseInt(properties.getProperty(
147: PROP_PORT, "80"));
148: final String host = properties.getProperty(PROP_HOST,
149: "localhost");
150: if (LOG.isInfoEnabled()) {
151: LOG.info("Connecting to Selenium Server at " + host + ":"
152: + port + "...");
153: LOG.info("Base URL: " + this .initialUrl);
154: }
155: commandProcessor = new HttpCommandProcessor(host, port,
156: "*firefox", initialUrl);
157: selenium = new FlexiveSelenium(commandProcessor);
158: selenium.start();
159: selenium.createCookie(FxSharedUtils.COOKIE_FORCE_TEST_DIVISION
160: + "=true", "path=/");
161: }
162:
163: /**
164: * Selenium shutdown code. Override this method in your actual test class and don't forget
165: * to add the @BeforeClass annotation.
166: */
167: @AfterClass
168: public void afterClass() {
169: selenium.stop();
170: }
171: }
|