#!/usr/bin/python """ Copyright 2014 Google Inc. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. Test the render_pictures binary. """ # System-level imports import json import os import shutil import tempfile # Imports from within Skia import base_unittest # Maximum length of text diffs to show when tests fail MAX_DIFF_LENGTH = 30000 class RenderPicturesTest(base_unittest.TestCase): def setUp(self): self._temp_dir = tempfile.mkdtemp() self.maxDiff = MAX_DIFF_LENGTH def tearDown(self): shutil.rmtree(self._temp_dir) def test_tiled_whole_image_no_comparison(self): """Run render_pictures with tiles and --writeWholeImage flag.""" input_skp_path = os.path.join(self._temp_dir, 'input.skp') output_json_path = os.path.join(self._temp_dir, 'output.json') self._run_skpmaker(['--writePath', input_skp_path]) self._run_render_pictures(['-r', input_skp_path, '--bbh', 'grid', '256', '256', '--mode', 'tile', '256', '256', '--writeJsonSummaryPath', output_json_path, '--writeWholeImage']) expected_summary_dict = { "actual-results" : { "no-comparison" : { # Manually verified: 640x400 red rectangle with black border "input.png" : [ "bitmap-64bitMD5", 11092453015575919668 ] } } } self._assert_json_contents(output_json_path, expected_summary_dict) def test_untiled_no_comparison(self): """Run without tiles.""" input_skp_path = os.path.join(self._temp_dir, 'input.skp') output_json_path = os.path.join(self._temp_dir, 'output.json') self._run_skpmaker(['--writePath', input_skp_path]) self._run_render_pictures(['-r', input_skp_path, '--writePath', self._temp_dir, '--writeJsonSummaryPath', output_json_path]) expected_summary_dict = { "actual-results" : { "no-comparison" : { # Manually verified: 640x400 red rectangle with black border "input.png" : ["bitmap-64bitMD5", 11092453015575919668], } } } self._assert_json_contents(output_json_path, expected_summary_dict) def test_validate(self): """Same as test_untiled_no_comparison, but with --validate. TODO(epoger): This test generates undesired results! The call to render_pictures should succeed, and generate the same output as test_untiled_no_comparison. See https://code.google.com/p/skia/issues/detail?id=2044 ('render_pictures: --validate fails') """ input_skp_path = os.path.join(self._temp_dir, 'input.skp') output_json_path = os.path.join(self._temp_dir, 'output.json') self._run_skpmaker(['--writePath', input_skp_path]) with self.assertRaises(Exception): self._run_render_pictures(['-r', input_skp_path, '--validate', '--writePath', self._temp_dir, '--writeJsonSummaryPath', output_json_path]) def test_without_writePath(self): """Same as test_untiled_no_comparison, but without --writePath. TODO(epoger): This test generates undesired results! See https://code.google.com/p/skia/issues/detail?id=2043 ('render_pictures: --writeJsonSummaryPath fails unless --writePath is specified') """ input_skp_path = os.path.join(self._temp_dir, 'input.skp') output_json_path = os.path.join(self._temp_dir, 'output.json') self._run_skpmaker(['--writePath', input_skp_path]) self._run_render_pictures(['-r', input_skp_path, '--writeJsonSummaryPath', output_json_path]) expected_summary_dict = { "actual-results" : { "no-comparison" : None, } } self._assert_json_contents(output_json_path, expected_summary_dict) def test_tiled_no_comparison(self): """Generate individual tiles.""" input_skp_path = os.path.join(self._temp_dir, 'input.skp') output_json_path = os.path.join(self._temp_dir, 'output.json') self._run_skpmaker(['--writePath', input_skp_path]) self._run_render_pictures(['-r', input_skp_path, '--bbh', 'grid', '256', '256', '--mode', 'tile', '256', '256', '--writePath', self._temp_dir, '--writeJsonSummaryPath', output_json_path]) expected_summary_dict = { "actual-results" : { "no-comparison" : { # Manually verified these 6 images, all 256x256 tiles, # consistent with a tiled version of the 640x400 red rect # with black borders. "input0.png" : ["bitmap-64bitMD5", 5815827069051002745], "input1.png" : ["bitmap-64bitMD5", 9323613075234140270], "input2.png" : ["bitmap-64bitMD5", 16670399404877552232], "input3.png" : ["bitmap-64bitMD5", 2507897274083364964], "input4.png" : ["bitmap-64bitMD5", 7325267995523877959], "input5.png" : ["bitmap-64bitMD5", 2181381724594493116], } } } self._assert_json_contents(output_json_path, expected_summary_dict) def _run_render_pictures(self, args): binary = self.find_path_to_program('render_pictures') return self.run_command([binary, '--clone', '1', '--config', '8888', ] + args) def _run_skpmaker(self, args): binary = self.find_path_to_program('skpmaker') return self.run_command([binary, '--red', '255', '--green', '0', '--blue', '0', '--width', '640', '--height', '400', ] + args) def _assert_json_contents(self, json_path, expected_dict): """Asserts that contents of a JSON file are identical to expected_dict. Args: json_path: Path to a JSON file. expected_dict: Dictionary indicating the expected contents of the JSON file. Raises: 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) def main(): base_unittest.main(RenderPicturesTest) if __name__ == '__main__': main()