blob: a7636dc9432f21e2b6c8ffd3a6a49af19345f49b [file] [log] [blame]
commit-bot@chromium.org11f15622014-01-07 17:03:40 +00001#!/usr/bin/python
2
3"""
4Copyright 2014 Google Inc.
5
6Use of this source code is governed by a BSD-style license that can be
7found in the LICENSE file.
8
9Test the render_pictures binary.
commit-bot@chromium.org11f15622014-01-07 17:03:40 +000010"""
11
12# System-level imports
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000013import copy
commit-bot@chromium.org11f15622014-01-07 17:03:40 +000014import json
15import os
16import shutil
17import tempfile
18
epoger66ed8dc2014-07-17 12:54:16 -070019# Must fix up PYTHONPATH before importing from within Skia
20import fix_pythonpath # pylint: disable=W0611
21
commit-bot@chromium.org11f15622014-01-07 17:03:40 +000022# Imports from within Skia
23import base_unittest
epoger66ed8dc2014-07-17 12:54:16 -070024import find_run_binary
commit-bot@chromium.org11f15622014-01-07 17:03:40 +000025
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +000026# Maximum length of text diffs to show when tests fail
27MAX_DIFF_LENGTH = 30000
28
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +000029EXPECTED_HEADER_CONTENTS = {
30 "type" : "ChecksummedImages",
31 "revision" : 1,
32}
33
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000034# Manually verified: 640x400 red rectangle with black border
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000035# Standard expectations will be set up in such a way that this image fails
36# the comparison.
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000037RED_WHOLEIMAGE = {
38 "checksumAlgorithm" : "bitmap-64bitMD5",
39 "checksumValue" : 11092453015575919668,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000040 "comparisonResult" : "failed",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000041 "filepath" : "red_skp.png",
42}
43
44# Manually verified: 640x400 green rectangle with black border
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000045# Standard expectations will be set up in such a way that this image passes
46# the comparison.
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000047GREEN_WHOLEIMAGE = {
48 "checksumAlgorithm" : "bitmap-64bitMD5",
49 "checksumValue" : 8891695120562235492,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000050 "comparisonResult" : "succeeded",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000051 "filepath" : "green_skp.png",
52}
53
54# Manually verified these 6 images, all 256x256 tiles,
55# consistent with a tiled version of the 640x400 red rect
56# with black borders.
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000057# Standard expectations will be set up in such a way that these images fail
58# the comparison.
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000059RED_TILES = [{
60 "checksumAlgorithm" : "bitmap-64bitMD5",
61 "checksumValue" : 5815827069051002745,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000062 "comparisonResult" : "failed",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000063 "filepath" : "red_skp-tile0.png",
64},{
65 "checksumAlgorithm" : "bitmap-64bitMD5",
66 "checksumValue" : 9323613075234140270,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000067 "comparisonResult" : "failed",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000068 "filepath" : "red_skp-tile1.png",
69}, {
70 "checksumAlgorithm" : "bitmap-64bitMD5",
71 "checksumValue" : 16670399404877552232,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000072 "comparisonResult" : "failed",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000073 "filepath" : "red_skp-tile2.png",
74}, {
75 "checksumAlgorithm" : "bitmap-64bitMD5",
76 "checksumValue" : 2507897274083364964,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000077 "comparisonResult" : "failed",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000078 "filepath" : "red_skp-tile3.png",
79}, {
80 "checksumAlgorithm" : "bitmap-64bitMD5",
81 "checksumValue" : 7325267995523877959,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000082 "comparisonResult" : "failed",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000083 "filepath" : "red_skp-tile4.png",
84}, {
85 "checksumAlgorithm" : "bitmap-64bitMD5",
86 "checksumValue" : 2181381724594493116,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000087 "comparisonResult" : "failed",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000088 "filepath" : "red_skp-tile5.png",
89}]
90
91# Manually verified these 6 images, all 256x256 tiles,
92# consistent with a tiled version of the 640x400 green rect
93# with black borders.
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000094# Standard expectations will be set up in such a way that these images pass
95# the comparison.
commit-bot@chromium.org4610a462014-04-29 19:39:22 +000096GREEN_TILES = [{
97 "checksumAlgorithm" : "bitmap-64bitMD5",
98 "checksumValue" : 12587324416545178013,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +000099 "comparisonResult" : "succeeded",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000100 "filepath" : "green_skp-tile0.png",
101}, {
102 "checksumAlgorithm" : "bitmap-64bitMD5",
103 "checksumValue" : 7624374914829746293,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000104 "comparisonResult" : "succeeded",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000105 "filepath" : "green_skp-tile1.png",
106}, {
107 "checksumAlgorithm" : "bitmap-64bitMD5",
108 "checksumValue" : 5686489729535631913,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000109 "comparisonResult" : "succeeded",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000110 "filepath" : "green_skp-tile2.png",
111}, {
112 "checksumAlgorithm" : "bitmap-64bitMD5",
113 "checksumValue" : 7980646035555096146,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000114 "comparisonResult" : "succeeded",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000115 "filepath" : "green_skp-tile3.png",
116}, {
117 "checksumAlgorithm" : "bitmap-64bitMD5",
118 "checksumValue" : 17817086664365875131,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000119 "comparisonResult" : "succeeded",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000120 "filepath" : "green_skp-tile4.png",
121}, {
122 "checksumAlgorithm" : "bitmap-64bitMD5",
123 "checksumValue" : 10673669813016809363,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000124 "comparisonResult" : "succeeded",
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000125 "filepath" : "green_skp-tile5.png",
126}]
127
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000128
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000129def modified_dict(input_dict, modification_dict):
130 """Returns a dict, with some modifications applied to it.
131
132 Args:
133 input_dict: a dictionary (which will be copied, not modified in place)
134 modification_dict: a set of key/value pairs to overwrite in the dict
135 """
136 output_dict = input_dict.copy()
137 output_dict.update(modification_dict)
138 return output_dict
139
140
141def modified_list_of_dicts(input_list, modification_dict):
142 """Returns a list of dicts, with some modifications applied to each dict.
143
144 Args:
145 input_list: a list of dictionaries; these dicts will be copied, not
146 modified in place
147 modification_dict: a set of key/value pairs to overwrite in each dict
148 within input_list
149 """
150 output_list = []
151 for input_dict in input_list:
152 output_dict = modified_dict(input_dict, modification_dict)
153 output_list.append(output_dict)
154 return output_list
155
156
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000157class RenderPicturesTest(base_unittest.TestCase):
158
159 def setUp(self):
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000160 self.maxDiff = MAX_DIFF_LENGTH
161 self._expectations_dir = tempfile.mkdtemp()
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000162 self._input_skp_dir = tempfile.mkdtemp()
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000163 # All output of render_pictures binary will go into this directory.
164 self._output_dir = tempfile.mkdtemp()
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000165
166 def tearDown(self):
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000167 shutil.rmtree(self._expectations_dir)
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000168 shutil.rmtree(self._input_skp_dir)
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000169 shutil.rmtree(self._output_dir)
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000170
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000171 def test_tiled_whole_image(self):
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000172 """Run render_pictures with tiles and --writeWholeImage flag.
173
174 TODO(epoger): This test generates undesired results! The JSON summary
175 includes both whole-image and tiled-images (as it should), but only
176 whole-images are written out to disk. See http://skbug.com/2463
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000177 Once I fix that, I should add a similar test that exercises mismatchPath.
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000178
179 TODO(epoger): I noticed that when this is run without --writePath being
180 specified, this test writes red_skp.png and green_skp.png to the current
181 directory. We should fix that... if --writePath is not specified, this
182 probably shouldn't write out red_skp.png and green_skp.png at all!
183 See http://skbug.com/2464
184 """
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000185 output_json_path = os.path.join(self._output_dir, 'actuals.json')
186 write_path_dir = self.create_empty_dir(
187 path=os.path.join(self._output_dir, 'writePath'))
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000188 self._generate_skps()
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000189 expectations_path = self._create_expectations()
190 self._run_render_pictures([
191 '-r', self._input_skp_dir,
192 '--bbh', 'grid', '256', '256',
193 '--mode', 'tile', '256', '256',
194 '--readJsonSummaryPath', expectations_path,
195 '--writeJsonSummaryPath', output_json_path,
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000196 '--writePath', write_path_dir,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000197 '--writeWholeImage'])
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000198 expected_summary_dict = {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000199 "header" : EXPECTED_HEADER_CONTENTS,
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000200 "actual-results" : {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000201 "red.skp": {
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000202 "tiled-images": RED_TILES,
203 "whole-image": RED_WHOLEIMAGE,
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000204 },
205 "green.skp": {
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000206 "tiled-images": GREEN_TILES,
207 "whole-image": GREEN_WHOLEIMAGE,
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000208 }
209 }
commit-bot@chromium.org238771c2014-01-15 16:33:31 +0000210 }
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000211 self._assert_json_contents(output_json_path, expected_summary_dict)
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000212 self._assert_directory_contents(
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000213 write_path_dir, ['red_skp.png', 'green_skp.png'])
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000214
215 def test_missing_tile_and_whole_image(self):
216 """test_tiled_whole_image, but missing expectations for some images.
217 """
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000218 output_json_path = os.path.join(self._output_dir, 'actuals.json')
219 write_path_dir = self.create_empty_dir(
220 path=os.path.join(self._output_dir, 'writePath'))
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000221 self._generate_skps()
222 expectations_path = self._create_expectations(missing_some_images=True)
223 self._run_render_pictures([
224 '-r', self._input_skp_dir,
225 '--bbh', 'grid', '256', '256',
226 '--mode', 'tile', '256', '256',
227 '--readJsonSummaryPath', expectations_path,
228 '--writeJsonSummaryPath', output_json_path,
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000229 '--writePath', write_path_dir,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000230 '--writeWholeImage'])
231 modified_red_tiles = copy.deepcopy(RED_TILES)
232 modified_red_tiles[5]['comparisonResult'] = 'no-comparison'
233 expected_summary_dict = {
234 "header" : EXPECTED_HEADER_CONTENTS,
235 "actual-results" : {
236 "red.skp": {
237 "tiled-images": modified_red_tiles,
238 "whole-image": modified_dict(
239 RED_WHOLEIMAGE, {"comparisonResult" : "no-comparison"}),
240 },
241 "green.skp": {
242 "tiled-images": GREEN_TILES,
243 "whole-image": GREEN_WHOLEIMAGE,
244 }
245 }
246 }
247 self._assert_json_contents(output_json_path, expected_summary_dict)
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000248
commit-bot@chromium.orgabeb9582014-05-19 15:25:10 +0000249 def _test_untiled(self, expectations_path=None, expected_summary_dict=None,
250 additional_args=None):
251 """Base for multiple tests without tiles.
252
253 Args:
254 expectations_path: path we should pass using --readJsonSummaryPath, or
255 None if we should create the default expectations file
256 expected_summary_dict: dict we should compare against the output actual
257 results summary, or None if we should use a default comparison dict
258 additional_args: array of command-line args to add when we run
259 render_pictures
260 """
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000261 output_json_path = os.path.join(self._output_dir, 'actuals.json')
262 write_path_dir = self.create_empty_dir(
263 path=os.path.join(self._output_dir, 'writePath'))
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000264 self._generate_skps()
commit-bot@chromium.orgabeb9582014-05-19 15:25:10 +0000265 if expectations_path == None:
266 expectations_path = self._create_expectations()
267 args = [
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000268 '-r', self._input_skp_dir,
269 '--readJsonSummaryPath', expectations_path,
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000270 '--writePath', write_path_dir,
commit-bot@chromium.orgabeb9582014-05-19 15:25:10 +0000271 '--writeJsonSummaryPath', output_json_path,
272 ]
273 if additional_args:
274 args.extend(additional_args)
275 self._run_render_pictures(args)
276 if expected_summary_dict == None:
277 expected_summary_dict = {
278 "header" : EXPECTED_HEADER_CONTENTS,
279 "actual-results" : {
280 "red.skp": {
281 "whole-image": RED_WHOLEIMAGE,
282 },
283 "green.skp": {
284 "whole-image": GREEN_WHOLEIMAGE,
285 }
286 }
287 }
288 self._assert_json_contents(output_json_path, expected_summary_dict)
289 self._assert_directory_contents(
290 write_path_dir, ['red_skp.png', 'green_skp.png'])
291
292 def test_untiled(self):
293 """Basic test without tiles."""
294 self._test_untiled()
295
296 def test_untiled_empty_expectations_file(self):
297 """Same as test_untiled, but with an empty expectations file."""
298 expectations_path = os.path.join(self._expectations_dir, 'empty')
epoger66ed8dc2014-07-17 12:54:16 -0700299 with open(expectations_path, 'w'):
commit-bot@chromium.orgabeb9582014-05-19 15:25:10 +0000300 pass
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +0000301 expected_summary_dict = {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000302 "header" : EXPECTED_HEADER_CONTENTS,
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +0000303 "actual-results" : {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000304 "red.skp": {
commit-bot@chromium.orgabeb9582014-05-19 15:25:10 +0000305 "whole-image": modified_dict(
306 RED_WHOLEIMAGE, {"comparisonResult" : "no-comparison"}),
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000307 },
308 "green.skp": {
commit-bot@chromium.orgabeb9582014-05-19 15:25:10 +0000309 "whole-image": modified_dict(
310 GREEN_WHOLEIMAGE, {"comparisonResult" : "no-comparison"}),
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +0000311 }
312 }
313 }
commit-bot@chromium.orgabeb9582014-05-19 15:25:10 +0000314 self._test_untiled(expectations_path=expectations_path,
315 expected_summary_dict=expected_summary_dict)
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000316
317 def test_untiled_writeChecksumBasedFilenames(self):
318 """Same as test_untiled, but with --writeChecksumBasedFilenames."""
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000319 output_json_path = os.path.join(self._output_dir, 'actuals.json')
320 write_path_dir = self.create_empty_dir(
321 path=os.path.join(self._output_dir, 'writePath'))
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000322 self._generate_skps()
323 self._run_render_pictures(['-r', self._input_skp_dir,
324 '--writeChecksumBasedFilenames',
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000325 '--writePath', write_path_dir,
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000326 '--writeJsonSummaryPath', output_json_path])
327 expected_summary_dict = {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000328 "header" : EXPECTED_HEADER_CONTENTS,
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000329 "actual-results" : {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000330 "red.skp": {
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000331 # Manually verified: 640x400 red rectangle with black border
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000332 "whole-image": {
333 "checksumAlgorithm" : "bitmap-64bitMD5",
334 "checksumValue" : 11092453015575919668,
335 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700336 "filepath" :
337 "red_skp/bitmap-64bitMD5_11092453015575919668.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000338 },
339 },
340 "green.skp": {
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000341 # Manually verified: 640x400 green rectangle with black border
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000342 "whole-image": {
343 "checksumAlgorithm" : "bitmap-64bitMD5",
344 "checksumValue" : 8891695120562235492,
345 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700346 "filepath" :
347 "green_skp/bitmap-64bitMD5_8891695120562235492.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000348 },
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000349 }
350 }
351 }
352 self._assert_json_contents(output_json_path, expected_summary_dict)
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000353 self._assert_directory_contents(write_path_dir, ['red_skp', 'green_skp'])
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000354 self._assert_directory_contents(
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000355 os.path.join(write_path_dir, 'red_skp'),
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000356 ['bitmap-64bitMD5_11092453015575919668.png'])
357 self._assert_directory_contents(
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000358 os.path.join(write_path_dir, 'green_skp'),
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000359 ['bitmap-64bitMD5_8891695120562235492.png'])
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000360
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000361 def test_untiled_validate(self):
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000362 """Same as test_untiled, but with --validate."""
commit-bot@chromium.orgabeb9582014-05-19 15:25:10 +0000363 self._test_untiled(additional_args=['--validate'])
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +0000364
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000365 def test_untiled_without_writePath(self):
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000366 """Same as test_untiled, but without --writePath."""
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000367 output_json_path = os.path.join(self._output_dir, 'actuals.json')
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000368 self._generate_skps()
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000369 expectations_path = self._create_expectations()
370 self._run_render_pictures([
371 '-r', self._input_skp_dir,
372 '--readJsonSummaryPath', expectations_path,
373 '--writeJsonSummaryPath', output_json_path])
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +0000374 expected_summary_dict = {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000375 "header" : EXPECTED_HEADER_CONTENTS,
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000376 "actual-results" : {
377 "red.skp": {
378 "whole-image": RED_WHOLEIMAGE,
379 },
380 "green.skp": {
381 "whole-image": GREEN_WHOLEIMAGE,
382 }
383 }
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +0000384 }
385 self._assert_json_contents(output_json_path, expected_summary_dict)
386
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000387 def test_tiled(self):
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +0000388 """Generate individual tiles."""
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000389 output_json_path = os.path.join(self._output_dir, 'actuals.json')
390 write_path_dir = self.create_empty_dir(
391 path=os.path.join(self._output_dir, 'writePath'))
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000392 self._generate_skps()
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000393 expectations_path = self._create_expectations()
394 self._run_render_pictures([
395 '-r', self._input_skp_dir,
396 '--bbh', 'grid', '256', '256',
397 '--mode', 'tile', '256', '256',
398 '--readJsonSummaryPath', expectations_path,
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000399 '--writePath', write_path_dir,
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000400 '--writeJsonSummaryPath', output_json_path])
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000401 expected_summary_dict = {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000402 "header" : EXPECTED_HEADER_CONTENTS,
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000403 "actual-results" : {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000404 "red.skp": {
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000405 "tiled-images": RED_TILES,
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000406 },
407 "green.skp": {
commit-bot@chromium.org4610a462014-04-29 19:39:22 +0000408 "tiled-images": GREEN_TILES,
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000409 }
410 }
commit-bot@chromium.orgc3147c62014-01-15 20:35:54 +0000411 }
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000412 self._assert_json_contents(output_json_path, expected_summary_dict)
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000413 self._assert_directory_contents(
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000414 write_path_dir,
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000415 ['red_skp-tile0.png', 'red_skp-tile1.png', 'red_skp-tile2.png',
416 'red_skp-tile3.png', 'red_skp-tile4.png', 'red_skp-tile5.png',
417 'green_skp-tile0.png', 'green_skp-tile1.png', 'green_skp-tile2.png',
418 'green_skp-tile3.png', 'green_skp-tile4.png', 'green_skp-tile5.png',
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000419 ])
420
421 def test_tiled_mismatches(self):
422 """Same as test_tiled, but only write out mismatching images."""
423 output_json_path = os.path.join(self._output_dir, 'actuals.json')
424 mismatch_path_dir = self.create_empty_dir(
425 path=os.path.join(self._output_dir, 'mismatchPath'))
426 self._generate_skps()
427 expectations_path = self._create_expectations()
428 self._run_render_pictures([
429 '-r', self._input_skp_dir,
430 '--bbh', 'grid', '256', '256',
431 '--mode', 'tile', '256', '256',
432 '--readJsonSummaryPath', expectations_path,
433 '--mismatchPath', mismatch_path_dir,
434 '--writeJsonSummaryPath', output_json_path])
435 expected_summary_dict = {
436 "header" : EXPECTED_HEADER_CONTENTS,
437 "actual-results" : {
438 "red.skp": {
439 "tiled-images": RED_TILES,
440 },
441 "green.skp": {
442 "tiled-images": GREEN_TILES,
443 }
444 }
445 }
446 self._assert_json_contents(output_json_path, expected_summary_dict)
447 self._assert_directory_contents(
448 mismatch_path_dir,
449 ['red_skp-tile0.png', 'red_skp-tile1.png', 'red_skp-tile2.png',
450 'red_skp-tile3.png', 'red_skp-tile4.png', 'red_skp-tile5.png',
451 ])
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000452
453 def test_tiled_writeChecksumBasedFilenames(self):
454 """Same as test_tiled, but with --writeChecksumBasedFilenames."""
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000455 output_json_path = os.path.join(self._output_dir, 'actuals.json')
456 write_path_dir = self.create_empty_dir(
457 path=os.path.join(self._output_dir, 'writePath'))
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000458 self._generate_skps()
459 self._run_render_pictures(['-r', self._input_skp_dir,
460 '--bbh', 'grid', '256', '256',
461 '--mode', 'tile', '256', '256',
462 '--writeChecksumBasedFilenames',
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000463 '--writePath', write_path_dir,
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000464 '--writeJsonSummaryPath', output_json_path])
465 expected_summary_dict = {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000466 "header" : EXPECTED_HEADER_CONTENTS,
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000467 "actual-results" : {
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000468 "red.skp": {
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000469 # Manually verified these 6 images, all 256x256 tiles,
470 # consistent with a tiled version of the 640x400 red rect
471 # with black borders.
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000472 "tiled-images": [{
473 "checksumAlgorithm" : "bitmap-64bitMD5",
474 "checksumValue" : 5815827069051002745,
475 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700476 "filepath" :
477 "red_skp/bitmap-64bitMD5_5815827069051002745.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000478 }, {
479 "checksumAlgorithm" : "bitmap-64bitMD5",
480 "checksumValue" : 9323613075234140270,
481 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700482 "filepath" :
483 "red_skp/bitmap-64bitMD5_9323613075234140270.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000484 }, {
485 "checksumAlgorithm" : "bitmap-64bitMD5",
486 "checksumValue" : 16670399404877552232,
487 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700488 "filepath" :
489 "red_skp/bitmap-64bitMD5_16670399404877552232.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000490 }, {
491 "checksumAlgorithm" : "bitmap-64bitMD5",
492 "checksumValue" : 2507897274083364964,
493 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700494 "filepath" :
495 "red_skp/bitmap-64bitMD5_2507897274083364964.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000496 }, {
497 "checksumAlgorithm" : "bitmap-64bitMD5",
498 "checksumValue" : 7325267995523877959,
499 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700500 "filepath" :
501 "red_skp/bitmap-64bitMD5_7325267995523877959.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000502 }, {
503 "checksumAlgorithm" : "bitmap-64bitMD5",
504 "checksumValue" : 2181381724594493116,
505 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700506 "filepath" :
507 "red_skp/bitmap-64bitMD5_2181381724594493116.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000508 }],
509 },
510 "green.skp": {
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000511 # Manually verified these 6 images, all 256x256 tiles,
512 # consistent with a tiled version of the 640x400 green rect
513 # with black borders.
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000514 "tiled-images": [{
515 "checksumAlgorithm" : "bitmap-64bitMD5",
516 "checksumValue" : 12587324416545178013,
517 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700518 "filepath" :
519 "green_skp/bitmap-64bitMD5_12587324416545178013.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000520 }, {
521 "checksumAlgorithm" : "bitmap-64bitMD5",
522 "checksumValue" : 7624374914829746293,
523 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700524 "filepath" :
525 "green_skp/bitmap-64bitMD5_7624374914829746293.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000526 }, {
527 "checksumAlgorithm" : "bitmap-64bitMD5",
528 "checksumValue" : 5686489729535631913,
529 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700530 "filepath" :
531 "green_skp/bitmap-64bitMD5_5686489729535631913.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000532 }, {
533 "checksumAlgorithm" : "bitmap-64bitMD5",
534 "checksumValue" : 7980646035555096146,
535 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700536 "filepath" :
537 "green_skp/bitmap-64bitMD5_7980646035555096146.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000538 }, {
539 "checksumAlgorithm" : "bitmap-64bitMD5",
540 "checksumValue" : 17817086664365875131,
541 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700542 "filepath" :
543 "green_skp/bitmap-64bitMD5_17817086664365875131.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000544 }, {
545 "checksumAlgorithm" : "bitmap-64bitMD5",
546 "checksumValue" : 10673669813016809363,
547 "comparisonResult" : "no-comparison",
epoger66ed8dc2014-07-17 12:54:16 -0700548 "filepath" :
549 "green_skp/bitmap-64bitMD5_10673669813016809363.png",
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000550 }],
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000551 }
552 }
553 }
554 self._assert_json_contents(output_json_path, expected_summary_dict)
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000555 self._assert_directory_contents(write_path_dir, ['red_skp', 'green_skp'])
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000556 self._assert_directory_contents(
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000557 os.path.join(write_path_dir, 'red_skp'),
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000558 ['bitmap-64bitMD5_5815827069051002745.png',
559 'bitmap-64bitMD5_9323613075234140270.png',
560 'bitmap-64bitMD5_16670399404877552232.png',
561 'bitmap-64bitMD5_2507897274083364964.png',
562 'bitmap-64bitMD5_7325267995523877959.png',
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000563 'bitmap-64bitMD5_2181381724594493116.png'])
564 self._assert_directory_contents(
commit-bot@chromium.org3f045172014-05-15 15:10:48 +0000565 os.path.join(write_path_dir, 'green_skp'),
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000566 ['bitmap-64bitMD5_12587324416545178013.png',
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000567 'bitmap-64bitMD5_7624374914829746293.png',
568 'bitmap-64bitMD5_5686489729535631913.png',
569 'bitmap-64bitMD5_7980646035555096146.png',
570 'bitmap-64bitMD5_17817086664365875131.png',
commit-bot@chromium.org24c568c2014-04-10 15:39:02 +0000571 'bitmap-64bitMD5_10673669813016809363.png'])
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000572
573 def _run_render_pictures(self, args):
epoger66ed8dc2014-07-17 12:54:16 -0700574 binary = find_run_binary.find_path_to_program('render_pictures')
575 return find_run_binary.run_command(
576 [binary, '--config', '8888'] + args)
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000577
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000578 def _create_expectations(self, missing_some_images=False,
579 rel_path='expectations.json'):
580 """Creates expectations JSON file within self._expectations_dir .
581
582 Args:
583 missing_some_images: (bool) whether to remove expectations for a subset
584 of the images
585 rel_path: (string) relative path within self._expectations_dir to write
586 the expectations into
587
588 Returns: full path to the expectations file created.
589 """
590 expectations_dict = {
591 "header" : EXPECTED_HEADER_CONTENTS,
592 "expected-results" : {
593 # red.skp: these should fail the comparison
594 "red.skp": {
595 "tiled-images": modified_list_of_dicts(
596 RED_TILES, {'checksumValue': 11111}),
597 "whole-image": modified_dict(
598 RED_WHOLEIMAGE, {'checksumValue': 22222}),
599 },
600 # green.skp: these should pass the comparison
601 "green.skp": {
602 "tiled-images": GREEN_TILES,
603 "whole-image": GREEN_WHOLEIMAGE,
604 }
605 }
606 }
607 if missing_some_images:
608 del expectations_dict['expected-results']['red.skp']['whole-image']
609 del expectations_dict['expected-results']['red.skp']['tiled-images'][-1]
610 path = os.path.join(self._expectations_dir, rel_path)
611 with open(path, 'w') as fh:
612 json.dump(expectations_dict, fh)
613 return path
614
commit-bot@chromium.orgf11943f2014-03-12 20:09:46 +0000615 def _generate_skps(self):
616 """Runs the skpmaker binary to generate files in self._input_skp_dir."""
617 self._run_skpmaker(
618 output_path=os.path.join(self._input_skp_dir, 'red.skp'), red=255)
619 self._run_skpmaker(
620 output_path=os.path.join(self._input_skp_dir, 'green.skp'), green=255)
621
622 def _run_skpmaker(self, output_path, red=0, green=0, blue=0,
623 width=640, height=400):
624 """Runs the skpmaker binary to generate SKP with known characteristics.
625
626 Args:
627 output_path: Filepath to write the SKP into.
628 red: Value of red color channel in image, 0-255.
629 green: Value of green color channel in image, 0-255.
630 blue: Value of blue color channel in image, 0-255.
631 width: Width of canvas to create.
632 height: Height of canvas to create.
633 """
epoger66ed8dc2014-07-17 12:54:16 -0700634 binary = find_run_binary.find_path_to_program('skpmaker')
635 return find_run_binary.run_command([
636 binary,
637 '--red', str(red),
638 '--green', str(green),
639 '--blue', str(blue),
640 '--width', str(width),
641 '--height', str(height),
642 '--writePath', str(output_path),
643 ])
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000644
commit-bot@chromium.orgf5e315c2014-03-19 17:26:07 +0000645 def _assert_directory_contents(self, dir_path, expected_filenames):
646 """Asserts that files found in a dir are identical to expected_filenames.
647
648 Args:
649 dir_path: Path to a directory on local disk.
650 expected_filenames: Set containing the expected filenames within the dir.
651
652 Raises:
653 AssertionError: contents of the directory are not identical to
654 expected_filenames.
655 """
656 self.assertEqual(set(os.listdir(dir_path)), set(expected_filenames))
657
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000658 def _assert_json_contents(self, json_path, expected_dict):
659 """Asserts that contents of a JSON file are identical to expected_dict.
660
661 Args:
662 json_path: Path to a JSON file.
663 expected_dict: Dictionary indicating the expected contents of the JSON
664 file.
665
666 Raises:
667 AssertionError: contents of the JSON file are not identical to
668 expected_dict.
669 """
commit-bot@chromium.org205ce482014-05-12 15:37:20 +0000670 prettyprinted_expected_dict = json.dumps(expected_dict, sort_keys=True,
671 indent=2)
672 with open(json_path, 'r') as fh:
673 prettyprinted_json_dict = json.dumps(json.load(fh), sort_keys=True,
674 indent=2)
675 self.assertMultiLineEqual(prettyprinted_expected_dict,
676 prettyprinted_json_dict)
commit-bot@chromium.org11f15622014-01-07 17:03:40 +0000677
678
679def main():
680 base_unittest.main(RenderPicturesTest)
681
682
683if __name__ == '__main__':
684 main()