package org.qooxdoo.demo.desktopunittests;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import org.oneandone.qxwebdriver.resources.JavaScript;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.qooxdoo.demo.Configuration;
import org.qooxdoo.demo.IntegrationTest;
public class DesktopUnitTests extends IntegrationTest {
public static String getTestSuiteState = "return qx.core.Init.getApplication().runner.getTestSuiteState();";
public static String getTestResults = "return JSON.stringify(qx.core.Init.getApplication().runner.view.getTestResults());";
public static List<String> testPackages;
protected Integer failCount = 0;
public static ExpectedCondition<Boolean> testSuiteStateIs(final String state) {
return new ExpectedCondition<Boolean>() {
@Override
public Boolean apply(WebDriver driver) {
String result = null;
try {
result = getSuiteState();
return result.equals(state);
} catch(org.openqa.selenium.WebDriverException e) {
System.err.println("Couldn't get test suite state: " + e.toString());
return false;
}
}
@Override
public String toString() {
return "Test suite state is '" + state + "'.";
}
};
}
public static String getSuiteState() {
String suiteState = (String) driver.jsExecutor.executeScript(getTestSuiteState);
return suiteState;
}
@BeforeClass
public static void setUpBeforeClass() throws Exception {
driver = Configuration.getQxWebDriver();
driver.get(System.getProperty("org.qooxdoo.demo.auturl"));
new WebDriverWait(driver, 30, 250).until(testSuiteStateIs("ready"));
String resPath = "/javascript/getTestPackages.js";
JavaScript.INSTANCE.addResource("getTestPackages", resPath);
// comma-separated list of test packages to be split up into sub-packages
String splitPackages = System.getProperty("org.qooxdoo.demo.unittests.packages.split", "");
// comma-separated list of test packages to skip
String skipPackages = System.getProperty("org.qooxdoo.demo.unittests.packages.skip", "");
testPackages = (List<String>) driver.jsRunner.runScript("getTestPackages", splitPackages, skipPackages);
System.out.println("Test packages: " + testPackages);
}
@Test
public void unitTests() {
long totalTime = 0;
Iterator<String> itr = testPackages.iterator();
while (itr.hasNext()) {
String nextPackage = itr.next();
Date packageStart = new Date();
runPackage(nextPackage);
Date packageEnd = new Date();
long diff = packageEnd.getTime() - packageStart.getTime();
totalTime = totalTime + diff;
long seconds = TimeUnit.MILLISECONDS.toSeconds(diff);
if (seconds == 1) {
System.out.println("Finished in " + diff + " ms.");
} else {
System.out.println("Finished in ~" + seconds + " s.");
}
getResults();
logAutExceptions();
}
long seconds = (totalTime / 1000) % 60;
long minutes = (totalTime / (1000 * 60)) % 60;
System.out.println("All test packages completed in " + minutes + "m " + seconds + "s.");
Assert.assertEquals(failCount + " test(s) failed.", Double.valueOf(0), Double.valueOf(failCount));
}
public void runPackage(String packageName) {
String packageUrl = System.getProperty("org.qooxdoo.demo.auturl") + "?testclass=" + packageName;
System.out.println("Executing test package " + packageName);
driver.get(packageUrl);
driver.registerGlobalErrorHandler();
new WebDriverWait(driver, 30, 250).until(testSuiteStateIs("ready"));
try {
WebElement runButton = driver.findElement(By.id("run"));
System.out.println("Clicking run button");
runButton.click();
} catch(NoSuchElementException e) {
System.out.println("Calling run()");
driver.executeScript("qx.core.Init.getApplication().runner.view.run()");
}
new WebDriverWait(driver, 600, 250).until(testSuiteStateIs("finished"));
}
public void getResults() {
System.out.println("Retrieving package results.");
String results = (String) driver.executeScript(getTestResults);
JSONParser parser = new JSONParser();
Object obj;
try {
obj = parser.parse(results);
JSONObject jsonEntry = (JSONObject) obj;
Set set = jsonEntry.keySet();
Iterator itr = set.iterator();
while (itr.hasNext()) {
String testName = (String) itr.next();
JSONObject testResult = (JSONObject) jsonEntry.get(testName);
String state = (String) testResult.get("state");
if (state.equals("error") || state.equals("failure")) {
failCount++;
System.err.println(state.toUpperCase() + " " + testName);
JSONArray messages = (JSONArray) testResult.get("messages");
Iterator<String> mItr = messages.iterator();
while (mItr.hasNext()) {
String message = mItr.next();
System.err.println(message);
}
System.err.println();
}
}
} catch (ParseException e) {
System.err.println("Unable to parse JSON test results " + results);
e.printStackTrace();
}
}
public void logAutExceptions() {
// Print AUT exceptions
List<String> caughtErrors = (List<String>) driver.getCaughtErrors();
Iterator<String> exItr = caughtErrors.iterator();
while (exItr.hasNext()) {
System.err.println(exItr.next());
}
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
driver.quit();
}
}