render_pictures unittests: run over a dir with multiple SKPs, like production
authorcommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 12 Mar 2014 20:09:46 +0000 (20:09 +0000)
committercommit-bot@chromium.org <commit-bot@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>
Wed, 12 Mar 2014 20:09:46 +0000 (20:09 +0000)
BUG=skia:1942
R=borenet@google.com

Author: epoger@google.com

Review URL: https://codereview.chromium.org/194563004

git-svn-id: http://skia.googlecode.com/svn/trunk@13775 2bbb7eff-a529-9590-31e7-b0007b416f81

tools/render_pictures_main.cpp
tools/tests/render_pictures_test.py

index bc765f7..f0609c9 100644 (file)
@@ -33,7 +33,8 @@ DEFINE_bool(writeEncodedImages, false, "Any time the skp contains an encoded ima
             "file rather than decoding it. Requires writePath to be set. Skips drawing the full "
             "skp to a file. Not compatible with deferImageDecoding.");
 DEFINE_string(writeJsonSummaryPath, "", "File to write a JSON summary of image results to. "
-              "TODO(epoger): Currently, this only works if --writePath is also specified.");
+              "TODO(epoger): Currently, this only works if --writePath is also specified. "
+              "See https://code.google.com/p/skia/issues/detail?id=2043 .");
 DEFINE_string2(writePath, w, "", "Directory to write the rendered images.");
 DEFINE_bool(writeWholeImage, false, "In tile mode, write the entire rendered image to a "
             "file, instead of an image for each tile.");
index 608df9f..fa530d5 100755 (executable)
@@ -25,18 +25,19 @@ MAX_DIFF_LENGTH = 30000
 class RenderPicturesTest(base_unittest.TestCase):
 
   def setUp(self):
+    self._input_skp_dir = tempfile.mkdtemp()
     self._temp_dir = tempfile.mkdtemp()
     self.maxDiff = MAX_DIFF_LENGTH
 
   def tearDown(self):
+    shutil.rmtree(self._input_skp_dir)
     shutil.rmtree(self._temp_dir)
 
-  def test_tiled_whole_image_no_comparison(self):
+  def test_tiled_whole_image(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,
+    self._generate_skps()
+    self._run_render_pictures(['-r', self._input_skp_dir,
                                '--bbh', 'grid', '256', '256',
                                '--mode', 'tile', '256', '256',
                                '--writeJsonSummaryPath', output_json_path,
@@ -45,59 +46,60 @@ class RenderPicturesTest(base_unittest.TestCase):
         "actual-results" : {
             "no-comparison" : {
                 # Manually verified: 640x400 red rectangle with black border
-                "input.png" : [ "bitmap-64bitMD5", 11092453015575919668 ]
+                "red.png" : [ "bitmap-64bitMD5", 11092453015575919668 ],
+                # Manually verified: 640x400 green rectangle with black border
+                "green.png" : [ "bitmap-64bitMD5", 8891695120562235492 ],
             }
         }
     }
     self._assert_json_contents(output_json_path, expected_summary_dict)
 
-  def test_untiled_no_comparison(self):
+  def test_untiled(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,
+    self._generate_skps()
+    self._run_render_pictures(['-r', self._input_skp_dir,
                                '--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],
+                "red.png" : ["bitmap-64bitMD5", 11092453015575919668],
+                # Manually verified: 640x400 green rectangle with black border
+                "green.png" : ["bitmap-64bitMD5", 8891695120562235492],
             }
         }
     }
     self._assert_json_contents(output_json_path, expected_summary_dict)
 
-  def test_validate(self):
-    """Same as test_untiled_no_comparison, but with --validate.
+  def test_untiled_validate(self):
+    """Same as test_untiled, 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.
+    test_untiled.
     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])
+    self._generate_skps()
     with self.assertRaises(Exception):
