| Index: tools/tests/render_pictures_test.py
|
| diff --git a/tools/tests/render_pictures_test.py b/tools/tests/render_pictures_test.py
|
| index d378a546885d72221da8d9e5cf322730fd41e0a1..4b11e56ae924a8b1307419c1e3c6b95600ef0af3 100755
|
| --- a/tools/tests/render_pictures_test.py
|
| +++ b/tools/tests/render_pictures_test.py
|
| @@ -10,6 +10,7 @@ Test the render_pictures binary.
|
| """
|
|
|
| # System-level imports
|
| +import copy
|
| import json
|
| import os
|
| import shutil
|
| @@ -27,100 +28,138 @@ EXPECTED_HEADER_CONTENTS = {
|
| }
|
|
|
| # Manually verified: 640x400 red rectangle with black border
|
| +# Standard expectations will be set up in such a way that this image fails
|
| +# the comparison.
|
| RED_WHOLEIMAGE = {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 11092453015575919668,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "failed",
|
| "filepath" : "red_skp.png",
|
| }
|
|
|
| # Manually verified: 640x400 green rectangle with black border
|
| +# Standard expectations will be set up in such a way that this image passes
|
| +# the comparison.
|
| GREEN_WHOLEIMAGE = {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 8891695120562235492,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "succeeded",
|
| "filepath" : "green_skp.png",
|
| }
|
|
|
| # Manually verified these 6 images, all 256x256 tiles,
|
| # consistent with a tiled version of the 640x400 red rect
|
| # with black borders.
|
| +# Standard expectations will be set up in such a way that these images fail
|
| +# the comparison.
|
| RED_TILES = [{
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 5815827069051002745,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "failed",
|
| "filepath" : "red_skp-tile0.png",
|
| },{
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 9323613075234140270,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "failed",
|
| "filepath" : "red_skp-tile1.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 16670399404877552232,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "failed",
|
| "filepath" : "red_skp-tile2.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 2507897274083364964,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "failed",
|
| "filepath" : "red_skp-tile3.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 7325267995523877959,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "failed",
|
| "filepath" : "red_skp-tile4.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 2181381724594493116,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "failed",
|
| "filepath" : "red_skp-tile5.png",
|
| }]
|
|
|
| # Manually verified these 6 images, all 256x256 tiles,
|
| # consistent with a tiled version of the 640x400 green rect
|
| # with black borders.
|
| +# Standard expectations will be set up in such a way that these images pass
|
| +# the comparison.
|
| GREEN_TILES = [{
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 12587324416545178013,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "succeeded",
|
| "filepath" : "green_skp-tile0.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 7624374914829746293,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "succeeded",
|
| "filepath" : "green_skp-tile1.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 5686489729535631913,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "succeeded",
|
| "filepath" : "green_skp-tile2.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 7980646035555096146,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "succeeded",
|
| "filepath" : "green_skp-tile3.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 17817086664365875131,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "succeeded",
|
| "filepath" : "green_skp-tile4.png",
|
| }, {
|
| "checksumAlgorithm" : "bitmap-64bitMD5",
|
| "checksumValue" : 10673669813016809363,
|
| - "comparisonResult" : "no-comparison",
|
| + "comparisonResult" : "succeeded",
|
| "filepath" : "green_skp-tile5.png",
|
| }]
|
|
|
|
|
| +def modified_dict(input_dict, modification_dict):
|
| + """Returns a dict, with some modifications applied to it.
|
| +
|
| + Args:
|
| + input_dict: a dictionary (which will be copied, not modified in place)
|
| + modification_dict: a set of key/value pairs to overwrite in the dict
|
| + """
|
| + output_dict = input_dict.copy()
|
| + output_dict.update(modification_dict)
|
| + return output_dict
|
| +
|
| +
|
| +def modified_list_of_dicts(input_list, modification_dict):
|
| + """Returns a list of dicts, with some modifications applied to each dict.
|
| +
|
| + Args:
|
| + input_list: a list of dictionaries; these dicts will be copied, not
|
| + modified in place
|
| + modification_dict: a set of key/value pairs to overwrite in each dict
|
| + within input_list
|
| + """
|
| + output_list = []
|
| + for input_dict in input_list:
|
| + output_dict = modified_dict(input_dict, modification_dict)
|
| + output_list.append(output_dict)
|
| + return output_list
|
| +
|
| +
|
| class RenderPicturesTest(base_unittest.TestCase):
|
|
|
| def setUp(self):
|
| + self.maxDiff = MAX_DIFF_LENGTH
|
| + self._expectations_dir = tempfile.mkdtemp()
|
| self._input_skp_dir = tempfile.mkdtemp()
|
| self._temp_dir = tempfile.mkdtemp()
|
| - self.maxDiff = MAX_DIFF_LENGTH
|
|
|
| def tearDown(self):
|
| + shutil.rmtree(self._expectations_dir)
|
| shutil.rmtree(self._input_skp_dir)
|
| shutil.rmtree(self._temp_dir)
|
|
|
| @@ -137,14 +176,17 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| probably shouldn't write out red_skp.png and green_skp.png at all!
|
| See http://skbug.com/2464
|
| """
|
| - output_json_path = os.path.join(self._temp_dir, 'output.json')
|
| + output_json_path = os.path.join(self._temp_dir, 'actuals.json')
|
| self._generate_skps()
|
| - self._run_render_pictures(['-r', self._input_skp_dir,
|
| - '--bbh', 'grid', '256', '256',
|
| - '--mode', 'tile', '256', '256',
|
| - '--writeJsonSummaryPath', output_json_path,
|
| - '--writePath', self._temp_dir,
|
| - '--writeWholeImage'])
|
| + expectations_path = self._create_expectations()
|
| + self._run_render_pictures([
|
| + '-r', self._input_skp_dir,
|
| + '--bbh', 'grid', '256', '256',
|
| + '--mode', 'tile', '256', '256',
|
| + '--readJsonSummaryPath', expectations_path,
|
| + '--writeJsonSummaryPath', output_json_path,
|
| + '--writePath', self._temp_dir,
|
| + '--writeWholeImage'])
|
| expected_summary_dict = {
|
| "header" : EXPECTED_HEADER_CONTENTS,
|
| "actual-results" : {
|
| @@ -160,15 +202,50 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| }
|
| self._assert_json_contents(output_json_path, expected_summary_dict)
|
| self._assert_directory_contents(
|
| - self._temp_dir, ['red_skp.png', 'green_skp.png', 'output.json'])
|
| + self._temp_dir, ['red_skp.png', 'green_skp.png', 'actuals.json'])
|
| +
|
| + def test_missing_tile_and_whole_image(self):
|
| + """test_tiled_whole_image, but missing expectations for some images.
|
| + """
|
| + output_json_path = os.path.join(self._temp_dir, 'actuals.json')
|
| + self._generate_skps()
|
| + expectations_path = self._create_expectations(missing_some_images=True)
|
| + self._run_render_pictures([
|
| + '-r', self._input_skp_dir,
|
| + '--bbh', 'grid', '256', '256',
|
| + '--mode', 'tile', '256', '256',
|
| + '--readJsonSummaryPath', expectations_path,
|
| + '--writeJsonSummaryPath', output_json_path,
|
| + '--writePath', self._temp_dir,
|
| + '--writeWholeImage'])
|
| + modified_red_tiles = copy.deepcopy(RED_TILES)
|
| + modified_red_tiles[5]['comparisonResult'] = 'no-comparison'
|
| + expected_summary_dict = {
|
| + "header" : EXPECTED_HEADER_CONTENTS,
|
| + "actual-results" : {
|
| + "red.skp": {
|
| + "tiled-images": modified_red_tiles,
|
| + "whole-image": modified_dict(
|
| + RED_WHOLEIMAGE, {"comparisonResult" : "no-comparison"}),
|
| + },
|
| + "green.skp": {
|
| + "tiled-images": GREEN_TILES,
|
| + "whole-image": GREEN_WHOLEIMAGE,
|
| + }
|
| + }
|
| + }
|
| + self._assert_json_contents(output_json_path, expected_summary_dict)
|
|
|
| def test_untiled(self):
|
| """Run without tiles."""
|
| - output_json_path = os.path.join(self._temp_dir, 'output.json')
|
| + output_json_path = os.path.join(self._temp_dir, 'actuals.json')
|
| self._generate_skps()
|
| - self._run_render_pictures(['-r', self._input_skp_dir,
|
| - '--writePath', self._temp_dir,
|
| - '--writeJsonSummaryPath', output_json_path])
|
| + expectations_path = self._create_expectations()
|
| + self._run_render_pictures([
|
| + '-r', self._input_skp_dir,
|
| + '--readJsonSummaryPath', expectations_path,
|
| + '--writePath', self._temp_dir,
|
| + '--writeJsonSummaryPath', output_json_path])
|
| expected_summary_dict = {
|
| "header" : EXPECTED_HEADER_CONTENTS,
|
| "actual-results" : {
|
| @@ -182,11 +259,11 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| }
|
| self._assert_json_contents(output_json_path, expected_summary_dict)
|
| self._assert_directory_contents(
|
| - self._temp_dir, ['red_skp.png', 'green_skp.png', 'output.json'])
|
| + self._temp_dir, ['red_skp.png', 'green_skp.png', 'actuals.json'])
|
|
|
| def test_untiled_writeChecksumBasedFilenames(self):
|
| """Same as test_untiled, but with --writeChecksumBasedFilenames."""
|
| - output_json_path = os.path.join(self._temp_dir, 'output.json')
|
| + output_json_path = os.path.join(self._temp_dir, 'actuals.json')
|
| self._generate_skps()
|
| self._run_render_pictures(['-r', self._input_skp_dir,
|
| '--writeChecksumBasedFilenames',
|
| @@ -217,7 +294,7 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| }
|
| self._assert_json_contents(output_json_path, expected_summary_dict)
|
| self._assert_directory_contents(self._temp_dir, [
|
| - 'red_skp', 'green_skp', 'output.json'])
|
| + 'red_skp', 'green_skp', 'actuals.json'])
|
| self._assert_directory_contents(
|
| os.path.join(self._temp_dir, 'red_skp'),
|
| ['bitmap-64bitMD5_11092453015575919668.png'])
|
| @@ -227,12 +304,15 @@ class RenderPicturesTest(base_unittest.TestCase):
|
|
|
| def test_untiled_validate(self):
|
| """Same as test_untiled, but with --validate."""
|
| - output_json_path = os.path.join(self._temp_dir, 'output.json')
|
| + output_json_path = os.path.join(self._temp_dir, 'actuals.json')
|
| self._generate_skps()
|
| - self._run_render_pictures(['-r', self._input_skp_dir,
|
| - '--validate',
|
| - '--writePath', self._temp_dir,
|
| - '--writeJsonSummaryPath', output_json_path])
|
| + expectations_path = self._create_expectations()
|
| + self._run_render_pictures([
|
| + '-r', self._input_skp_dir,
|
| + '--readJsonSummaryPath', expectations_path,
|
| + '--validate',
|
| + '--writePath', self._temp_dir,
|
| + '--writeJsonSummaryPath', output_json_path])
|
| expected_summary_dict = {
|
| "header" : EXPECTED_HEADER_CONTENTS,
|
| "actual-results" : {
|
| @@ -246,14 +326,17 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| }
|
| self._assert_json_contents(output_json_path, expected_summary_dict)
|
| self._assert_directory_contents(
|
| - self._temp_dir, ['red_skp.png', 'green_skp.png', 'output.json'])
|
| + self._temp_dir, ['red_skp.png', 'green_skp.png', 'actuals.json'])
|
|
|
| def test_untiled_without_writePath(self):
|
| """Same as test_untiled, but without --writePath."""
|
| - output_json_path = os.path.join(self._temp_dir, 'output.json')
|
| + output_json_path = os.path.join(self._temp_dir, 'actuals.json')
|
| self._generate_skps()
|
| - self._run_render_pictures(['-r', self._input_skp_dir,
|
| - '--writeJsonSummaryPath', output_json_path])
|
| + expectations_path = self._create_expectations()
|
| + self._run_render_pictures([
|
| + '-r', self._input_skp_dir,
|
| + '--readJsonSummaryPath', expectations_path,
|
| + '--writeJsonSummaryPath', output_json_path])
|
| expected_summary_dict = {
|
| "header" : EXPECTED_HEADER_CONTENTS,
|
| "actual-results" : {
|
| @@ -269,13 +352,16 @@ class RenderPicturesTest(base_unittest.TestCase):
|
|
|
| def test_tiled(self):
|
| """Generate individual tiles."""
|
| - output_json_path = os.path.join(self._temp_dir, 'output.json')
|
| + output_json_path = os.path.join(self._temp_dir, 'actuals.json')
|
| self._generate_skps()
|
| - self._run_render_pictures(['-r', self._input_skp_dir,
|
| - '--bbh', 'grid', '256', '256',
|
| - '--mode', 'tile', '256', '256',
|
| - '--writePath', self._temp_dir,
|
| - '--writeJsonSummaryPath', output_json_path])
|
| + expectations_path = self._create_expectations()
|
| + self._run_render_pictures([
|
| + '-r', self._input_skp_dir,
|
| + '--bbh', 'grid', '256', '256',
|
| + '--mode', 'tile', '256', '256',
|
| + '--readJsonSummaryPath', expectations_path,
|
| + '--writePath', self._temp_dir,
|
| + '--writeJsonSummaryPath', output_json_path])
|
| expected_summary_dict = {
|
| "header" : EXPECTED_HEADER_CONTENTS,
|
| "actual-results" : {
|
| @@ -294,11 +380,11 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| 'red_skp-tile3.png', 'red_skp-tile4.png', 'red_skp-tile5.png',
|
| 'green_skp-tile0.png', 'green_skp-tile1.png', 'green_skp-tile2.png',
|
| 'green_skp-tile3.png', 'green_skp-tile4.png', 'green_skp-tile5.png',
|
| - 'output.json'])
|
| + 'actuals.json'])
|
|
|
| def test_tiled_writeChecksumBasedFilenames(self):
|
| """Same as test_tiled, but with --writeChecksumBasedFilenames."""
|
| - output_json_path = os.path.join(self._temp_dir, 'output.json')
|
| + output_json_path = os.path.join(self._temp_dir, 'actuals.json')
|
| self._generate_skps()
|
| self._run_render_pictures(['-r', self._input_skp_dir,
|
| '--bbh', 'grid', '256', '256',
|
| @@ -385,7 +471,7 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| }
|
| self._assert_json_contents(output_json_path, expected_summary_dict)
|
| self._assert_directory_contents(self._temp_dir, [
|
| - 'red_skp', 'green_skp', 'output.json'])
|
| + 'red_skp', 'green_skp', 'actuals.json'])
|
| self._assert_directory_contents(
|
| os.path.join(self._temp_dir, 'red_skp'),
|
| ['bitmap-64bitMD5_5815827069051002745.png',
|
| @@ -410,6 +496,43 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| '--config', '8888',
|
| ] + args)
|
|
|
| + def _create_expectations(self, missing_some_images=False,
|
| + rel_path='expectations.json'):
|
| + """Creates expectations JSON file within self._expectations_dir .
|
| +
|
| + Args:
|
| + missing_some_images: (bool) whether to remove expectations for a subset
|
| + of the images
|
| + rel_path: (string) relative path within self._expectations_dir to write
|
| + the expectations into
|
| +
|
| + Returns: full path to the expectations file created.
|
| + """
|
| + expectations_dict = {
|
| + "header" : EXPECTED_HEADER_CONTENTS,
|
| + "expected-results" : {
|
| + # red.skp: these should fail the comparison
|
| + "red.skp": {
|
| + "tiled-images": modified_list_of_dicts(
|
| + RED_TILES, {'checksumValue': 11111}),
|
| + "whole-image": modified_dict(
|
| + RED_WHOLEIMAGE, {'checksumValue': 22222}),
|
| + },
|
| + # green.skp: these should pass the comparison
|
| + "green.skp": {
|
| + "tiled-images": GREEN_TILES,
|
| + "whole-image": GREEN_WHOLEIMAGE,
|
| + }
|
| + }
|
| + }
|
| + if missing_some_images:
|
| + del expectations_dict['expected-results']['red.skp']['whole-image']
|
| + del expectations_dict['expected-results']['red.skp']['tiled-images'][-1]
|
| + path = os.path.join(self._expectations_dir, rel_path)
|
| + with open(path, 'w') as fh:
|
| + json.dump(expectations_dict, fh)
|
| + return path
|
| +
|
| def _generate_skps(self):
|
| """Runs the skpmaker binary to generate files in self._input_skp_dir."""
|
| self._run_skpmaker(
|
| @@ -452,7 +575,6 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| """
|
| self.assertEqual(set(os.listdir(dir_path)), set(expected_filenames))
|
|
|
| -
|
| def _assert_json_contents(self, json_path, expected_dict):
|
| """Asserts that contents of a JSON file are identical to expected_dict.
|
|
|
| @@ -465,9 +587,13 @@ class RenderPicturesTest(base_unittest.TestCase):
|
| AssertionError: contents of the JSON file are not identical to
|
| expected_dict.
|
| """
|
| - file_contents = open(json_path, 'r').read()
|
| - actual_dict = json.loads(file_contents)
|
| - self.assertEqual(actual_dict, expected_dict)
|
| + prettyprinted_expected_dict = json.dumps(expected_dict, sort_keys=True,
|
| + indent=2)
|
| + with open(json_path, 'r') as fh:
|
| + prettyprinted_json_dict = json.dumps(json.load(fh), sort_keys=True,
|
| + indent=2)
|
| + self.assertMultiLineEqual(prettyprinted_expected_dict,
|
| + prettyprinted_json_dict)
|
|
|
|
|
| def main():
|
|
|