Page Menu
Home
Phorge
Search
Configure Global Search
Log In
Files
F2888991
ArcanistXUnitTestResultParser.php
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Award Token
Flag For Later
Advanced/Developer...
View Handle
View Hovercard
Size
3 KB
Referenced Files
None
Subscribers
None
ArcanistXUnitTestResultParser.php
View Options
<?php
/**
* Parser for JUnit, NUnit, etc results format
*/
final
class
ArcanistXUnitTestResultParser
extends
Phobject
{
/**
* Parse test results from provided input and return an array
* of @{class:ArcanistUnitTestResult}.
*
* @param string $test_results String containing test results
*
* @return array ArcanistUnitTestResult
*/
public
function
parseTestResults
(
$test_results
)
{
if
(
!
strlen
(
$test_results
)
)
{
throw
new
Exception
(
pht
(
'%s argument to %s must not be empty'
,
'test_results'
,
'parseTestResults()'
)
)
;
}
// xunit xsd: https://gist.github.com/959290
$xunit_dom
=
new
DOMDocument
(
)
;
$load_success
=
@
$xunit_dom
->
loadXML
(
$test_results
)
;
if
(
!
$load_success
)
{
$input_start
=
id
(
new
PhutilUTF8StringTruncator
(
)
)
->
setMaximumGlyphs
(
150
)
->
truncateString
(
$test_results
)
;
throw
new
Exception
(
sprintf
(
"%s\n\n%s"
,
pht
(
'Failed to load XUnit report; Input starts with:'
)
,
$input_start
)
)
;
}
$results
=
array
(
)
;
$testcases
=
$xunit_dom
->
getElementsByTagName
(
'testcase'
)
;
foreach
(
$testcases
as
$testcase
)
{
$classname
=
$testcase
->
getAttribute
(
'classname'
)
;
$name
=
$testcase
->
getAttribute
(
'name'
)
;
$time
=
$testcase
->
getAttribute
(
'time'
)
;
$status
=
ArcanistUnitTestResult
::
RESULT_PASS
;
$user_data
=
''
;
// A skipped test is a test which was ignored using framework
// mechanisms (e.g. @skip decorator)
$skipped
=
$testcase
->
getElementsByTagName
(
'skipped'
)
;
if
(
$skipped
->
length
>
0
)
{
$status
=
ArcanistUnitTestResult
::
RESULT_SKIP
;
$messages
=
array
(
)
;
for
(
$ii
=
0
;
$ii
<
$skipped
->
length
;
$ii
++
)
{
$messages
[
]
=
trim
(
$skipped
->
item
(
$ii
)
->
nodeValue
,
" \n"
)
;
}
$user_data
.=
implode
(
"\n"
,
$messages
)
;
}
// Failure is a test which the code has explicitly failed by using
// the mechanisms for that purpose. e.g., via an assertEquals
$failures
=
$testcase
->
getElementsByTagName
(
'failure'
)
;
if
(
$failures
->
length
>
0
)
{
$status
=
ArcanistUnitTestResult
::
RESULT_FAIL
;
$messages
=
array
(
)
;
for
(
$ii
=
0
;
$ii
<
$failures
->
length
;
$ii
++
)
{
$messages
[
]
=
trim
(
$failures
->
item
(
$ii
)
->
nodeValue
,
" \n"
)
;
}
$user_data
.=
implode
(
"\n"
,
$messages
)
.
"\n"
;
}
// An errored test is one that had an unanticipated problem. e.g., an
// unchecked throwable, or a problem with an implementation of the test.
$errors
=
$testcase
->
getElementsByTagName
(
'error'
)
;
if
(
$errors
->
length
>
0
)
{
$status
=
ArcanistUnitTestResult
::
RESULT_BROKEN
;
$messages
=
array
(
)
;
for
(
$ii
=
0
;
$ii
<
$errors
->
length
;
$ii
++
)
{
$messages
[
]
=
trim
(
$errors
->
item
(
$ii
)
->
nodeValue
,
" \n"
)
;
}
$user_data
.=
implode
(
"\n"
,
$messages
)
.
"\n"
;
}
$result
=
new
ArcanistUnitTestResult
(
)
;
$result
->
setName
(
$classname
.
'.'
.
$name
)
;
$result
->
setResult
(
$status
)
;
$result
->
setDuration
(
(float)
$time
)
;
$result
->
setUserData
(
$user_data
)
;
$results
[
]
=
$result
;
}
return
$results
;
}
}
File Metadata
Details
Attached
Mime Type
text/x-php
Expires
Jan 19 2025, 10:56 (5 w, 20 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1114892
Default Alt Text
ArcanistXUnitTestResultParser.php (3 KB)
Attached To
Mode
rARC Arcanist
Attached
Detach File
Event Timeline
Log In to Comment