Add --json flag to test-webkitpy to emit JSON formatted test results
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Oct 2014 20:56:11 +0000 (20:56 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 15 Oct 2014 20:56:11 +0000 (20:56 +0000)
to stdout
https://bugs.webkit.org/show_bug.cgi?id=137353

Patch by Jake Nielsen <jacob_nielsen@apple.com> on 2014-10-15
Reviewed by Daniel Bates.

* Scripts/webkitpy/port/server_process_unittest.py:
Adds the read method to MockFile to allow the stdout of test_webkitpy
to be redirected without causing erroneous test failures.
In particular,
webkitpy.port.server_process_unittest.TestServerProcess.test_broken_pipe
and
webkitpy.port.server_process_unittest.TestServerProcess.test_cleanup
because when redirecting to a file, the
_wait_for_data_and_update_buffers_using_select method in
server_process.py will find that there is a read file descriptor in
its call to select.select, which eventually leads to it calling read()
on the MockFile object.
(MockFile.read):
* Scripts/webkitpy/test/main.py:
Adds the _print_results_as_json method and the --json flag which
determines whether _print_results_as_json will get called.
(Tester._parse_args):
(Tester._print_results_as_json):
(Tester._print_results_as_json.result_dict_from_tuple):
(Tester._run_tests):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@174743 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Tools/ChangeLog
Tools/Scripts/webkitpy/port/server_process_unittest.py
Tools/Scripts/webkitpy/test/main.py

index a610239..42f77c5 100644 (file)
@@ -1,3 +1,32 @@
+2014-10-15  Jake Nielsen  <jacob_nielsen@apple.com>
+
+        Add --json flag to test-webkitpy to emit JSON formatted test results
+        to stdout
+        https://bugs.webkit.org/show_bug.cgi?id=137353
+
+        Reviewed by Daniel Bates.
+
+        * Scripts/webkitpy/port/server_process_unittest.py:
+        Adds the read method to MockFile to allow the stdout of test_webkitpy
+        to be redirected without causing erroneous test failures.
+        In particular,
+        webkitpy.port.server_process_unittest.TestServerProcess.test_broken_pipe
+        and
+        webkitpy.port.server_process_unittest.TestServerProcess.test_cleanup
+        because when redirecting to a file, the
+        _wait_for_data_and_update_buffers_using_select method in 
+        server_process.py will find that there is a read file descriptor in
+        its call to select.select, which eventually leads to it calling read()
+        on the MockFile object.
+        (MockFile.read):
+        * Scripts/webkitpy/test/main.py:
+        Adds the _print_results_as_json method and the --json flag which
+        determines whether _print_results_as_json will get called.
+        (Tester._parse_args):
+        (Tester._print_results_as_json):
+        (Tester._print_results_as_json.result_dict_from_tuple):
+        (Tester._run_tests):
+
 2014-10-13  David Farler  <dfarler@apple.com>
 
         [iOS] LayoutTestRelay: Detect broken pipe when reading simulator app's stdout and stderr.
index 6e00199..3f43bfd 100644 (file)
@@ -66,6 +66,10 @@ class MockFile(object):
         self._server_process.broken_pipes.append(self)
         raise IOError
 
+    def read(self, size=0):
+        # This means end of file
+        return ''
+
     def close(self):
         self.closed = True
 
index cb0ef15..ef4e70e 100644 (file)
 """unit testing code for webkitpy."""
 
 import StringIO
+import itertools
+import json
 import logging
 import multiprocessing
+import operator
 import optparse
 import os
 import sys
@@ -72,6 +75,17 @@ def main():
     return not tester.run()
 
 
+def _print_results_as_json(stream, all_test_names, failures, errors):
+    def result_dict_from_tuple(result_tuple):
+        return {'name': result_tuple[0], 'result': result_tuple[1]}
+
+    results = {}
+    results['failures'] = map(result_dict_from_tuple, sorted(failures, key=operator.itemgetter(0)))
+    results['errors'] = map(result_dict_from_tuple, sorted(errors, key=operator.itemgetter(0)))
+    results['passes'] = sorted(set(all_test_names) - set(map(operator.itemgetter(0), failures)) - set(map(operator.itemgetter(0), errors)))
+
+    json.dump(results, stream, separators=(',', ':'))
+
 class Tester(object):
     def __init__(self, filesystem=None):
         self.finder = Finder(filesystem or FileSystem())
@@ -102,6 +116,8 @@ class Tester(object):
                           help='display per-test execution time (implies --verbose)')
         parser.add_option('-v', '--verbose', action='count', default=0,
                           help='verbose output (specify once for individual test results, twice for debug messages)')
+        parser.add_option('--json', action='store_true', default=False,
+                          help='write JSON formatted test results to stdout')
 
         parser.epilog = ('[args...] is an optional list of modules, test_classes, or individual tests. '
                          'If no args are given, all the tests will be run.')
@@ -156,6 +172,9 @@ class Tester(object):
 
         self.printer.print_result(time.time() - start)
 
+        if self._options.json:
+            _print_results_as_json(sys.stdout, itertools.chain(parallel_tests, serial_tests), test_runner.failures, test_runner.errors)
+
         if self._options.coverage:
             cov.stop()
             cov.save()