/*
* Copyright 2009 Google Inc.
*
* Licensed 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 com.google.jstestdriver.output;
import static com.google.jstestdriver.TestResult.Result.error;
import static com.google.jstestdriver.TestResult.Result.failed;
import static com.google.jstestdriver.TestResult.Result.passed;
import static java.util.Arrays.asList;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import junit.framework.TestCase;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import com.google.jstestdriver.BrowserInfo;
import com.google.jstestdriver.TestResult;
/**
* @author alexeagle@google.com (Alex Eagle)
*/
public class TestXmlSerializerTest extends TestCase {
StringWriter writer = new StringWriter();
TestXmlSerializer serializer = new TestXmlSerializer(writer);
BrowserInfo firefox = makeBrowser("Firefox", "Linux", "2.5", 1);
String stdout = "Some standard out\n logging";
TestResult firefoxPassed1 =
new TestResult(firefox, passed.toString(), "great", stdout, "testCase1", "test1", 1.0f);
TestResult firefoxPassed2 =
new TestResult(firefox, passed.toString(), "pretty good", "',.p", "testCase1", "test2", 2.0f);
TestResult firefoxFailed1 =
new TestResult(firefox, failed.toString(), "oh noes", "aoeu", "testCase1", "test3", 3.0f);
String message = "crash, burn\nDied horribly";
TestResult firefoxError1 =
new TestResult(firefox, error.toString(), message, ";qjk", "testCase1", "test4", 4.0f);
XPath xPath = XPathFactory.newInstance().newXPath();
public void testTestSuiteIsRootNode() throws Exception {
serializer.writeTestCase("myTestCase", asList(firefoxPassed1));
Document doc = parse();
int testSuiteCount = queryInt(doc, "count(//testsuite)");
assertEquals(1, testSuiteCount);
}
// example: <testsuite errors="0" failures="0" hostname="alexeagle.mtv.corp.google.com" name="com.google.jstestdriver.ConfigurationParserTest" tests="9" time="0.232" timestamp="2009-10-29T21:21:16">
public void testTestSuiteHasAttributesFilledIn() throws Exception {
firefoxFailed1.setStack("a stack trace");
serializer.writeTestCase("myTestCase",
asList(firefoxPassed1, firefoxError1, firefoxFailed1, firefoxPassed2));
Document doc = parse();
String name = queryString(doc, "/testsuite/@name");
int errorCount = queryInt(doc, "/testsuite/@errors");
int failureCount = queryInt(doc, "/testsuite/@failures");
int testCount = queryInt(doc, "/testsuite/@tests");
float time = queryFloat(doc, "/testsuite/@time");
assertEquals("myTestCase", name);
assertEquals(1, errorCount);
assertEquals(1, failureCount);
assertEquals(4, testCount);
assertEquals((1 + 2 + 3 + 4) / 1000f, time, 0.0001);
}
// example: <testcase classname="com.google.jstestdriver.ConfigurationParserTest" name="testParseConfigFileAndHaveListOfFiles" time="0.12" />
public void testTestCaseHasAttributesFilledIn() throws Exception {
serializer.writeTestCase("myTestCase", asList(firefoxPassed1));
Document doc = parse();
String name = queryString(doc, "/testsuite/testcase/@name");
String classname = queryString(doc, "/testsuite/testcase/@classname");
float time = queryFloat(doc, "/testsuite/testcase/@time");
assertEquals("test1", name);
assertEquals("myTestCase", classname);
assertEquals(1 / 1000f, time, 0.0001);
}
// example: <error type="java.lang.NullPointerException">java.lang.NullPointerException
// at com.google.jstestdriver.output.PrintXmlTestResultsAction.run(PrintXmlTestResultsAction.java:18)
// at com.google.jstestdriver.ActionRunner.runActions(ActionRunner.java:45)
// at com.google.jstestdriver.IDEPluginActionBuilderTest.testExample(IDEPluginActionBuilderTest.java:75)
//</error>
public void testTestErrorAppearsAsChildOfTestCase() throws Exception {
serializer.writeTestCase("myTestCase", asList(firefoxError1));
Document doc = parse();
int errorTagCount = queryInt(doc, "count(/testsuite/testcase/error)");
assertEquals(1, errorTagCount);
String type = queryString(doc, "/testsuite/testcase/error/@type");
String body = queryString(doc, "/testsuite/testcase/error");
assertEquals("error", type);
assertEquals(message, body);
}
// example: <failure message="suck" type="junit.framework.AssertionFailedError">junit.framework.AssertionFailedError: suck
// at com.google.jstestdriver.ActionRunnerTest.testCreateCommandQueueFromFlags(ActionRunnerTest.java:42)
//</failure>
public void testTestFailureAppearsAsChildOfTestCase() throws Exception {
firefoxFailed1.setStack("a\nstack\ntrace");
serializer.writeTestCase("myTestCase", asList(firefoxFailed1));
Document doc = parse();
int errorTagCount = queryInt(doc, "count(/testsuite/testcase/failure)");
assertEquals(1, errorTagCount);
String type = queryString(doc, "/testsuite/testcase/failure/@type");
String message = queryString(doc, "/testsuite/testcase/failure/@message");
String body = queryString(doc, "/testsuite/testcase/failure");
assertEquals("failed", type);
assertEquals("oh noes", message);
assertEquals("a\nstack\ntrace", body);
}
// example: <system-out><![CDATA[EMMA: collecting runtime coverage data ...
//]]></system-out>
public void testStandardOutputAppears() throws Exception {
serializer.writeTestCase("myTestCase", asList(firefoxPassed1));
Document doc = parse();
int stdoutTagCount = queryInt(doc, "count(/testsuite/system-out)");
assertEquals(1, stdoutTagCount);
String body = queryString(doc, "/testsuite/system-out");
assertEquals(stdout, body);
}
// example: <system-err><![CDATA[]]></system-err>
public void testStandardErrorAppears() throws Exception {
serializer.writeTestCase("myTestCase", asList(firefoxPassed1));
Document doc = parse();
int stderrTagCount = queryInt(doc, "count(/testsuite/system-err)");
assertEquals(0, stderrTagCount);
}
private BrowserInfo makeBrowser(String name, String os, String version, long id) {
BrowserInfo info = new BrowserInfo();
info.setName(name);
info.setOs(os);
info.setVersion(version);
info.setId(id);
return info;
}
private String queryString(Document doc, String expression) throws XPathExpressionException {
return (String) xPath.compile(expression).evaluate(doc, XPathConstants.STRING);
}
private float queryFloat(Document doc, String expression) throws XPathExpressionException {
return ((Double) xPath.compile(expression).evaluate(doc, XPathConstants.NUMBER)).floatValue();
}
private int queryInt(Document doc, String expression) throws XPathExpressionException {
return ((Double) xPath.compile(expression).evaluate(doc, XPathConstants.NUMBER)).intValue();
}
private Document parse() throws ParserConfigurationException, IOException {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setValidating(false);
DocumentBuilder parser = factory.newDocumentBuilder();
try {
return parser.parse(new InputSource(new StringReader(writer.getBuffer().toString())));
} catch (SAXException e) {
fail("Couldn't parse " + writer.getBuffer().toString() + ": " + e.getMessage());
return null;
}
}
}