[testRunner] WEB-66843: Add HTML escaping for tests' output for Export test results

- Fix escaping for tests output for exporting XSL template
- Add tests


Merge-request: IJ-MR-133878
Merged-by: Dmitry Makhnev <Dmitry.Makhnev@jetbrains.com>

GitOrigin-RevId: 84ab65655e16069608dbb2975db0df66703ed8ca
This commit is contained in:
Dmitry Makhnev
2024-08-20 12:50:21 +00:00
committed by intellij-monorepo-bot
parent eea2a6fee0
commit 052a3e69af
2 changed files with 42 additions and 11 deletions

View File

@@ -5,6 +5,7 @@ import com.intellij.execution.executors.DefaultRunExecutor;
import com.intellij.execution.testframework.Filter;
import com.intellij.execution.testframework.TestConsoleProperties;
import com.intellij.execution.testframework.actions.AbstractRerunFailedTestsAction;
import com.intellij.execution.testframework.export.ExportTestResultsAction;
import com.intellij.execution.testframework.export.TestResultsXmlFormatter;
import com.intellij.execution.testframework.sm.Marker;
import com.intellij.execution.testframework.sm.runner.events.*;
@@ -32,10 +33,8 @@ import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import javax.xml.transform.stream.StreamSource;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.List;
@@ -660,6 +659,41 @@ public class GeneralToSMTRunnerEventsConvertorTest extends BaseSMTRunnerTestCase
assertEquals("ATe&st", tests.get(0).getName());
}
public void testIntellijExportXslEscaping() throws Exception {
String systemOutput = "<span onclick=\"alert(\"Ops!\")\">SYSTEM_OUTPUT\n<span>";
String escapedSystemOutput = "&lt;span onclick=\"alert(\"Ops!\")\"&gt;SYSTEM_OUTPUT<br/>&lt;span&gt;<br/>";
String normalOutput = "<div onclick=\"alert(\"Ops!!\")\">NORMAL_OUTPUT<span>";
String escapedNormalOutput = "&lt;div onclick=\"alert(\"Ops!!\")\"&gt;NORMAL_OUTPUT&lt;span&gt;<br/>";
String errorOutput = "<p onclick=\"alert(\"Ops!!!\")\">ERROR_OUTPUT<div>";
String escapedErrorOutput = "&lt;p onclick=\"alert(\"Ops!!!\")\"&gt;ERROR_OUTPUT&lt;div&gt;<br/>";
mySuite.addChild(mySimpleTest);
mySimpleTest.addLast(printer -> {
printer.print(systemOutput, ConsoleViewContentType.SYSTEM_OUTPUT);
printer.print(normalOutput, ConsoleViewContentType.NORMAL_OUTPUT);
printer.print(errorOutput, ConsoleViewContentType.ERROR_OUTPUT);
});
mySimpleTest.setFinished();
mySuite.setFinished();
SAXTransformerFactory transformerFactory = (SAXTransformerFactory)TransformerFactory.newDefaultInstance();
try (InputStream bundledXsltUrl = ExportTestResultsAction.class.getResourceAsStream("intellij-export.xsl")) {
TransformerHandler handler = transformerFactory.newTransformerHandler(new StreamSource(bundledXsltUrl));
File output = FileUtil.createTempFile("output", "");
FileUtilRt.createParentDirs(output);
try (FileWriter writer = new FileWriter(output, StandardCharsets.UTF_8)) {
handler.setResult(new StreamResult(writer));
MockRuntimeConfiguration configuration = new MockRuntimeConfiguration(getProject());
TestResultsXmlFormatter.execute(mySuite, configuration, new SMTRunnerConsoleProperties(configuration, "framework", new DefaultRunExecutor()), handler);
String renderedResult = FileUtil.loadFile(output);
assertContains(escapedSystemOutput, renderedResult);
assertContains(escapedNormalOutput, renderedResult);
assertContains(escapedErrorOutput, renderedResult);
}
}
}
public void testPreserveFullOutputAfterImport() throws Exception {
mySuite.addChild(mySimpleTest);

View File

@@ -679,16 +679,13 @@ jQuery.cookie = function(name, value, options) {
<xsl:if test="count(./output) > 0">
<ul>
<xsl:for-each select="output">
<xsl:variable name="displayText">
<xsl:for-each select="str:tokenize(text(), '&#10;')">
<xsl:value-of select="."/>
<xsl:text>&lt;br/&gt;</xsl:text>
</xsl:for-each>
</xsl:variable>
<li class="text">
<xsl:variable name="output-type" select="@type"/>
<span class="{$output-type}">
<xsl:value-of disable-output-escaping="yes" select="$displayText"/>
<xsl:for-each select="str:tokenize(text(), '&#10;')">
<xsl:value-of select="." />
<xsl:value-of disable-output-escaping="yes" select="'&lt;br/&gt;'"/>
</xsl:for-each>
</span>
</li>
</xsl:for-each>