From 2f285fd96aaf064e7040b20e51297c9b75c8f501 Mon Sep 17 00:00:00 2001 From: Andrew Lu Date: Fri, 5 Apr 2024 02:01:40 +0000 Subject: [PATCH] 8323994: gtest runner repeats test name for every single gtest assertion 8158048: Fix failure message from jtreg gtest wrapper 8263659: Reflow GTestResultParser for better readability Reviewed-by: lucy Backport-of: 1aae980c549741cf5fc5ca51f3c299285bafa49d --- .../jtreg/gtest/GTestResultParser.java | 81 +++++++++++++++++++ test/hotspot/jtreg/gtest/GTestWrapper.java | 56 ++++++++----- 2 files changed, 118 insertions(+), 19 deletions(-) create mode 100644 test/hotspot/jtreg/gtest/GTestResultParser.java diff --git a/test/hotspot/jtreg/gtest/GTestResultParser.java b/test/hotspot/jtreg/gtest/GTestResultParser.java new file mode 100644 index 00000000000..ffa98bf29f2 --- /dev/null +++ b/test/hotspot/jtreg/gtest/GTestResultParser.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import javax.xml.XMLConstants; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamConstants; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; +import java.io.IOException; +import java.io.Reader; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class GTestResultParser { + private final List _failedTests; + + public GTestResultParser(Path file) { + List failedTests = new ArrayList<>(); + try (Reader r = Files.newBufferedReader(file)) { + XMLInputFactory factory = XMLInputFactory.newInstance(); + factory.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + factory.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); + XMLStreamReader xmlReader = factory.createXMLStreamReader(r); + String testSuite = null; + String testCase = null; + while (xmlReader.hasNext()) { + int code = xmlReader.next(); + if (code == XMLStreamConstants.START_ELEMENT) { + switch (xmlReader.getLocalName()) { + case "testsuite": + testSuite = xmlReader.getAttributeValue("", "name"); + break; + case "testcase": + testCase = xmlReader.getAttributeValue("", "name"); + break; + case "failure": + String failedStr = testSuite + "::" + testCase; + if (!failedTests.contains(failedStr)) { + failedTests.add(failedStr); + } + break; + default: + // ignore + } + } + } + } catch (XMLStreamException e) { + throw new IllegalArgumentException("can't open parse xml " + file, e); + } catch (IOException e) { + throw new IllegalArgumentException("can't open result file " + file, e); + } + _failedTests = Collections.unmodifiableList(failedTests); + } + + public List failedTests() { + return _failedTests; + } +} diff --git a/test/hotspot/jtreg/gtest/GTestWrapper.java b/test/hotspot/jtreg/gtest/GTestWrapper.java index 08ee033a60b..4f9a775f020 100644 --- a/test/hotspot/jtreg/gtest/GTestWrapper.java +++ b/test/hotspot/jtreg/gtest/GTestWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,24 +25,22 @@ * @summary a jtreg wrapper for gtest tests * @library /test/lib * @modules java.base/jdk.internal.misc + * java.xml * @requires vm.flagless * @run main/native GTestWrapper */ -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Stream; -import java.util.stream.Collectors; - -import java.io.File; -import java.nio.file.Paths; -import java.nio.file.Path; - import jdk.test.lib.Platform; import jdk.test.lib.Utils; import jdk.test.lib.process.ProcessTools; -import jdk.test.lib.process.OutputAnalyzer; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Collections; +import java.util.List; +import java.util.Map; public class GTestWrapper { public static void main(String[] args) throws Throwable { @@ -77,13 +75,33 @@ public static void main(String[] args) throws Throwable { env.put(pathVar, path + File.pathSeparator + ldLibraryPath); } - pb.command(new String[] { - execPath.toString(), - "-jdk", - System.getProperty("test.jdk"), - "--gtest_catch_exceptions=0" - }); - ProcessTools.executeCommand(pb).shouldHaveExitValue(0); + Path resultFile = Paths.get("test_result.xml"); + pb.command(execPath.toAbsolutePath().toString(), + "-jdk", Utils.TEST_JDK, + "--gtest_output=xml:" + resultFile); + int exitCode = ProcessTools.executeCommand(pb).getExitValue(); + if (exitCode != 0) { + List failedTests = failedTests(resultFile); + String message = "gtest execution failed; exit code = " + exitCode + "."; + if (!failedTests.isEmpty()) { + message += " the failed tests: " + failedTests; + } + throw new AssertionError(message); + } + } + + private static List failedTests(Path xml) { + if (!Files.exists(xml)) { + System.err.println("WARNING: test result file (" + xml + ") hasn't been found"); + } + + try { + return new GTestResultParser(xml).failedTests(); + } catch (Throwable t) { + System.err.println("WARNING: failed to parse result file (" + xml + ") " + t); + t.printStackTrace(); + } + return Collections.emptyList(); } private static String getJVMVariantSubDir() {