nitunit: filter the XML content (and trunc it if needed)
authorJean Privat <jean@pryen.org>
Thu, 19 May 2016 03:49:54 +0000 (23:49 -0400)
committerJean Privat <jean@pryen.org>
Thu, 19 May 2016 03:49:54 +0000 (23:49 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/testing/testing_base.nit
src/testing/testing_doc.nit
src/testing/testing_suite.nit

index 5e9b83b..414de9a 100644 (file)
@@ -93,3 +93,39 @@ ulimit -t {{{ulimit_usertime}}} 2> /dev/null
        # Default: 10 CPU minute
        var ulimit_usertime = 600 is writable
 end
+
+redef class String
+       # If needed, truncate `self` at `max_length` characters and append an informative `message`.
+       #
+       # ~~~
+       # assert "hello".trunc(10) == "hello"
+       # assert "hello".trunc(2) == "he[truncated. Full size is 5]"
+       # assert "hello".trunc(2, "...") == "he..."
+       # ~~~
+       fun trunc(max_length: Int, message: nullable String): String
+       do
+               if length <= max_length then return self
+               if message == null then message = "[truncated. Full size is {length}]"
+               return substring(0, max_length) + message
+       end
+
+       # Use a special notation for whitespace characters that are not `'\n'` (LFD) or `' '` (space).
+       #
+       # ~~~
+       # assert "hello".filter_nonprintable == "hello"
+       # assert "\r\n\t".filter_nonprintable == "^13\n^9"
+       # ~~~
+       fun filter_nonprintable: String
+       do
+               var buf = new Buffer
+               for c in self do
+                       var cp = c.code_point
+                       if cp < 32 and c != '\n' then
+                               buf.append "^{cp}"
+                       else
+                               buf.add c
+                       end
+               end
+               return buf.to_s
+       end
+end
index f040253..05c1f67 100644 (file)
@@ -159,12 +159,13 @@ class NitUnitExecutor
                        toolcontext.info("Execute doc-unit {du.testcase.attrs["name"]} in {file} {i}", 1)
                        var res2 = toolcontext.safe_exec("{file.to_program_name}.bin {i} >'{file}.out1' 2>&1 </dev/null")
 
-                       var msg
                        f = new FileReader.open("{file}.out1")
                        var n2
                        n2 = new HTMLTag("system-err")
                        tc.add n2
-                       msg = f.read_all
+                       var content = f.read_all
+                       var msg = content.trunc(8192).filter_nonprintable
+                       n2.append(msg)
                        f.close
 
                        n2 = new HTMLTag("system-out")
@@ -173,9 +174,9 @@ class NitUnitExecutor
 
                        if res2 != 0 then
                                var ne = new HTMLTag("error")
-                               ne.attr("message", msg)
+                               ne.attr("message", "Runtime error")
                                tc.add ne
-                               toolcontext.warning(du.mdoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                               toolcontext.warning(du.mdoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): Runtime error\n{msg}")
                                toolcontext.modelbuilder.failed_entities += 1
                        end
                        toolcontext.check_errors
@@ -209,12 +210,13 @@ class NitUnitExecutor
                        res2 = toolcontext.safe_exec("{file.to_program_name}.bin >'{file}.out1' 2>&1 </dev/null")
                end
 
-               var msg
                f = new FileReader.open("{file}.out1")
                var n2
                n2 = new HTMLTag("system-err")
                tc.add n2
-               msg = f.read_all
+               var content = f.read_all
+               var msg = content.trunc(8192).filter_nonprintable
+               n2.append(msg)
                f.close
 
                n2 = new HTMLTag("system-out")
@@ -224,15 +226,15 @@ class NitUnitExecutor
 
                if res != 0 then
                        var ne = new HTMLTag("failure")
-                       ne.attr("message", msg)
+                       ne.attr("message", "Compilation Error")
                        tc.add ne
-                       toolcontext.warning(du.mdoc.location, "failure", "FAILURE: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                       toolcontext.warning(du.mdoc.location, "failure", "FAILURE: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}):\n{msg}")
                        toolcontext.modelbuilder.failed_entities += 1
                else if res2 != 0 then
                        var ne = new HTMLTag("error")
-                       ne.attr("message", msg)
+                       ne.attr("message", "Runtime Error")
                        tc.add ne
-                       toolcontext.warning(du.mdoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+                       toolcontext.warning(du.mdoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}):\n{msg}")
                        toolcontext.modelbuilder.failed_entities += 1
                end
                toolcontext.check_errors
index 06fc90c..ccb4710 100644 (file)
@@ -277,14 +277,14 @@ class TestCase
                tc.attr("classname", "nitunit." + mclassdef.mmodule.full_name + "." + mclassdef.mclass.full_name)
                tc.attr("name", test_method.mproperty.full_name)
                if was_exec then
-                       tc.add  new HTMLTag("system-err")
-                       var n = new HTMLTag("system-out")
-                       n.append "out"
+                       tc.add  new HTMLTag("system-out")
+                       var n = new HTMLTag("system-err")
                        tc.add n
                        var error = self.error
                        if error != null then
+                               n.append error.trunc(8192).filter_nonprintable
                                n = new HTMLTag("error")
-                               n.attr("message", error.to_s)
+                               n.attr("message", "Runtime Error")
                                tc.add n
                        end
                end