Chromium Code Reviews| Index: gm/rebaseline_server/results.py |
| =================================================================== |
| --- gm/rebaseline_server/results.py (revision 12171) |
| +++ gm/rebaseline_server/results.py (working copy) |
| @@ -29,6 +29,7 @@ |
| if GM_DIRECTORY not in sys.path: |
| sys.path.append(GM_DIRECTORY) |
| import gm_json |
| +import imagediffdb |
| IMAGE_FILENAME_RE = re.compile(gm_json.IMAGE_FILENAME_PATTERN) |
| IMAGE_FILENAME_FORMATTER = '%s_%s.png' # pass in (testname, config) |
| @@ -55,12 +56,15 @@ |
| are immutable. If you want to update the results based on updated JSON |
| file contents, you will need to create a new Results object.""" |
| - def __init__(self, actuals_root, expected_root): |
| + def __init__(self, actuals_root, expected_root, generated_images_root): |
| """ |
| Args: |
| actuals_root: root directory containing all actual-results.json files |
| expected_root: root directory containing all expected-results.json files |
| + generated_images_root: directory within which to create all pixels diffs; |
| + if this directory does not yet exist, it will be created |
| """ |
| + self._image_diff_db = imagediffdb.ImageDiffDB(generated_images_root) |
| self._actuals_root = actuals_root |
| self._expected_root = expected_root |
| self._load_actual_and_expected() |
| @@ -249,6 +253,36 @@ |
| 'for builders %s' % ( |
| expected_builders_written, actual_builders_written)) |
| + def _generate_pixel_diffs_if_needed(self, test, expected_image, actual_image): |
| + """If expected_image and actual_image both exist but are different, |
| + add the image pair to self._image_diff_db and generate pixel diffs. |
| + |
| + Args: |
| + test: string; name of test |
| + expected_image: (hashType, hashDigest) tuple describing the expected image |
| + actual_image: (hashType, hashDigest) tuple describing the actual image |
| + """ |
| + if expected_image == actual_image: |
| + return |
| + |
| + (expected_hashtype, expected_hashdigest) = expected_image |
| + (actual_hashtype, actual_hashdigest) = actual_image |
| + if None in [expected_hashtype, expected_hashdigest, |
| + actual_hashtype, actual_hashdigest]: |
| + return |
| + |
| + expected_url = gm_json.CreateGmActualUrl( |
| + test_name=test, hash_type=expected_hashtype, |
| + hash_digest=expected_hashdigest) |
| + actual_url = gm_json.CreateGmActualUrl( |
| + test_name=test, hash_type=actual_hashtype, |
| + hash_digest=actual_hashdigest) |
| + self._image_diff_db.add_image_pair( |
| + expected_image_locator=expected_hashdigest, |
| + expected_image_url=expected_url, |
| + actual_image_locator=actual_hashdigest, |
| + actual_image_url=actual_url) |
| + |
| def _load_actual_and_expected(self): |
| """Loads the results of all tests, across all builders (based on the |
| files within self._actuals_root and self._expected_root), |
| @@ -343,6 +377,9 @@ |
| updated_result_type = result_type |
| (test, config) = IMAGE_FILENAME_RE.match(image_name).groups() |
| + self._generate_pixel_diffs_if_needed( |
| + test=test, expected_image=expected_image, |
| + actual_image=actual_image) |
| results_for_this_test = { |
| 'resultType': updated_result_type, |
| 'builder': builder, |
| @@ -359,6 +396,26 @@ |
| if expectations_per_test: |
| for field in FIELDS_PASSED_THRU_VERBATIM: |
| results_for_this_test[field] = expectations_per_test.get(field) |
| + |
| + if updated_result_type == gm_json.JSONKEY_ACTUALRESULTS_NOCOMPARISON: |
| + pass # no diff record to calculate at all |
| + elif updated_result_type == gm_json.JSONKEY_ACTUALRESULTS_SUCCEEDED: |
| + results_for_this_test['percentDifferingPixels'] = 0 |
|
epoger
2013/11/07 21:11:54
There is no diff record in the nocomparison or suc
|
| + results_for_this_test['weightedDiffMeasure'] = 0 |
| + else: |
| + try: |
| + diff_record = self._image_diff_db.get_diff_record( |
| + expected_image_locator=expected_image[1], |
| + actual_image_locator=actual_image[1]) |
| + results_for_this_test['percentDifferingPixels'] = ( |
| + diff_record.get_percent_pixels_differing()) |
| + results_for_this_test['weightedDiffMeasure'] = ( |
| + diff_record.get_weighted_diff_measure()) |
| + except KeyError: |
| + logging.warning('unable to find diff_record for ("%s", "%s")' % |
| + (expected_image[1], actual_image[1])) |
| + pass |
| + |
| Results._add_to_category_dict(categories_all, results_for_this_test) |
| data_all.append(results_for_this_test) |