Improve junit xml generated fields

* trial ('testsuites' node): Add fields 'tests', 'errors', 'failures',
  'time'.
* testsuite: Add fields 'errors', 'failures', 'skipped',
  'disabled'
* test: Add field 'classname' (empty).

Fix and improve suite.py and test.py to count errors, skipped, failures
properly.

Change-Id: Ie2d10cee88a9c0d829e4620553164cf3150e8e5c
diff --git a/src/osmo_gsm_tester/report.py b/src/osmo_gsm_tester/report.py
index 5d23c38..f781695 100644
--- a/src/osmo_gsm_tester/report.py
+++ b/src/osmo_gsm_tester/report.py
@@ -17,6 +17,8 @@
 # You should have received a copy of the GNU General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
+# junit xml format: https://llg.cubic.org/docs/junit/
+
 import math
 import sys
 import re
@@ -50,9 +52,24 @@
 
 def trial_to_junit(trial):
     testsuites = et.Element('testsuites')
+    num_tests = 0
+    num_failures = 0
+    num_errors = 0
+    time = 0
+    id = 0
     for suite in trial.suites:
         testsuite = suite_to_junit(suite)
+        testsuite.set('id', str(id))
+        id += 1
         testsuites.append(testsuite)
+        num_tests += int(testsuite.get('tests'))
+        num_failures += int(testsuite.get('failures'))
+        num_errors += int(testsuite.get('errors'))
+        time += suite.duration
+    testsuites.set('tests', str(num_tests))
+    testsuites.set('errors', str(num_errors))
+    testsuites.set('failures', str(num_failures))
+    testsuites.set('time', str(math.ceil(time)))
     return testsuites
 
 def suite_to_junit(suite):
@@ -63,9 +80,14 @@
         testsuite.set('timestamp', datetime.fromtimestamp(round(suite.start_timestamp)).isoformat())
         testsuite.set('time', str(math.ceil(suite.duration)))
     testsuite.set('tests', str(len(suite.tests)))
-    testsuite.set('failures', str(suite.count_test_results()[2]))
+    passed, skipped, failed, errors = suite.count_test_results()
+    testsuite.set('errors', str(errors))
+    testsuite.set('failures', str(failed))
+    testsuite.set('skipped', str(skipped))
+    testsuite.set('disabled', str(skipped))
     for suite_test in suite.tests:
         testcase = test_to_junit(suite_test)
+        testcase.set('classname', suite.name())
         testsuite.append(testcase)
     return testsuite
 
@@ -113,10 +135,12 @@
     if not suite.tests:
         return 'no tests were run.'
 
-    passed, skipped, failed = suite.count_test_results()
+    passed, skipped, failed, errors = suite.count_test_results()
     details = []
     if failed:
         details.append('fail: %d' % failed)
+    if errors:
+        details.append('errors: %d' % errors)
     if passed:
         details.append('pass: %d' % passed)
     if skipped: