Changeset 89888 in webkit


Ignore:
Timestamp:
Jun 27, 2011 9:19:49 PM (13 years ago)
Author:
commit-queue@webkit.org
Message:

2011-06-27 Alice Boxhall <aboxhall@chromium.org>

Reviewed by Ojan Vafai.

Convert json_results_generator.py to output version 4 JSON.
https://bugs.webkit.org/show_bug.cgi?id=60869

  • Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py:
  • Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py:
  • Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py:
Location:
trunk/Tools
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r89881 r89888  
     12011-06-27  Alice Boxhall  <aboxhall@chromium.org>
     2
     3        Reviewed by Ojan Vafai.
     4
     5        Convert json_results_generator.py to output version 4 JSON.
     6        https://bugs.webkit.org/show_bug.cgi?id=60869
     7
     8        * Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py:
     9        * Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py:
     10        * Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py:
     11
    1122011-06-27  Adam Barth  <abarth@webkit.org>
    213
  • trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_layout_results_generator.py

    r89217 r89888  
    131131
    132132    # override
    133     def _convert_json_to_current_version(self, results_json):
    134         archive_version = None
    135         if self.VERSION_KEY in results_json:
    136             archive_version = results_json[self.VERSION_KEY]
    137 
    138         super(JSONLayoutResultsGenerator,
    139               self)._convert_json_to_current_version(results_json)
    140 
    141         # version 2->3
    142         if archive_version == 2:
    143             for results_for_builder in results_json.itervalues():
    144                 try:
    145                     test_results = results_for_builder[self.TESTS]
    146                 except:
    147                     continue
    148 
    149             for test in test_results:
    150                 # Make sure all paths are relative
    151                 test_path = self._get_path_relative_to_layout_test_root(test)
    152                 if test_path != test:
    153                     test_results[test_path] = test_results[test]
    154                     del test_results[test]
    155 
    156     # override
    157133    def _insert_failure_summaries(self, results_for_builder):
    158134        summary = self._result_summary
  • trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator.py

    r89217 r89888  
    6868    filesystem.write_text_file(file_path, json_string)
    6969
     70
     71def convert_trie_to_flat_paths(trie, prefix=None):
     72    """Converts the directory structure in the given trie to flat paths, prepending a prefix to each."""
     73    result = {}
     74    for name, data in trie.iteritems():
     75        if prefix:
     76            name = prefix + "/" + name
     77
     78        if not "results" in data:
     79            result.update(convert_trie_to_flat_paths(data, name))
     80        else:
     81            result[name] = data
     82
     83    return result
     84
     85
     86def add_path_to_trie(path, value, trie):
     87    """Inserts a single flat directory path and associated value into a directory trie structure."""
     88    if not "/" in path:
     89        trie[path] = value
     90        return
     91
     92    directory, slash, rest = path.partition("/")
     93    if not directory in trie:
     94        trie[directory] = {}
     95    add_path_to_trie(rest, value, trie[directory])
     96
     97
     98def convert_trie_to_flat_paths(trie, prefix=None):
     99    """Converts the directory structure in the given trie to flat paths, prepending a prefix to each."""
     100    result = {}
     101    for name, data in trie.iteritems():
     102        if prefix:
     103            name = prefix + "/" + name
     104
     105        if not "results" in data:
     106            result.update(convert_trie_to_flat_paths(data, name))
     107        else:
     108            result[name] = data
     109
     110    return result
     111
     112
     113def add_path_to_trie(path, value, trie):
     114    """Inserts a single flat directory path and associated value into a directory trie structure."""
     115    if not "/" in path:
     116        trie[path] = value
     117        return
     118
     119    directory, slash, rest = path.partition("/")
     120    if not directory in trie:
     121        trie[directory] = {}
     122    add_path_to_trie(rest, value, trie[directory])
     123
    70124def test_timings_trie(port, individual_test_timings):
    71125    """Breaks a filename into chunks by directory and puts the test time as a value in the lowest part, e.g.
     
    89143            test = test_result.filename
    90144
    91         parts = test.split('/')
    92         current_map = trie
    93         for i, part in enumerate(parts):
    94             if i == (len(parts) - 1):
    95                 current_map[part] = int(1000 * test_result.test_run_time)
    96                 break
    97 
    98             if part not in current_map:
    99                 current_map[part] = {}
    100             current_map = current_map[part]
     145        add_path_to_trie(test, int(1000 * test_result.test_run_time), trie)
     146
    101147    return trie
    102148
     
    154200                        TestResult.FLAKY: FLAKY_RESULT}
    155201
    156     VERSION = 3
     202    VERSION = 4
    157203    VERSION_KEY = "version"
    158204    RESULTS = "results"
     
    272318        tests = results_for_builder[self.TESTS]
    273319        all_failing_tests = self._get_failed_test_names()
    274         all_failing_tests.update(tests.iterkeys())
     320        all_failing_tests.update(convert_trie_to_flat_paths(tests))
     321
    275322        for test in all_failing_tests:
    276323            self._insert_test_time_and_result(test, tests)
     
    513560            self.TIME)
    514561
     562
     563
    515564    def _insert_test_time_and_result(self, test_name, tests):
    516565        """ Insert a test item with its results to the given tests dictionary.
     
    523572        time = self._get_test_timing(test_name)
    524573
    525         if test_name not in tests:
    526             tests[test_name] = self._create_results_and_times_json()
    527 
    528         thisTest = tests[test_name]
    529         if self.RESULTS in thisTest:
    530             self._insert_item_run_length_encoded(result, thisTest[self.RESULTS])
    531         else:
    532             thisTest[self.RESULTS] = [[1, result]]
    533 
    534         if self.TIMES in thisTest:
    535             self._insert_item_run_length_encoded(time, thisTest[self.TIMES])
    536         else:
    537             thisTest[self.TIMES] = [[1, time]]
     574        this_test = tests
     575        for segment in test_name.split("/"):
     576            if segment not in this_test:
     577                this_test[segment] = {}
     578            this_test = this_test[segment]
     579
     580        if not len(this_test):
     581            self._populate_results_and_times_json(this_test)
     582
     583        if self.RESULTS in this_test:
     584            self._insert_item_run_length_encoded(result, this_test[self.RESULTS])
     585        else:
     586            this_test[self.RESULTS] = [[1, result]]
     587
     588        if self.TIMES in this_test:
     589            self._insert_item_run_length_encoded(time, this_test[self.TIMES])
     590        else:
     591            this_test[self.TIMES] = [[1, time]]
    538592
    539593    def _convert_json_to_current_version(self, results_json):
     
    541595        current version and adds in the new version number.
    542596        """
    543         if (self.VERSION_KEY in results_json and
    544             results_json[self.VERSION_KEY] == self.VERSION):
     597        if self.VERSION_KEY in results_json:
     598            archive_version = results_json[self.VERSION_KEY]
     599            if archive_version == self.VERSION:
     600                return
     601        else:
     602            archive_version = 3
     603
     604        # version 3->4
     605        if archive_version == 3:
     606            num_results = len(results_json.values())
     607            for builder, results in results_json.iteritems():
     608                self._convert_tests_to_trie(results)
     609
     610        results_json[self.VERSION_KEY] = self.VERSION
     611
     612    def _convert_tests_to_trie(self, results):
     613        if not self.TESTS in results:
    545614            return
    546615
    547         results_json[self.VERSION_KEY] = self.VERSION
    548 
    549     def _create_results_and_times_json(self):
    550         results_and_times = {}
     616        test_results = results[self.TESTS]
     617        test_results_trie = {}
     618        for test in test_results.iterkeys():
     619            single_test_result = test_results[test]
     620            add_path_to_trie(test, single_test_result, test_results_trie)
     621
     622        results[self.TESTS] = test_results_trie
     623
     624    def _populate_results_and_times_json(self, results_and_times):
    551625        results_and_times[self.RESULTS] = []
    552626        results_and_times[self.TIMES] = []
  • trunk/Tools/Scripts/webkitpy/layout_tests/layout_package/json_results_generator_unittest.py

    r89217 r89888  
    157157            tests = buildinfo[JRG.TESTS]
    158158            for test_name in failed_count_map.iterkeys():
    159                 self.assertTrue(test_name in tests)
    160                 test = tests[test_name]
     159                test = self._find_test_in_trie(test_name, tests)
    161160
    162161                failed = 0
     
    174173        if fixable_count:
    175174            self.assertEqual(sum(buildinfo[JRG.FIXABLE_COUNT]), fixable_count)
     175
     176    def _find_test_in_trie(self, path, trie):
     177        nodes = path.split("/")
     178        sub_trie = trie
     179        for node in nodes:
     180            self.assertTrue(node in sub_trie)
     181            sub_trie = sub_trie[node]
     182        return sub_trie
     183
     184    def _find_test_in_trie(self, path, trie):
     185        nodes = path.split("/")
     186        sub_trie = trie
     187        for node in nodes:
     188            self.assertTrue(node in sub_trie)
     189            sub_trie = sub_trie[node]
     190        return sub_trie
    176191
    177192    def test_json_generation(self):
     
    197212            ['FLAKY_B', 'DISABLED_C', 'FAILS_D'],
    198213            ['A', 'FLAKY_E'])
     214
     215    def test_hierarchical_json_generation(self):
     216        # FIXME: Re-work tests to be more comprehensible and comprehensive.
     217        self._test_json_generation(['foo/A'], ['foo/B', 'bar/C'])
     218
     219    def test_hierarchical_json_generation(self):
     220        # FIXME: Re-work tests to be more comprehensible and comprehensive.
     221        self._test_json_generation(['foo/A'], ['foo/B', 'bar/C'])
    199222
    200223    def test_test_timings_trie(self):
Note: See TracChangeset for help on using the changeset viewer.