Skip to content

Commit

Permalink
fix: remove invalid xml characters in junit reporter output (fix #1144)…
Browse files Browse the repository at this point in the history
… (#1145)
  • Loading branch information
ciddan committed Apr 14, 2022
1 parent 0de8969 commit ab8e2b8
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 6 deletions.
38 changes: 32 additions & 6 deletions packages/vitest/src/node/reporters/junit.ts
Expand Up @@ -23,13 +23,39 @@ function flattenTasks(task: Task, baseName = ''): Task[] {
}
}

// https://gist.github.com/john-doherty/b9195065884cdbfd2017a4756e6409cc
function removeInvalidXMLCharacters(value: any, removeDiscouragedChars: boolean): string {
// eslint-disable-next-line no-control-regex
let regex = /((?:[\0-\x08\x0B\f\x0E-\x1F\uFFFD\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))/g
value = String(value || '').replace(regex, '')

if (removeDiscouragedChars) {
// remove everything discouraged by XML 1.0 specifications
regex = new RegExp(
'([\\x7F-\\x84]|[\\x86-\\x9F]|[\\uFDD0-\\uFDEF]|(?:\\uD83F[\\uDFFE\\uDFFF])|(?:\\uD87F[\\uDF'
+ 'FE\\uDFFF])|(?:\\uD8BF[\\uDFFE\\uDFFF])|(?:\\uD8FF[\\uDFFE\\uDFFF])|(?:\\uD93F[\\uDFFE\\uD'
+ 'FFF])|(?:\\uD97F[\\uDFFE\\uDFFF])|(?:\\uD9BF[\\uDFFE\\uDFFF])|(?:\\uD9FF[\\uDFFE\\uDFFF])'
+ '|(?:\\uDA3F[\\uDFFE\\uDFFF])|(?:\\uDA7F[\\uDFFE\\uDFFF])|(?:\\uDABF[\\uDFFE\\uDFFF])|(?:\\'
+ 'uDAFF[\\uDFFE\\uDFFF])|(?:\\uDB3F[\\uDFFE\\uDFFF])|(?:\\uDB7F[\\uDFFE\\uDFFF])|(?:\\uDBBF'
+ '[\\uDFFE\\uDFFF])|(?:\\uDBFF[\\uDFFE\\uDFFF])(?:[\\0-\\t\\x0B\\f\\x0E-\\u2027\\u202A-\\uD7FF\\'
+ 'uE000-\\uFFFF]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|'
+ '(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]))', 'g')

value = value.replace(regex, '')
}

return value
}

function escapeXML(value: any): string {
return String(value)
.replace(/&/g, '&')
.replace(/"/g, '"')
.replace(/'/g, ''')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;')
return removeInvalidXMLCharacters(
String(value)
.replace(/&/g, '&amp;')
.replace(/"/g, '&quot;')
.replace(/'/g, '&apos;')
.replace(/</g, '&lt;')
.replace(/>/g, '&gt;'),
true)
}

function getDuration(task: Task): string | undefined {
Expand Down
8 changes: 8 additions & 0 deletions test/reporters/src/data.ts
Expand Up @@ -142,6 +142,14 @@ const tasks: Task[] = [
fails: undefined,
file,
result: { state: 'pass', duration: 0.1923508644104004 },
logs: [
{
content: 'error',
type: 'stderr',
time: 1642587001759,
size: 15,
},
],
},
]

Expand Down
18 changes: 18 additions & 0 deletions test/reporters/tests/__snapshots__/reporters.spec.ts.snap
Expand Up @@ -24,6 +24,9 @@ AssertionError: expected 2.23606797749979 to equal 2
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback setup success done(false)\\" time=\\"0.0197386060\\">
</testcase>
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback test success done(false)\\" time=\\"0.0001923509\\">
<system-err>
[33merror[39m
</system-err>
</testcase>
</testsuite>
</testsuites>
Expand Down Expand Up @@ -54,6 +57,9 @@ AssertionError: expected 2.23606797749979 to equal 2
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback setup success done(false)\\" time=\\"0.0197386060\\">
</testcase>
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback test success done(false)\\" time=\\"0.0001923509\\">
<system-err>
[33merror[39m
</system-err>
</testcase>
</testsuite>
</testsuites>
Expand Down Expand Up @@ -89,6 +95,9 @@ AssertionError: expected 2.23606797749979 to equal 2
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback setup success done(false)\\" time=\\"0.0197386060\\">
</testcase>
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback test success done(false)\\" time=\\"0.0001923509\\">
<system-err>
[33merror[39m
</system-err>
</testcase>
</testsuite>
</testsuites>
Expand Down Expand Up @@ -124,6 +133,9 @@ AssertionError: expected 2.23606797749979 to equal 2
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback setup success done(false)\\" time=\\"0.0197386060\\">
</testcase>
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback test success done(false)\\" time=\\"0.0001923509\\">
<system-err>
[33merror[39m
</system-err>
</testcase>
</testsuite>
</testsuites>
Expand Down Expand Up @@ -159,6 +171,9 @@ AssertionError: expected 2.23606797749979 to equal 2
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback setup success done(false)\\" time=\\"0.0197386060\\">
</testcase>
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback test success done(false)\\" time=\\"0.0001923509\\">
<system-err>
[33merror[39m
</system-err>
</testcase>
</testsuite>
</testsuites>
Expand Down Expand Up @@ -194,6 +209,9 @@ AssertionError: expected 2.23606797749979 to equal 2
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback setup success done(false)\\" time=\\"0.0197386060\\">
</testcase>
<testcase classname=\\"test/core/test/basic.test.ts\\" name=\\"suite &gt; callback test success done(false)\\" time=\\"0.0001923509\\">
<system-err>
[33merror[39m
</system-err>
</testcase>
</testsuite>
</testsuites>
Expand Down

0 comments on commit ab8e2b8

Please sign in to comment.