You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openmeetings.apache.org by se...@apache.org on 2013/09/21 08:50:10 UTC

svn commit: r1525199 - in /openmeetings/trunk/singlewebapp: ./ src/test/java/org/apache/openmeetings/test/selenium/ src/test/java/org/apache/openmeetings/test/web/

Author: sebawagner
Date: Sat Sep 21 06:50:09 2013
New Revision: 1525199

URL: http://svn.apache.org/r1525199
Log:
OPENMEETINGS-792 Some basic preparation to write tests

Added:
    openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/TestSeleniumSmokeTest.java
      - copied, changed from r1523184, openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/OpenMeetingsSmokeTest.java
    openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/web/LoginUI.java
Removed:
    openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/OpenMeetingsSmokeTest.java
    openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/web/TestLoginUI.java
Modified:
    openmeetings/trunk/singlewebapp/build.xml
    openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/SeleniumUtils.java

Modified: openmeetings/trunk/singlewebapp/build.xml
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/build.xml?rev=1525199&r1=1525198&r2=1525199&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/build.xml (original)
+++ openmeetings/trunk/singlewebapp/build.xml Sat Sep 21 06:50:09 2013
@@ -60,6 +60,10 @@
 
 	<!-- screenshare.out.dir -->
 	<property name="screenshare.out.dir" value="${dist.webapps.dir}/screensharing" />
+	
+	<condition property="junit.run.selenium" value="true" else="false">
+		<isset property="selenium" />
+	</condition>
 
 	<property name="main.out.dir" value="${build.base.dir}/classes/openmeetings" />
 
@@ -736,6 +740,117 @@
 			</fileset>
 		</copy>
 	</target>
