/*
* Copyright 2013-present Facebook, 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.facebook.buck.test;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import com.facebook.buck.testutil.integration.TemporaryPaths;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import org.junit.Rule;
import org.junit.Test;
public class XmlTestResultParserTest {
@Rule public TemporaryPaths tmp = new TemporaryPaths();
@Test
public void testParseMalformedXml() throws IOException {
String xml =
"<?xml version='1.1' encoding='UTF-8' standalone='no'?>\n"
+ "<testcase name='com.facebook.buck.test.XmlTestResultParserTest'>\n"
+ " <test name='testParseMalformedXml' success='true' time='too meta'/>\n"
+ "</testcase>\n";
Path xmlFile = tmp.newFile("result.xml");
Files.write(xmlFile, xml.getBytes(UTF_8));
try {
XmlTestResultParser.parse(xmlFile);
fail("Should throw RuntimeException.");
} catch (RuntimeException e) {
assertTrue(
"The RuntimeException should wrap the NumberFormatException.",
e.getCause() instanceof NumberFormatException);
assertEquals(
"Exception should include the path to the file as well as its contents.",
"Error parsing test result data in "
+ xmlFile.toAbsolutePath()
+ ".\n"
+ "File contents:\n"
+ xml,
e.getMessage());
}
}
@Test
public void testParsingAndroidSeparatesClassesInResults() throws Throwable {
String xml =
"<?xml version='1.1' encoding='UTF-8' standalone='no'?>\n"
+ "<testsuite name='com.facebook.foo.bar'>\n"
+ " <testcase name='a' classname='Bar' time='0.0'/>\n"
+ " <testcase name='b' classname='Bar' time='1.2'/>\n"
+ " <testcase name='c' classname='Foo' time='3.2'/>\n"
+ "</testsuite>\n";
Path xmlFile = tmp.newFile("result.xml");
Files.write(xmlFile, xml.getBytes(UTF_8));
List<TestCaseSummary> summary = XmlTestResultParser.parseAndroid(xmlFile, "android-5554");
assertEquals(2, summary.size());
assertEquals("Bar (android-5554)", summary.get(0).getTestCaseName());
assertEquals("Foo (android-5554)", summary.get(1).getTestCaseName());
assertEquals(2, summary.get(0).getTestResults().size());
assertEquals(1, summary.get(1).getTestResults().size());
}
@Test
public void testParsesMessageFromFailure() throws Throwable {
String xml =
"<?xml version='1.1' encoding='UTF-8' standalone='no'?>\n"
+ "<testsuite name='com.facebook.foo.bar'>\n"
+ " <testcase name='a' classname='Bar' time='0.0'>\n"
+ " <failure>com.foo: Error Message\nblehbleh\n</failure>\n"
+ " </testcase>\n"
+ "</testsuite>\n";
Path xmlFile = tmp.newFile("result.xml");
Files.write(xmlFile, xml.getBytes(UTF_8));
List<TestCaseSummary> summary = XmlTestResultParser.parseAndroid(xmlFile, "android-5554");
assertEquals("Error Message", summary.get(0).getTestResults().get(0).getMessage());
}
@Test
public void testParsesEmptyMessageFromFailure() throws Throwable {
String xml =
"<?xml version='1.1' encoding='UTF-8' standalone='no'?>\n"
+ "<testsuite name='com.facebook.foo.bar'>\n"
+ " <testcase name='a' classname='Bar' time='0.0'>\n"
+ " <failure>com.foo\nblehbleh\n</failure>\n"
+ " </testcase>\n"
+ "</testsuite>\n";
Path xmlFile = tmp.newFile("result.xml");
Files.write(xmlFile, xml.getBytes(UTF_8));
List<TestCaseSummary> summary = XmlTestResultParser.parseAndroid(xmlFile, "android-5554");
assertEquals("", summary.get(0).getTestResults().get(0).getMessage());
}
@Test
public void testColonInMEssage() throws Throwable {
String xml =
"<?xml version='1.1' encoding='UTF-8' standalone='no'?>\n"
+ "<testsuite name='com.facebook.foo.bar'>\n"
+ " <testcase name='a' classname='Bar' time='0.0'>\n"
+ " <failure>com.foo: Error: Message\nblehbleh\n</failure>\n"
+ " </testcase>\n"
+ "</testsuite>\n";
Path xmlFile = tmp.newFile("result.xml");
Files.write(xmlFile, xml.getBytes(UTF_8));
List<TestCaseSummary> summary = XmlTestResultParser.parseAndroid(xmlFile, "android-5554");
assertEquals("Error: Message", summary.get(0).getTestResults().get(0).getMessage());
}
@Test
public void testThrowsIfTheresAFailureNodeOnTestSuite() throws Throwable {
String xml =
"<?xml version='1.1' encoding='UTF-8' standalone='no'?>\n"
+ "<testsuite name='com.facebook.foo.bar'>\n"
+ " <testcase name='a' classname='Bar' time='0.0' />\n"
+ " <failure>Instrumentation failed with RuntimeException</failure>\n"
+ "</testsuite>\n";
Path xmlFile = tmp.newFile("result.xml");
Files.write(xmlFile, xml.getBytes(UTF_8));
try {
XmlTestResultParser.parseAndroid(xmlFile, "android-5554");
fail("expected exception");
} catch (TestProcessCrashed e) {
assertThat(e.getMessage(), containsString("Instrumentation failed with RuntimeException"));
}
}
}