This is the mail archive of the mauve-discuss@sources.redhat.com mailing list for the Mauve project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] xml output from mauve (updated)


On sÃn, 2004-09-19 at 23:51 +0200, Mark Wielaard wrote:
> Hi,
> 
> On Sat, 2004-09-18 at 22:47, Noa Resare wrote:
> > On fre, 2004-09-17 at 23:20 +0200, Noa Resare wrote:
> > > So, I did some afternoon hacking and came up with this patch to mauve
> > > that outputs the results from a mauve run into an xml file for easy
> > > parsing. I haven't written anything that does anything with the output
> > > yet but I thought I could share this with you anyway.
> > 
> > This updated patch handles mauve output containing & < and > properly.
> > It also adds Makefile.am to the changelog entry.
> >
> > ps. a test result diff program (that looks for regressions) in very
> > rough form is available from http://resare.com/noa/testdiff
> 
> Very nice!
> 
> Maybe this should be written as a new XMLTestHarness class?
> Although I don't really see a problem with just tagging it on the
> SimpleTestHarness. Opinions anybody?

Maybe that would be better. However, I don't think the current solution
is horribly ugly and I'd rather use that time trying to contribute to
fixing jvm bugs. I'm open to suggestions though :)

> Are you sure the XML escaping is always correct?
> Maybe it doesn't really matter in this case, but you might want to look
> whether GNU Kawa (http://www.gnu.org/software/kawa/) has something
> appropriate in the gnu.xml package.

I'm think escaping is correct except for the case when any of the
properties used to identify a jvm in the output header or a class name
contains a single quote ('). The attached patch fixes this and applies
on top of my previous patch. 

/noa

-- 
And the lions ate the christians and the christians burned the witches,
and even I am out of explanations -- Ola Salo
gpg fingerprint: F3C4 AC90 B885 FE15 344B  4D05 220B 7662 A190 6F09
--- mauve/gnu/testlet/TestReport.java.vanilla	2004-09-20 08:20:22.653300790 +0200
+++ mauve/gnu/testlet/TestReport.java	2004-09-20 08:43:54.765740326 +0200
@@ -68,18 +68,19 @@
     Writer out = new OutputStreamWriter(new FileOutputStream(f), ENCODING);
     out.write("<?xml version='1.0' encoding='" + ENCODING + "'?>\n");
     out.write("<testreport version='0.1'>\n  <jvm name='" +
-	    systemProperties.get("java.vm.vendor") + "'\n    version='" +
-	    systemProperties.get("java.vm.version") + "' \n" +
-	    "    os='" + systemProperties.get("os.name") + " " +
-	    systemProperties.get("os.version") + " " +
-	    systemProperties.get("os.arch") + "' />\n");
+	    escAttrib(systemProperties.get("java.vm.vendor")) +
+	    "'\n    version='" +
+	    escAttrib(systemProperties.get("java.vm.version")) + "' \n" +
+	    "    os='" + escAttrib(systemProperties.get("os.name")) + " " +
+	    escAttrib(systemProperties.get("os.version")) + " " +
+	    escAttrib(systemProperties.get("os.arch")) + "' />\n");
     Collections.sort(testResults);
     Iterator results = testResults.iterator();
     while (results.hasNext())
       {
 	TestResult tr = (TestResult) results.next();
 	String[] failures = tr.getFailMessags();
-	out.write("  <testresult testlet='" + tr.getTestletName() +
+	out.write("  <testresult testlet='" + escAttrib(tr.getTestletName()) +
 		 "' passcount='" + tr.getPassCount());
 	if (failures.length > 0 || tr.getException() != null)
 	  out.write("'>\n");
@@ -92,7 +93,8 @@
 	if (tr.getException() != null)
 	  {
 	    Throwable t = tr.getException();
-	    out.write("    <exception class='" + t.getClass().getName() +
+	    out.write("    <exception class='" +
+                    escAttrib(t.getClass().getName()) +
 		    "'>\n      <reason>" + esc(tr.getExceptionMessage()) +
 		    "</reason>\n      <message>" + esc(t.getMessage()) +
 		    "</message>\n    </exception>\n");
@@ -117,4 +119,16 @@
     str = str.replaceAll(">", "&gt;");
     return str;
   }
+
+  /**
+   * Escapes single quotes in string by prepending a backslash.
+   */
+  private String escAttrib(Object obj)
+  {
+    if (obj == null)
+      return null;
+    String str = (String)obj;
+    str = str.replaceAll("'", "\\'");
+    return str;
+  }
 }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]