You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by bh...@apache.org on 2009/12/04 13:50:46 UTC

svn commit: r887178 - /subversion/trunk/tools/dev/gen_junit_report.py

Author: bhuvan
Date: Fri Dec  4 12:50:45 2009
New Revision: 887178

URL: http://svn.apache.org/viewvc?rev=887178&view=rev
Log:
Fix for issue 3541. When generating junit reports, escape special
characters, if any, from test failure messages.

* tools/dev/gen_junit_report.py
  ASCII_TABLE: Global variable to define list of ascii characters.
  CHARS_TO_REMOVE: Global variable to define list of ascii values
  to remove from failure messages.
  (escape_special_characters): New method to escape special characters.
  (junit_testcase_fail, junit_testcase_xfail): Use 
  escape_special_characters() method to escape special characters in 
  test failure messages.

Approved by: julianfoad
Reviewed by: julianfoad,
             brane

Modified:
    subversion/trunk/tools/dev/gen_junit_report.py

Modified: subversion/trunk/tools/dev/gen_junit_report.py
URL: http://svn.apache.org/viewvc/subversion/trunk/tools/dev/gen_junit_report.py?rev=887178&r1=887177&r2=887178&view=diff
==============================================================================
--- subversion/trunk/tools/dev/gen_junit_report.py (original)
+++ subversion/trunk/tools/dev/gen_junit_report.py Fri Dec  4 12:50:45 2009
@@ -33,6 +33,11 @@
 import os
 import getopt
 
+ASCII_TABLE = "".join([chr(n) for n in xrange(256)])
+# remove all special characters upto ascii value 31, except line feed (10)
+# and carriage return (13)
+CHARS_TO_REMOVE = ASCII_TABLE[0:10] + ASCII_TABLE[11:13] + ASCII_TABLE[14:32]
+
 def xml_encode(data):
     """encode the xml characters in the data"""
     encode = {
@@ -46,6 +51,15 @@
         data = data.replace(char, encode[char])
     return data
 
+def escape_special_characters(data):
+    """remove special characters in test failure reasons"""
+    if not data:
+        return data
+    for char in CHARS_TO_REMOVE:
+        data = data.replace(char, '%%%0x' % ord(char))
+    data = data.replace(']]>', ']]]]><![CDATA[>')
+    return data
+
 def start_junit():
     """define the beginning of xml document"""
     head = """<?xml version="1.0" encoding="UTF-8"?>"""
@@ -72,6 +86,7 @@
     """mark the test case as FAILED"""
     casename = xml_encode(casename)
     sub_test_name = test_name.replace('.', '-')
+    reason = escape_special_characters(reason)
     case = """<testcase time="ELAPSED_CASE_%s" name="%s" classname="%s">
       <failure type="Failed"><![CDATA[%s]]></failure>
     </testcase>""" % (test_name, casename, sub_test_name, reason)
@@ -81,6 +96,7 @@
     """mark the test case as XFAILED"""
     casename = xml_encode(casename)
     sub_test_name = test_name.replace('.', '-')
+    reason = escape_special_characters(reason)
     case = """<testcase time="ELAPSED_CASE_%s" name="%s" classname="%s">
       <system-out><![CDATA[%s]]></system-out>
     </testcase>""" % (test_name, casename, sub_test_name, reason)