+	
+	<!-- 
+		Prepare selenium tests by starting up an OpenMeetings instance
+		
+		makes a stop command before starting up to make sure no other is running
+	 -->
+	
+	<target name="prepare-selenium-start-openmeetings" description="Prepare selenium tests by starting up an OpenMeetings instance" 
+		depends="prepare-selenium-stop-openmeetings, -prepare-selenium-port-properties" >
+		<exec dir="${dist.dir}/testred5" executable="red5-highperf.bat" osfamily="windows" output="${dist.dir}/testred5/red5_system.log">
+		</exec>
+		<!--this does only make sense if the unix executable is run obviously, however we do it for all -->
+		<chmod dir="${dist.dir}/testred5" perm="755" includes="**/*.sh" />
+		<exec dir="${dist.dir}/testred5" executable="/bin/bash" osfamily="unix" output="${dist.dir}/testred5/red5_system.log">
+			<arg value="red5-highperf.sh"/> 
+		</exec>
+		<!-- start up does take some time -->
+		<sleep seconds="30" />
+	</target>
+	
+	<target name="prepare-selenium-stop-openmeetings" description="Prepare selenium tests by starting up an OpenMeetings instance" >
+		<exec dir="${dist.dir}/testred5" executable="red5-shutdown.bat" osfamily="windows" output="${dist.dir}/testred5/red5_system.log">
+		</exec>
+		<!--this does only make sense if executed on unix(Linux or OSX are both unix style) is run obviously, 
+			however we do it for all for now -->
+		<chmod dir="${dist.dir}/testred5" perm="755" includes="**/*.sh" />
+		<exec dir="${dist.dir}/testred5" executable="/bin/bash" osfamily="unix" output="${dist.dir}/testred5/red5_system.log">
+			<arg value="red5-shutdown.sh"/> 
+		</exec>
+		<!-- stop up does take a bit of time -->
+		<sleep seconds="10" />
+	</target>
+	
+	<target name="-prepare-selenium-copy-test-instance" description="Prepare selenium tests by starting up an OpenMeetings instance">
+		<copy todir="${dist.dir}/testred5">
+			<fileset dir="${dist.dir}/red5">
+			</fileset>
+		</copy>
+	</target>
+	
+	<target name="-prepare-selenium-port-properties" description="Set the http port to some exotic numbers so that we don't conflict with anything" 
+			depends="-prepare-selenium-copy-test-instance">
+		<replace dir="${dist.dir}/testred5/conf" value="http.port=20080">
+		  <include name="**/red5.properties"/>
+		  <replacetoken>http.port=5080</replacetoken>
+		</replace>
+		<replace dir="${dist.dir}/testred5/conf" value="https.port=20443">
+		  <include name="**/red5.properties"/>
+		  <replacetoken>https.port=5443</replacetoken>
+		</replace>
+		<replace dir="${dist.dir}/testred5/conf" value="rtmp.port=20935">
+		  <include name="**/red5.properties"/>
+		  <replacetoken>rtmp.port=1935</replacetoken>
+		</replace>
+		<replace dir="${dist.dir}/testred5/conf" value="rtmps.port=20443">
+		  <include name="**/red5.properties"/>
+		  <replacetoken>rtmps.port=8443</replacetoken>
+		</replace>
+		<replace dir="${dist.dir}/testred5/conf" value="rtmpt.port=20088">
+		  <include name="**/red5.properties"/>
+		  <replacetoken>rtmpt.port=8088</replacetoken>
+		</replace>
+	</target>
+	
+	<target name="run-selenium" depends="-dist-test-no-clean, -run-selenium-junit">
+	</target>
+	
+	<target name="-run-selenium" if="${junit.run.selenium}" >
+		<antcall target="-run-selenium-junit"></antcall>
+	</target>
+	
+	<target name="-run-selenium-junit" depends="prepare-selenium-start-openmeetings" 
+			description="Will run all selenium tests unless -Dtestcases=_file_name_pattern_ will be passed">
+		<taskdef resource="net/sf/antcontrib/antlib.xml">
+			<classpath refid="junit.classpath" />
+		</taskdef>
+		<mkdir dir="${junit.report.dir}" />
+		
+		<junit maxmemory="1024m" printsummary="yes" dir="${junit.base.dir}" tempdir="${junit.base.dir}" fork="yes" 
+			forkmode="perBatch" failureproperty="junit.failed" errorproperty="junit.error">
+			<classpath refid="junit.classpath" />
+			<jvmarg value="-Dom.home=${basedir}/${om.dist.webapp}" />
+			<jvmarg value="-Dlanguages.home=${webapp.dir}/languages" />
+			<jvmarg value="-Dred5.root=${red5.root}" />
+			<jvmarg value="-Dbasedir=${basedir}" />
+			<jvmarg value="-Dred5.config_root=${red5.root}/conf" />
+			<jvmarg value="-Dbackups.dir=${junit.backups.dir}" />
+			<formatter type="${junit.test.formatter}" />
+			<batchtest todir="${junit.report.dir}">
+				<fileset dir="${main.out.dir}">
+					<include name="org/apache/openmeetings/test/selenium/${junit.test.pattern}.class" />
+					<exclude name="**/*$$*.class" />
+				</fileset>
+			</batchtest>
+		</junit>
+		
+		<junitreport todir="${junit.report.dir}">
+			<fileset dir="${junit.report.dir}">
+				<include name="TEST-*.xml" />
+			</fileset>
+			<report todir="${junit.report.dir}" />
+		</junitreport>
+		<fail message="Errors/failures in JUnit tests.">
+			<condition>
+				<or>
+					<isset property="junit.failed"/>
+					<isset property="junit.error"/>
+				</or>
+			</condition>
+		</fail>
+	</target>
 
 	<!-- Unit Tests -->
 	<property name="om.dist.webapp" value="${red5.root}/webapps/${project.distname}" />
@@ -743,7 +858,7 @@
 	<condition property="junit.test.pattern" value="${testcases}" else="Test*">
 		<isset property="testcases" />
 	</condition>
-
+	
 	<condition property="junit.test.formatter" value="${test.formatter}" else="xml">
 		<isset property="test.formatter" />
 	</condition>
@@ -761,7 +876,10 @@
 		<pathelement path="${dist.classes.dir}" />
 		<pathelement path="${main.out.dir}" />
 	</path>
-	<target name="test" depends="-dist-test-no-clean" description="Will run all tests unless -Dtestcases=_file_name_pattern_ will be passed">
+	
+	
+	<target name="test" depends="-dist-test-no-clean, -run-selenium" 
+			description="Will run all tests except selenium unless -Dtestcases=_file_name_pattern_ will be passed">
 		<taskdef resource="net/sf/antcontrib/antlib.xml">
 			<classpath refid="junit.classpath" />
 		</taskdef>
