Escape non-printable characters in the junit XML output
authorMatteo Beccati <mbeccati@php.net>
Tue, 27 May 2014 09:54:34 +0000 (11:54 +0200)
committerMatteo Beccati <mbeccati@php.net>
Tue, 27 May 2014 10:03:38 +0000 (12:03 +0200)
XML doesn't allow most of the characters < 0x20 and binary output
breaks XML parsers. Such characters are not allowed as entities
either, so the generated entities are escaped in order to be printed
as text.

run-tests.php

index c86ebc8cdd9c06cec31b934f5f50c127f3c014d8..a2f552cfd49b848ffa74b9ebbd73eaef9ba74df1 100755 (executable)
@@ -2701,6 +2701,9 @@ function junit_mark_test_as($type, $file_name, $test_name, $time = null, $messag
        junit_suite_record($suite, 'execution_time', $time);
 
        $escaped_details = htmlspecialchars($details, ENT_QUOTES, 'UTF-8');
+       $escaped_details = preg_replace_callback('/[\0-\x08\x0B\x0C\x0E-\x1F]/', function ($c) {
+               return sprintf('[[0x%02x]]', ord($c[0]));
+       }, $escaped_details);
        $escaped_message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8');
 
     $escaped_test_name = basename($file_name) . ' - ' . htmlspecialchars($test_name, ENT_QUOTES);