From 7186cb60d95cb75ab1b59e52f88e029bac558a60 Mon Sep 17 00:00:00 2001
From: Fabian Lewis <49647154+frobian21@users.noreply.github.com>
Date: Thu, 28 Dec 2023 17:51:54 +0100
Subject: [PATCH] Add xml escape characters back
---
mypy/test/testutil.py | 22 ++++++++++++++++++++++
mypy/util.py | 6 ++++--
2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/mypy/test/testutil.py b/mypy/test/testutil.py
index d0d54ffec8c6..a7c3f1c00fee 100644
--- a/mypy/test/testutil.py
+++ b/mypy/test/testutil.py
@@ -31,6 +31,28 @@ def test_junit_pass(self) -> None:
+"""
+ result = _generate_junit_contents(
+ dt=1.23,
+ serious=serious,
+ messages_by_file=messages_by_file,
+ version="3.14",
+ platform="test-plat",
+ )
+ assert result == expected
+
+ def test_junit_fail_escape_xml_chars(self) -> None:
+ serious = False
+ messages_by_file: dict[str | None, list[str]] = {
+ "file1.py": ["Test failed", "another line < > &"]
+ }
+ expected = """
+
+
+ Test failed
+another line < > &
+
+
"""
result = _generate_junit_contents(
dt=1.23,
diff --git a/mypy/util.py b/mypy/util.py
index be8a22d08a27..0277a96a6885 100644
--- a/mypy/util.py
+++ b/mypy/util.py
@@ -263,6 +263,8 @@ def _generate_junit_contents(
version: str,
platform: str,
) -> str:
+ from xml.sax.saxutils import escape
+
if serious:
failures = 0
errors = len(messages_by_file)
@@ -284,7 +286,7 @@ def _generate_junit_contents(
for filename, messages in messages_by_file.items():
if filename is not None:
xml += JUNIT_TESTCASE_FAIL_TEMPLATE.format(
- text="\n".join(messages),
+ text=escape("\n".join(messages)),
filename=filename,
time=dt,
name="mypy-py{ver}-{platform} {filename}".format(
@@ -293,7 +295,7 @@ def _generate_junit_contents(
)
else:
xml += JUNIT_TESTCASE_FAIL_TEMPLATE.format(
- text="\n".join(messages),
+ text=escape("\n".join(messages)),
filename="mypy",
time=dt,
name="mypy-py{ver}-{platform}".format(ver=version, platform=platform),