@@ -794,10 +912,12 @@
 			<batchtest todir="${junit.report.dir}">
 				<fileset dir="${main.out.dir}">
 					<include name="org/apache/openmeetings/test/**/${junit.test.pattern}.class" />
+					<exclude name="org/apache/openmeetings/test/selenium/${junit.test.pattern}.class" />
 					<exclude name="**/*$$*.class" />
 				</fileset>
 			</batchtest>
 		</junit>
+		
 		<junitreport todir="${junit.report.dir}">
 			<fileset dir="${junit.report.dir}">
 				<include name="TEST-*.xml" />

Modified: openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/SeleniumUtils.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/SeleniumUtils.java?rev=1525199&r1=1525198&r2=1525199&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/SeleniumUtils.java (original)
+++ openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/SeleniumUtils.java Sat Sep 21 06:50:09 2013
@@ -18,9 +18,16 @@
  */
 package org.apache.openmeetings.test.selenium;
 
+import java.io.File;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 
+import org.apache.commons.io.FileUtils;
 import org.openqa.selenium.By;
+import org.openqa.selenium.OutputType;
+import org.openqa.selenium.TakesScreenshot;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 
@@ -31,14 +38,30 @@ public class SeleniumUtils {
 	// we need to sleep to make sure Ajax could complete whatever it does
 	static long defaultSleepInterval = 1000;
 
-	public static void inputText(WebDriver driver, String search, String inputText) throws Exception {
-		WebElement element = SeleniumUtils.findElement(driver, search);
+	public static void inputText(WebDriver driver, String search,
+			String inputText) throws Exception {
+		WebElement element = SeleniumUtils.findElement(driver, search, true);
 
 		// Would make send to check if this element is really an input text
 		element.sendKeys(inputText);
 	}
 
-	public static WebElement findElement(WebDriver driver, String search) throws Exception {
+	public static void click(WebDriver driver, String search) throws Exception {
+		WebElement element = SeleniumUtils.findElement(driver, search, true);
+		element.click();
+	}
+
+	/**
+	 * 
+	 * @param driver
+	 * @param search
+	 * @param throwException
+	 *            under some circumstance you do't want to exit the test here
+	 * @return
+	 * @throws Exception
+	 */
+	public static WebElement findElement(WebDriver driver, String search,
+			boolean throwException) throws Exception {
 		for (int i = 0; i < numberOfRetries; i++) {
 			WebElement element = _findElement(driver, search);
 			if (element != null) {
@@ -48,11 +71,22 @@ public class SeleniumUtils {
 			Thread.sleep(defaultSleepInterval);
 		}
 
-		throw new Exception("Could not find element with specified path " + search);
+		if (throwException) {
+			throw new Exception("Could not find element with specified path "
+					+ search);
+		}
+
+		return null;
 	}
 
 	private static By[] _getSearchArray(String search) {
-		return new By[] { By.id(search), By.name(search), By.className(search), By.tagName(search), By.xpath(search) };
+		//If xpath we have to use it, if xpath is used with By.className(...) there will be an exception
+		if (search.startsWith("//")) {
+			return new By[] { By.xpath(search) };
+		} else {
+			return new By[] { By.id(search), By.name(search), By.className(search),
+					By.tagName(search), By.xpath(search) };
+		}
 	}
 
 	private static WebElement _findElement(WebDriver driver, String search) {
@@ -69,7 +103,8 @@ public class SeleniumUtils {
 		return null;
 	}
 
-	public static void elementExists(WebDriver driver, String search, boolean shouldExist) throws Exception {
+	public static void elementExists(WebDriver driver, String search,
+			boolean shouldExist) throws Exception {
 		Thread.sleep(defaultSleepInterval);
 
 		boolean doesExist = !shouldExist;
@@ -105,4 +140,43 @@ public class SeleniumUtils {
 		}
 		return false;
 	}
-}
+
+	public static void makeScreenShot(String testName, Exception e,
+			WebDriver driver) {
+		try {
+			DateFormat df = new SimpleDateFormat("MM-dd-yyyy_HH-mm-ss");
+			String fileName = e.getMessage().replace(" ", "_");
+			fileName = fileName.replaceAll("(\r\n|\n)", "");
+			fileName = fileName.replaceAll("/", "");
+
+			if (fileName.length() > 100) {
+				fileName = fileName.substring(0, 100);
+			}
+
+			fileName = fileName + "_" + df.format(new Date()) + ".png";
+			File screenShotFile = ((TakesScreenshot) driver)
+					.getScreenshotAs(OutputType.FILE);
+
+			String path = "." + File.separatorChar + "build"
+					+ File.separatorChar + "screenshots" + File.separatorChar
+					+ testName;
+
+			File screenshotFolder = new File(path);
+			if (!screenshotFolder.exists()) {
+				screenshotFolder.mkdirs();
+			}
+
+			System.out.println("screenshot copy from: "
+					+ screenShotFile.getAbsolutePath());
+			System.out.println("Length Filename: " + fileName.length()
+					+ " - Writing screenshot to: " + path + File.separatorChar
+					+ fileName);
+
+			FileUtils.moveFile(screenShotFile, new File(path
+					+ File.separatorChar + fileName));
+		} catch (Exception err) {
+			err.printStackTrace();
+		}
+
+	}
+}
\ No newline at end of file

Copied: openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/TestSeleniumSmokeTest.java (from r1523184, openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/OpenMeetingsSmokeTest.java)
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/TestSeleniumSmokeTest.java?p2=openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/TestSeleniumSmokeTest.java&p1=openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/OpenMeetingsSmokeTest.java&r1=1523184&r2=1525199&rev=1525199&view=diff
==============================================================================
--- openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/OpenMeetingsSmokeTest.java (original)
+++ openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/selenium/TestSeleniumSmokeTest.java Sat Sep 21 06:50:09 2013
@@ -18,38 +18,126 @@
  */
 package org.apache.openmeetings.test.selenium;
 
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.openqa.selenium.JavascriptExecutor;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.WebElement;
 import org.openqa.selenium.firefox.FirefoxDriver;
 
-public class OpenMeetingsSmokeTest {
+public class TestSeleniumSmokeTest {
 
-	public static String BASE_URL = "http://localhost:5080/openmeetings";
+	public static String BASE_URL = "http://localhost:20080/openmeetings";
 	public static String username = "swagner";
 	public static String userpass = "qweqwe";
+	private static final String orgname = "seleniumtest";
+	private static final String email = "selenium@openmeetings.apache.org";
 
-	public static void main(String[] args) {
-		try {
+	public WebDriver driver = null;
 
-			WebDriver driver = new FirefoxDriver();
+	// setting this to false can be handy if you run the test from inside
+	// Eclipse, the browser will not shut down after the test so you can start
+	// to diagnose the test issue
+	public boolean doTearDownAfterTest = false;
+
+	@Before
+	public void setUp() {
+		driver = new FirefoxDriver();
+	}
 
+	@Test
+	public void smokeTest() throws Exception {
+		try {
 			driver.get(BASE_URL);
 			
+			testWebSite();
+			
 			SeleniumUtils.inputText(driver, "login", username);
 			SeleniumUtils.inputText(driver, "pass", userpass);
-			
+
 			WebElement signInButton = SeleniumUtils.findElement(driver,
-					"//button[span[contains(text(), 'Sign in')]]");
+					"//button[span[contains(text(), 'Sign in')]]", true);
 			signInButton.click();
-			
-			SeleniumUtils.elementExists(driver, "//h3[contains(text(), 'Help and support')]", true);
-			
-			
 
+			SeleniumUtils.elementExists(driver,
+					"//h3[contains(text(), 'Help and support')]", true);
 		} catch (Exception e) {
-			e.printStackTrace();
+			SeleniumUtils.makeScreenShot(this.getClass().getSimpleName(), e,
+					driver);
+			throw e;
+		}
+	}
+
+	private void testWebSite() throws Exception {
+		
+		WebElement wicketExtensionsWizardHeaderTitle = SeleniumUtils.findElement(driver,
+				"wicketExtensionsWizardHeaderTitle", false);
+		if (wicketExtensionsWizardHeaderTitle == null) {
+			return;
 		}
+		if (wicketExtensionsWizardHeaderTitle.getText().contains("Installation")) {
+			System.out.println("Do Installation");
+			doInstallation();
+		}
+		
+	}
+	
+	private void doInstallation() throws Exception {
+		Thread.sleep(3000L);
+		
+		WebElement buttons_next = SeleniumUtils.findElement(driver, "buttons:next", true);
+		
+		((JavascriptExecutor) driver).executeScript("arguments[0].click();", buttons_next);
+		
+		Thread.sleep(1000L);
+		
+		SeleniumUtils.inputText(driver, "view:cfg.username", username);
+		SeleniumUtils.inputText(driver, "view:cfg.password", userpass);
+		SeleniumUtils.inputText(driver, "view:cfg.email", email);
+		SeleniumUtils.inputText(driver, "view:cfg.group", orgname);
+		
+		buttons_next = SeleniumUtils.findElement(driver, "buttons:next", true);
+		
+		((JavascriptExecutor) driver).executeScript("arguments[0].click();", buttons_next);
+		
+		Thread.sleep(1000L);
+		
+		buttons_next = SeleniumUtils.findElement(driver, "buttons:next", true);
+		
+		((JavascriptExecutor) driver).executeScript("arguments[0].click();", buttons_next);
+		
+		Thread.sleep(1000L);
+		
+		buttons_next = SeleniumUtils.findElement(driver, "buttons:next", true);
+		
+		((JavascriptExecutor) driver).executeScript("arguments[0].click();", buttons_next);
+		
+		Thread.sleep(1000L);
+		
+		buttons_next = SeleniumUtils.findElement(driver, "buttons:next", true);
+		
+		((JavascriptExecutor) driver).executeScript("arguments[0].click();", buttons_next);
+		
+		Thread.sleep(1000L);
+		
+		WebElement buttons_finish = SeleniumUtils.findElement(driver, "buttons:finish", true);
+		
+		((JavascriptExecutor) driver).executeScript("arguments[0].click();", buttons_finish);
+		
+		//Installation takes a while
+		Thread.sleep(30000L);
+		
+		//the ajax loading thing does not work, just goto the main page
+		driver.get(BASE_URL);
+	}
 
+	@After
+	public void tearDown() throws Exception {
+		if (doTearDownAfterTest) {
+			driver.close();
+			driver.quit();
+		}
 	}
 
 }

Added: openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/web/LoginUI.java
URL: http://svn.apache.org/viewvc/openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/web/LoginUI.java?rev=1525199&view=auto
==============================================================================
--- openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/web/LoginUI.java (added)
+++ openmeetings/trunk/singlewebapp/src/test/java/org/apache/openmeetings/test/web/LoginUI.java Sat Sep 21 06:50:09 2013
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache 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.apache.org/licenses/LICENSE-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.apache.openmeetings.test.web;
+
+import org.apache.openmeetings.test.AbstractWicketTester;
+import org.apache.openmeetings.web.pages.MainPage;
+import org.apache.openmeetings.web.pages.auth.SignInPage;
+import org.apache.wicket.util.tester.FormTester;
+
+public class LoginUI extends AbstractWicketTester {
+
+        //@Test Needs to much memory to start this test, and there is nothing useful here inside other then some basic
+        //proof of concept (basically the concept failed)
+	public void testLoginUi() {
+		
+		tester.startPage(MainPage.class);
+		
+		tester.assertRenderedPage(SignInPage.class);
+		
+		FormTester formTester = tester.newFormTester("signin:signin");
+		formTester.setValue("login", username);
+		formTester.setValue("pass", userpass);
+		
+		//How to reference specific buttons in Wicket jQuery UI ?!
+		
+		formTester.submit();
+		
+		System.err.println("getLastRenderedPage: "+ tester.getLastRenderedPage().getMarkup().toString());
+		
+		//will fail
+		//tester.assertComponent("dashboard", DashboardPanel.class);
+		
+	}
+	
+}
+