-      self._run_render_pictures(['-r', input_skp_path,
+      self._run_render_pictures(['-r', self._input_skp_dir,
                                  '--validate',
                                  '--writePath', self._temp_dir,
                                  '--writeJsonSummaryPath', output_json_path])
 
-  def test_without_writePath(self):
-    """Same as test_untiled_no_comparison, but without --writePath.
+  def test_untiled_without_writePath(self):
+    """Same as test_untiled, 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,
+    self._generate_skps()
+    self._run_render_pictures(['-r', self._input_skp_dir,
                                '--writeJsonSummaryPath', output_json_path])
     expected_summary_dict = {
         "actual-results" : {
@@ -106,12 +108,11 @@ class RenderPicturesTest(base_unittest.TestCase):
     }
     self._assert_json_contents(output_json_path, expected_summary_dict)
 
-  def test_tiled_no_comparison(self):
+  def test_tiled(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,
+    self._generate_skps()
+    self._run_render_pictures(['-r', self._input_skp_dir,
                                '--bbh', 'grid', '256', '256',
                                '--mode', 'tile', '256', '256',
                                '--writePath', self._temp_dir,
@@ -122,12 +123,21 @@ class RenderPicturesTest(base_unittest.TestCase):
                 # 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],
+                "red0.png" : ["bitmap-64bitMD5", 5815827069051002745],
+                "red1.png" : ["bitmap-64bitMD5", 9323613075234140270],
+                "red2.png" : ["bitmap-64bitMD5", 16670399404877552232],
+                "red3.png" : ["bitmap-64bitMD5", 2507897274083364964],
+                "red4.png" : ["bitmap-64bitMD5", 7325267995523877959],
+                "red5.png" : ["bitmap-64bitMD5", 2181381724594493116],
+                # Manually verified these 6 images, all 256x256 tiles,
+                # consistent with a tiled version of the 640x400 green rect
+                # with black borders.
+                "green0.png" : ["bitmap-64bitMD5", 12587324416545178013],
+                "green1.png" : ["bitmap-64bitMD5", 7624374914829746293],
+                "green2.png" : ["bitmap-64bitMD5", 5686489729535631913],
+                "green3.png" : ["bitmap-64bitMD5", 7980646035555096146],
+                "green4.png" : ["bitmap-64bitMD5", 17817086664365875131],
+                "green5.png" : ["bitmap-64bitMD5", 10673669813016809363],
             }
         }
     }
@@ -140,15 +150,34 @@ class RenderPicturesTest(base_unittest.TestCase):
                              '--config', '8888',
                              ] + args)
 
-  def _run_skpmaker(self, args):
+  def _generate_skps(self):
+    """Runs the skpmaker binary to generate files in self._input_skp_dir."""
+    self._run_skpmaker(
+        output_path=os.path.join(self._input_skp_dir, 'red.skp'), red=255)
+    self._run_skpmaker(
+        output_path=os.path.join(self._input_skp_dir, 'green.skp'), green=255)
+
+  def _run_skpmaker(self, output_path, red=0, green=0, blue=0,
+                    width=640, height=400):
+    """Runs the skpmaker binary to generate SKP with known characteristics.
+
+    Args:
+      output_path: Filepath to write the SKP into.
+      red: Value of red color channel in image, 0-255.
+      green: Value of green color channel in image, 0-255.
+      blue: Value of blue color channel in image, 0-255.
+      width: Width of canvas to create.
+      height: Height of canvas to create.
+    """
     binary = self.find_path_to_program('skpmaker')
     return self.run_command([binary,
-                             '--red', '255',
-                             '--green', '0',
-                             '--blue', '0',
-                             '--width', '640',
-                             '--height', '400',
-                             ] + args)
+                             '--red', str(red),
+                             '--green', str(green),
+                             '--blue', str(blue),
+                             '--width', str(width),
+                             '--height', str(height),
+                             '--writePath', str(output_path),
+                             ])
 
   def _assert_json_contents(self, json_path, expected_dict):
     """Asserts that contents of a JSON file are identical to expected_dict.