| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 | 2 |
| 3 """ | 3 """ |
| 4 Copyright 2013 Google Inc. | 4 Copyright 2013 Google Inc. |
| 5 | 5 |
| 6 Use of this source code is governed by a BSD-style license that can be | 6 Use of this source code is governed by a BSD-style license that can be |
| 7 found in the LICENSE file. | 7 found in the LICENSE file. |
| 8 | 8 |
| 9 Repackage expected/actual GM results as needed by our HTML rebaseline viewer. | 9 Repackage expected/actual GM results as needed by our HTML rebaseline viewer. |
| 10 """ | 10 """ |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 Loads actual and expected results from all builders, except for those skipped | 58 Loads actual and expected results from all builders, except for those skipped |
| 59 by _ignore_builder(). | 59 by _ignore_builder(). |
| 60 | 60 |
| 61 Once this object has been constructed, the results (in self._results[]) | 61 Once this object has been constructed, the results (in self._results[]) |
| 62 are immutable. If you want to update the results based on updated JSON | 62 are immutable. If you want to update the results based on updated JSON |
| 63 file contents, you will need to create a new ExpectationComparisons object.""" | 63 file contents, you will need to create a new ExpectationComparisons object.""" |
| 64 | 64 |
| 65 def __init__(self, actuals_root=results.DEFAULT_ACTUALS_DIR, | 65 def __init__(self, actuals_root=results.DEFAULT_ACTUALS_DIR, |
| 66 expected_root=DEFAULT_EXPECTATIONS_DIR, | 66 expected_root=DEFAULT_EXPECTATIONS_DIR, |
| 67 generated_images_root=results.DEFAULT_GENERATED_IMAGES_ROOT, | 67 generated_images_root=results.DEFAULT_GENERATED_IMAGES_ROOT, |
| 68 diff_base_url=None): | 68 diff_base_url=None, builder_regex_list=None): |
| 69 """ | 69 """ |
| 70 Args: | 70 Args: |
| 71 actuals_root: root directory containing all actual-results.json files | 71 actuals_root: root directory containing all actual-results.json files |
| 72 expected_root: root directory containing all expected-results.json files | 72 expected_root: root directory containing all expected-results.json files |
| 73 generated_images_root: directory within which to create all pixel diffs; | 73 generated_images_root: directory within which to create all pixel diffs; |
| 74 if this directory does not yet exist, it will be created | 74 if this directory does not yet exist, it will be created |
| 75 diff_base_url: base URL within which the client should look for diff | 75 diff_base_url: base URL within which the client should look for diff |
| 76 images; if not specified, defaults to a "file:///" URL representation | 76 images; if not specified, defaults to a "file:///" URL representation |
| 77 of generated_images_root | 77 of generated_images_root |
| 78 builder_regex_list: List of regular expressions specifying which builders |
| 79 we will process. If None, process all builders. |
| 78 """ | 80 """ |
| 79 time_start = int(time.time()) | 81 time_start = int(time.time()) |
| 82 if builder_regex_list != None: |
| 83 self.set_match_builders_pattern_list(builder_regex_list) |
| 80 self._image_diff_db = imagediffdb.ImageDiffDB(generated_images_root) | 84 self._image_diff_db = imagediffdb.ImageDiffDB(generated_images_root) |
| 81 self._diff_base_url = ( | 85 self._diff_base_url = ( |
| 82 diff_base_url or | 86 diff_base_url or |
| 83 download_actuals.create_filepath_url(generated_images_root)) | 87 download_actuals.create_filepath_url(generated_images_root)) |
| 84 self._actuals_root = actuals_root | 88 self._actuals_root = actuals_root |
| 85 self._expected_root = expected_root | 89 self._expected_root = expected_root |
| 86 self._load_actual_and_expected() | 90 self._load_actual_and_expected() |
| 87 self._timestamp = int(time.time()) | 91 self._timestamp = int(time.time()) |
| 88 logging.info('Results complete; took %d seconds.' % | 92 logging.info('Results complete; took %d seconds.' % |
| 89 (self._timestamp - time_start)) | 93 (self._timestamp - time_start)) |
| (...skipping 20 matching lines...) Expand all Loading... |
| 110 results.KEY__EXTRACOLUMN__BUILDER: 'Test-Mac10.6-MacMini4.1-GeFor
ce320M-x86-Debug', | 114 results.KEY__EXTRACOLUMN__BUILDER: 'Test-Mac10.6-MacMini4.1-GeFor
ce320M-x86-Debug', |
| 111 results.KEY__EXTRACOLUMN__CONFIG: '8888', | 115 results.KEY__EXTRACOLUMN__CONFIG: '8888', |
| 112 results.KEY__EXTRACOLUMN__TEST: 'bigmatrix', | 116 results.KEY__EXTRACOLUMN__TEST: 'bigmatrix', |
| 113 }, | 117 }, |
| 114 results.KEY__NEW_IMAGE_URL: 'bitmap-64bitMD5/bigmatrix/108944080240
79689926.png', | 118 results.KEY__NEW_IMAGE_URL: 'bitmap-64bitMD5/bigmatrix/108944080240
79689926.png', |
| 115 }, | 119 }, |
| 116 ... | 120 ... |
| 117 ] | 121 ] |
| 118 | 122 |
| 119 """ | 123 """ |
| 120 expected_builder_dicts = ExpectationComparisons._read_dicts_from_root( | 124 expected_builder_dicts = self._read_dicts_from_root(self._expected_root) |
| 121 self._expected_root) | |
| 122 for mod in modifications: | 125 for mod in modifications: |
| 123 image_name = results.IMAGE_FILENAME_FORMATTER % ( | 126 image_name = results.IMAGE_FILENAME_FORMATTER % ( |
| 124 mod[imagepair.KEY__EXTRA_COLUMN_VALUES] | 127 mod[imagepair.KEY__EXTRA_COLUMN_VALUES] |
| 125 [results.KEY__EXTRACOLUMN__TEST], | 128 [results.KEY__EXTRACOLUMN__TEST], |
| 126 mod[imagepair.KEY__EXTRA_COLUMN_VALUES] | 129 mod[imagepair.KEY__EXTRA_COLUMN_VALUES] |
| 127 [results.KEY__EXTRACOLUMN__CONFIG]) | 130 [results.KEY__EXTRACOLUMN__CONFIG]) |
| 128 _, hash_type, hash_digest = gm_json.SplitGmRelativeUrl( | 131 _, hash_type, hash_digest = gm_json.SplitGmRelativeUrl( |
| 129 mod[results.KEY__NEW_IMAGE_URL]) | 132 mod[results.KEY__NEW_IMAGE_URL]) |
| 130 allowed_digests = [[hash_type, int(hash_digest)]] | 133 allowed_digests = [[hash_type, int(hash_digest)]] |
| 131 new_expectations = { | 134 new_expectations = { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 167 IOError if root does not refer to an existing directory | 170 IOError if root does not refer to an existing directory |
| 168 KeyError if the set of per-builder dictionaries written out was | 171 KeyError if the set of per-builder dictionaries written out was |
| 169 different than expected | 172 different than expected |
| 170 """ | 173 """ |
| 171 if not os.path.isdir(root): | 174 if not os.path.isdir(root): |
| 172 raise IOError('no directory found at path %s' % root) | 175 raise IOError('no directory found at path %s' % root) |
| 173 actual_builders_written = [] | 176 actual_builders_written = [] |
| 174 for dirpath, dirnames, filenames in os.walk(root): | 177 for dirpath, dirnames, filenames in os.walk(root): |
| 175 for matching_filename in fnmatch.filter(filenames, pattern): | 178 for matching_filename in fnmatch.filter(filenames, pattern): |
| 176 builder = os.path.basename(dirpath) | 179 builder = os.path.basename(dirpath) |
| 177 if ExpectationComparisons._ignore_builder(builder): | |
| 178 continue | |
| 179 per_builder_dict = meta_dict.get(builder) | 180 per_builder_dict = meta_dict.get(builder) |
| 180 if per_builder_dict is not None: | 181 if per_builder_dict is not None: |
| 181 fullpath = os.path.join(dirpath, matching_filename) | 182 fullpath = os.path.join(dirpath, matching_filename) |
| 182 gm_json.WriteToFile(per_builder_dict, fullpath) | 183 gm_json.WriteToFile(per_builder_dict, fullpath) |
| 183 actual_builders_written.append(builder) | 184 actual_builders_written.append(builder) |
| 184 | 185 |
| 185 # Check: did we write out the set of per-builder dictionaries we | 186 # Check: did we write out the set of per-builder dictionaries we |
| 186 # expected to? | 187 # expected to? |
| 187 expected_builders_written = sorted(meta_dict.keys()) | 188 expected_builders_written = sorted(meta_dict.keys()) |
| 188 actual_builders_written.sort() | 189 actual_builders_written.sort() |
| 189 if expected_builders_written != actual_builders_written: | 190 if expected_builders_written != actual_builders_written: |
| 190 raise KeyError( | 191 raise KeyError( |
| 191 'expected to write dicts for builders %s, but actually wrote them ' | 192 'expected to write dicts for builders %s, but actually wrote them ' |
| 192 'for builders %s' % ( | 193 'for builders %s' % ( |
| 193 expected_builders_written, actual_builders_written)) | 194 expected_builders_written, actual_builders_written)) |
| 194 | 195 |
| 195 def _load_actual_and_expected(self): | 196 def _load_actual_and_expected(self): |
| 196 """Loads the results of all tests, across all builders (based on the | 197 """Loads the results of all tests, across all builders (based on the |
| 197 files within self._actuals_root and self._expected_root), | 198 files within self._actuals_root and self._expected_root), |
| 198 and stores them in self._results. | 199 and stores them in self._results. |
| 199 """ | 200 """ |
| 200 logging.info('Reading actual-results JSON files from %s...' % | 201 logging.info('Reading actual-results JSON files from %s...' % |
| 201 self._actuals_root) | 202 self._actuals_root) |
| 202 actual_builder_dicts = ExpectationComparisons._read_dicts_from_root( | 203 actual_builder_dicts = self._read_dicts_from_root(self._actuals_root) |
| 203 self._actuals_root) | |
| 204 logging.info('Reading expected-results JSON files from %s...' % | 204 logging.info('Reading expected-results JSON files from %s...' % |
| 205 self._expected_root) | 205 self._expected_root) |
| 206 expected_builder_dicts = ExpectationComparisons._read_dicts_from_root( | 206 expected_builder_dicts = self._read_dicts_from_root(self._expected_root) |
| 207 self._expected_root) | |
| 208 | 207 |
| 209 all_image_pairs = imagepairset.ImagePairSet( | 208 all_image_pairs = imagepairset.ImagePairSet( |
| 210 descriptions=IMAGEPAIR_SET_DESCRIPTIONS, | 209 descriptions=IMAGEPAIR_SET_DESCRIPTIONS, |
| 211 diff_base_url=self._diff_base_url) | 210 diff_base_url=self._diff_base_url) |
| 212 failing_image_pairs = imagepairset.ImagePairSet( | 211 failing_image_pairs = imagepairset.ImagePairSet( |
| 213 descriptions=IMAGEPAIR_SET_DESCRIPTIONS, | 212 descriptions=IMAGEPAIR_SET_DESCRIPTIONS, |
| 214 diff_base_url=self._diff_base_url) | 213 diff_base_url=self._diff_base_url) |
| 215 | 214 |
| 216 all_image_pairs.ensure_extra_column_values_in_summary( | 215 all_image_pairs.ensure_extra_column_values_in_summary( |
| 217 column_id=results.KEY__EXTRACOLUMN__RESULT_TYPE, values=[ | 216 column_id=results.KEY__EXTRACOLUMN__RESULT_TYPE, values=[ |
| (...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 367 results_obj = ExpectationComparisons(actuals_root=args.actuals, | 366 results_obj = ExpectationComparisons(actuals_root=args.actuals, |
| 368 expected_root=args.expectations, | 367 expected_root=args.expectations, |
| 369 generated_images_root=args.workdir) | 368 generated_images_root=args.workdir) |
| 370 gm_json.WriteToFile( | 369 gm_json.WriteToFile( |
| 371 results_obj.get_packaged_results_of_type(results_type=args.results), | 370 results_obj.get_packaged_results_of_type(results_type=args.results), |
| 372 args.outfile) | 371 args.outfile) |
| 373 | 372 |
| 374 | 373 |
| 375 if __name__ == '__main__': | 374 if __name__ == '__main__': |
| 376 main() | 375 main() |
| OLD | NEW |