diff options
author | epoger <epoger@google.com> | 2014-07-17 12:54:16 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-07-17 12:54:16 -0700 |
commit | 66ed8dc4bfd63e4552a213cb17909f9fbbf59abd (patch) | |
tree | 4d48cfa8ba43750c051f542f23b48b5f953e58ea /gm/rebaseline_server | |
parent | 733418f91e4d90f4ec250d9a97120618a5a89b49 (diff) |
combine base_unittest.py modules from gm and tools
general cleanup, which will also help with http://skbug.com/2752 ('split existing "gpu" GM results into "gl" and "gles"')
R=rmistry@google.com
Author: epoger@google.com
Review URL: https://codereview.chromium.org/397103003
Diffstat (limited to 'gm/rebaseline_server')
-rwxr-xr-x | gm/rebaseline_server/base_unittest.py | 131 | ||||
-rwxr-xr-x | gm/rebaseline_server/compare_configs_test.py | 17 | ||||
-rwxr-xr-x | gm/rebaseline_server/compare_rendered_pictures_test.py | 26 | ||||
-rwxr-xr-x | gm/rebaseline_server/compare_to_expectations_test.py | 12 | ||||
-rwxr-xr-x | gm/rebaseline_server/download_actuals_test.py | 10 | ||||
-rw-r--r-- | gm/rebaseline_server/imagediffdb.py | 11 | ||||
-rwxr-xr-x | gm/rebaseline_server/imagediffdb_test.py | 10 | ||||
-rwxr-xr-x | gm/rebaseline_server/imagepair_test.py | 6 |
8 files changed, 66 insertions, 157 deletions
diff --git a/gm/rebaseline_server/base_unittest.py b/gm/rebaseline_server/base_unittest.py index 32b4bb9d74..f8fdff19c9 100755 --- a/gm/rebaseline_server/base_unittest.py +++ b/gm/rebaseline_server/base_unittest.py @@ -10,124 +10,27 @@ A wrapper around the standard Python unittest library, adding features we need for various unittests within this directory. """ -import filecmp +# System-level imports. import os -import shutil -import tempfile -import unittest +import sys -PARENT_DIR = os.path.dirname(os.path.realpath(__file__)) -TRUNK_DIR = os.path.dirname(os.path.dirname(PARENT_DIR)) -TESTDATA_DIR = os.path.join(PARENT_DIR, 'testdata') -OUTPUT_DIR_ACTUAL = os.path.join(TESTDATA_DIR, 'outputs', 'actual') -OUTPUT_DIR_EXPECTED = os.path.join(TESTDATA_DIR, 'outputs', 'expected') +PARENT_DIR = os.path.abspath(os.path.dirname(__file__)) +TRUNK_DIR = os.path.abspath(os.path.join(PARENT_DIR, os.pardir, os.pardir)) +# Import the superclass base_unittest module from the tools dir. +TOOLS_DIR = os.path.join(TRUNK_DIR, 'tools') +if TOOLS_DIR not in sys.path: + sys.path.append(TOOLS_DIR) +import tests.base_unittest as superclass_module -class TestCase(unittest.TestCase): - def setUp(self): - # Get the name of this test, in such a way that it will be consistent - # regardless of the directory it is run from (throw away package names, - # if any). - test_name = '.'.join(self.id().split('.')[-3:]) +class TestCase(superclass_module.TestCase): - self._input_dir = os.path.join(TESTDATA_DIR, 'inputs') - self._output_dir_actual = os.path.join(OUTPUT_DIR_ACTUAL, test_name) - self._output_dir_expected = os.path.join(OUTPUT_DIR_EXPECTED, test_name) - create_empty_dir(self._output_dir_actual) - self._temp_dir = tempfile.mkdtemp() + def __init__(self, *args, **kwargs): + super(TestCase, self).__init__(*args, **kwargs) + # Some of the tests within this package want their output validated, + # so we declare where the expected and actual output will be. + self._testdata_dir = os.path.join(PARENT_DIR, 'testdata') - def tearDown(self): - shutil.rmtree(self._temp_dir) - if os.path.exists(self._output_dir_expected): - different_files = find_different_files(self._output_dir_actual, - self._output_dir_expected) - # Maybe we should move this assert elsewhere? It's unusual to see an - # assert within tearDown(), but my thinking was: - # 1. Every test case will have some collection of output files that need - # to be validated. - # 2. So put that validation within tearDown(), which will be called after - # every test case! - # - # I have confirmed that the test really does fail if this assert is - # triggered. - # - # Ravi notes: if somebody later comes along and adds cleanup code below - # this assert, then if tests fail, the artifacts will not be cleaned up. - assert (not different_files), \ - ('found differing files:\n' + - '\n'.join(['tkdiff %s %s &' % ( - os.path.join(self._output_dir_actual, basename), - os.path.join(self._output_dir_expected, basename)) - for basename in different_files])) - - def shortDescription(self): - """Tell unittest framework to not print docstrings for test cases.""" - return None - - def find_path_to_program(self, program): - """Returns path to an existing program binary. - - Args: - program: Basename of the program to find (e.g., 'render_pictures'). - - Returns: - Absolute path to the program binary, as a string. - - Raises: - Exception: unable to find the program binary. - """ - possible_paths = [os.path.join(TRUNK_DIR, 'out', 'Release', program), - os.path.join(TRUNK_DIR, 'out', 'Debug', program), - os.path.join(TRUNK_DIR, 'out', 'Release', - program + '.exe'), - os.path.join(TRUNK_DIR, 'out', 'Debug', - program + '.exe')] - for try_path in possible_paths: - if os.path.isfile(try_path): - return try_path - raise Exception('cannot find %s in paths %s; maybe you need to ' - 'build %s?' % (program, possible_paths, program)) - - -def create_empty_dir(path): - """Create an empty directory at the given path.""" - if os.path.isdir(path): - shutil.rmtree(path) - elif os.path.lexists(path): - os.remove(path) - os.makedirs(path) - - -def find_different_files(dir1, dir2, ignore_subtree_names=None): - """Returns a list of any files that differ between the directory trees rooted - at dir1 and dir2. - - Args: - dir1: root of a directory tree; if nonexistent, will raise OSError - dir2: root of another directory tree; if nonexistent, will raise OSError - ignore_subtree_names: list of subtree directory names to ignore; - defaults to ['.svn'], so all SVN files are ignores - - TODO(epoger): include the dirname within each filename (not just the - basename), to make it easier to locate any differences - """ - differing_files = [] - if ignore_subtree_names is None: - ignore_subtree_names = ['.svn'] - dircmp = filecmp.dircmp(dir1, dir2, ignore=ignore_subtree_names) - differing_files.extend(dircmp.left_only) - differing_files.extend(dircmp.right_only) - differing_files.extend(dircmp.common_funny) - differing_files.extend(dircmp.diff_files) - differing_files.extend(dircmp.funny_files) - for common_dir in dircmp.common_dirs: - differing_files.extend(find_different_files( - os.path.join(dir1, common_dir), os.path.join(dir2, common_dir))) - return differing_files - - -def main(test_case_class): - """Run the unit tests within the given class.""" - suite = unittest.TestLoader().loadTestsFromTestCase(test_case_class) - unittest.TextTestRunner(verbosity=2).run(suite) +def main(*args, **kwargs): + superclass_module.main(*args, **kwargs) diff --git a/gm/rebaseline_server/compare_configs_test.py b/gm/rebaseline_server/compare_configs_test.py index 756af66156..0c701e44bf 100755 --- a/gm/rebaseline_server/compare_configs_test.py +++ b/gm/rebaseline_server/compare_configs_test.py @@ -10,22 +10,25 @@ Test compare_configs.py TODO(epoger): Create a command to update the expected results (in self._output_dir_expected) when appropriate. For now, you should: -1. examine the results in self._output_dir_actual and make sure they are ok +1. examine the results in self.output_dir_actual and make sure they are ok 2. rm -rf self._output_dir_expected -3. mv self._output_dir_actual self._output_dir_expected +3. mv self.output_dir_actual self._output_dir_expected Although, if you're using an SVN checkout, this will blow away .svn directories within self._output_dir_expected, which wouldn't be good... """ +# System-level imports import os -import sys + +# Must fix up PYTHONPATH before importing from within Skia +import fix_pythonpath # pylint: disable=W0611 # Imports from within Skia import base_unittest import compare_configs +import gm_json import results -import gm_json # must import results first, so that gm_json will be in sys.path class CompareConfigsTest(base_unittest.TestCase): @@ -34,14 +37,14 @@ class CompareConfigsTest(base_unittest.TestCase): """Process results of a GM run with the ConfigComparisons object.""" results_obj = compare_configs.ConfigComparisons( configs=('8888', 'gpu'), - actuals_root=os.path.join(self._input_dir, 'gm-actuals'), - generated_images_root=self._temp_dir, + actuals_root=os.path.join(self.input_dir, 'gm-actuals'), + generated_images_root=self.temp_dir, diff_base_url='/static/generated-images') results_obj.get_timestamp = mock_get_timestamp gm_json.WriteToFile( results_obj.get_packaged_results_of_type( results.KEY__HEADER__RESULTS_ALL), - os.path.join(self._output_dir_actual, 'gm.json')) + os.path.join(self.output_dir_actual, 'gm.json')) def mock_get_timestamp(): diff --git a/gm/rebaseline_server/compare_rendered_pictures_test.py b/gm/rebaseline_server/compare_rendered_pictures_test.py index 7656d11d10..a8041ec802 100755 --- a/gm/rebaseline_server/compare_rendered_pictures_test.py +++ b/gm/rebaseline_server/compare_rendered_pictures_test.py @@ -10,23 +10,27 @@ Test compare_rendered_pictures.py TODO(epoger): Create a command to update the expected results (in self._output_dir_expected) when appropriate. For now, you should: -1. examine the results in self._output_dir_actual and make sure they are ok +1. examine the results in self.output_dir_actual and make sure they are ok 2. rm -rf self._output_dir_expected -3. mv self._output_dir_actual self._output_dir_expected +3. mv self.output_dir_actual self._output_dir_expected Although, if you're using an SVN checkout, this will blow away .svn directories within self._output_dir_expected, which wouldn't be good... """ +# System-level imports import os import subprocess -import sys + +# Must fix up PYTHONPATH before importing from within Skia +import fix_pythonpath # pylint: disable=W0611 # Imports from within Skia import base_unittest import compare_rendered_pictures +import find_run_binary +import gm_json import results -import gm_json # must import results first, so that gm_json will be in sys.path class CompareRenderedPicturesTest(base_unittest.TestCase): @@ -48,25 +52,25 @@ class CompareRenderedPicturesTest(base_unittest.TestCase): }) results_obj = compare_rendered_pictures.RenderedPicturesComparisons( - actuals_root=self._temp_dir, + actuals_root=self.temp_dir, subdirs=('before_patch', 'after_patch'), - generated_images_root=self._temp_dir, + generated_images_root=self.temp_dir, diff_base_url='/static/generated-images') results_obj.get_timestamp = mock_get_timestamp gm_json.WriteToFile( results_obj.get_packaged_results_of_type( results.KEY__HEADER__RESULTS_ALL), - os.path.join(self._output_dir_actual, 'compare_rendered_pictures.json')) + os.path.join(self.output_dir_actual, 'compare_rendered_pictures.json')) def _generate_skps_and_run_render_pictures(self, subdir, skpdict): """Generate SKPs and run render_pictures on them. Args: - subdir: subdirectory (within self._temp_dir) to write all files into + subdir: subdirectory (within self.temp_dir) to write all files into skpdict: {skpname: redvalue} dictionary describing the SKP files to render """ - out_path = os.path.join(self._temp_dir, subdir) + out_path = os.path.join(self.temp_dir, subdir) os.makedirs(out_path) for skpname, redvalue in skpdict.iteritems(): self._run_skpmaker( @@ -75,7 +79,7 @@ class CompareRenderedPicturesTest(base_unittest.TestCase): # TODO(epoger): Add --mode tile 256 256 --writeWholeImage to the unittest, # and fix its result! (imageURLs within whole-image entries are wrong when # I tried adding that) - binary = self.find_path_to_program('render_pictures') + binary = find_run_binary.find_path_to_program('render_pictures') return subprocess.check_output([ binary, '--config', '8888', @@ -96,7 +100,7 @@ class CompareRenderedPicturesTest(base_unittest.TestCase): width: Width of canvas to create. height: Height of canvas to create. """ - binary = self.find_path_to_program('skpmaker') + binary = find_run_binary.find_path_to_program('skpmaker') return subprocess.check_output([ binary, '--red', str(red), diff --git a/gm/rebaseline_server/compare_to_expectations_test.py b/gm/rebaseline_server/compare_to_expectations_test.py index d2b2dd60ee..2997cde67f 100755 --- a/gm/rebaseline_server/compare_to_expectations_test.py +++ b/gm/rebaseline_server/compare_to_expectations_test.py @@ -10,9 +10,9 @@ Test compare_to_expectations.py TODO(epoger): Create a command to update the expected results (in self._output_dir_expected) when appropriate. For now, you should: -1. examine the results in self._output_dir_actual and make sure they are ok +1. examine the results in self.output_dir_actual and make sure they are ok 2. rm -rf self._output_dir_expected -3. mv self._output_dir_actual self._output_dir_expected +3. mv self.output_dir_actual self._output_dir_expected Although, if you're using an SVN checkout, this will blow away .svn directories within self._output_dir_expected, which wouldn't be good... @@ -32,17 +32,17 @@ class CompareToExpectationsTest(base_unittest.TestCase): def test_gm(self): """Process results of a GM run with the ExpectationComparisons object.""" - image_diff_db = imagediffdb.ImageDiffDB(storage_root=self._temp_dir) + image_diff_db = imagediffdb.ImageDiffDB(storage_root=self.temp_dir) results_obj = compare_to_expectations.ExpectationComparisons( image_diff_db=image_diff_db, - actuals_root=os.path.join(self._input_dir, 'gm-actuals'), - expected_root=os.path.join(self._input_dir, 'gm-expectations'), + actuals_root=os.path.join(self.input_dir, 'gm-actuals'), + expected_root=os.path.join(self.input_dir, 'gm-expectations'), diff_base_url='/static/generated-images') results_obj.get_timestamp = mock_get_timestamp gm_json.WriteToFile( results_obj.get_packaged_results_of_type( results.KEY__HEADER__RESULTS_ALL), - os.path.join(self._output_dir_actual, 'gm.json')) + os.path.join(self.output_dir_actual, 'gm.json')) def mock_get_timestamp(): diff --git a/gm/rebaseline_server/download_actuals_test.py b/gm/rebaseline_server/download_actuals_test.py index a74389f459..c6e7dea8e5 100755 --- a/gm/rebaseline_server/download_actuals_test.py +++ b/gm/rebaseline_server/download_actuals_test.py @@ -10,9 +10,9 @@ Test download.py TODO(epoger): Create a command to update the expected results (in self._output_dir_expected) when appropriate. For now, you should: -1. examine the results in self._output_dir_actual and make sure they are ok +1. examine the results in self.output_dir_actual and make sure they are ok 2. rm -rf self._output_dir_expected -3. mv self._output_dir_actual self._output_dir_expected +3. mv self.output_dir_actual self._output_dir_expected Although, if you're using an SVN checkout, this will blow away .svn directories within self._output_dir_expected, which wouldn't be good... @@ -36,12 +36,12 @@ class DownloadTest(base_unittest.TestCase): """Tests fetch() of GM results from actual-results.json .""" downloader = download_actuals.Download( actuals_base_url=url_utils.create_filepath_url( - os.path.join(self._input_dir, 'gm-actuals')), + os.path.join(self.input_dir, 'gm-actuals')), gm_actuals_root_url=url_utils.create_filepath_url( - os.path.join(self._input_dir, 'fake-gm-imagefiles'))) + os.path.join(self.input_dir, 'fake-gm-imagefiles'))) downloader.fetch( builder_name='Test-Android-GalaxyNexus-SGX540-Arm7-Release', - dest_dir=self._output_dir_actual) + dest_dir=self.output_dir_actual) def main(): diff --git a/gm/rebaseline_server/imagediffdb.py b/gm/rebaseline_server/imagediffdb.py index f6071f9700..89f9fef319 100644 --- a/gm/rebaseline_server/imagediffdb.py +++ b/gm/rebaseline_server/imagediffdb.py @@ -9,21 +9,20 @@ found in the LICENSE file. Calulate differences between image pairs, and store them in a database. """ +# System-level imports import contextlib import json import logging import os import re import shutil -import sys import tempfile import urllib -# Set the PYTHONPATH to include the tools directory. -sys.path.append( - os.path.join( - os.path.dirname(os.path.realpath(__file__)), os.pardir, os.pardir, - 'tools')) +# Must fix up PYTHONPATH before importing from within Skia +import fix_pythonpath # pylint: disable=W0611 + +# Imports from within Skia import find_run_binary SKPDIFF_BINARY = find_run_binary.find_path_to_program('skpdiff') diff --git a/gm/rebaseline_server/imagediffdb_test.py b/gm/rebaseline_server/imagediffdb_test.py index 4fc8c66f2b..186b2f1324 100755 --- a/gm/rebaseline_server/imagediffdb_test.py +++ b/gm/rebaseline_server/imagediffdb_test.py @@ -10,7 +10,6 @@ Test imagediffdb.py """ # System-level imports -import logging import shutil import tempfile import unittest @@ -26,11 +25,11 @@ IMG_URL_BASE = ('http://chromium-skia-gm.commondatastorage.googleapis.com/gm/' class ImageDiffDbTest(unittest.TestCase): def setUp(self): - self._temp_dir = tempfile.mkdtemp() + self.temp_dir = tempfile.mkdtemp() self.maxDiff = None def tearDown(self): - shutil.rmtree(self._temp_dir) + shutil.rmtree(self.temp_dir) def shortDescription(self): """Tell unittest framework to not print docstrings for test cases.""" @@ -38,6 +37,7 @@ class ImageDiffDbTest(unittest.TestCase): def test_sanitize_locator(self): """Test _sanitize_locator().""" + # pylint: disable=W0212 self.assertEqual(imagediffdb._sanitize_locator('simple'), 'simple') self.assertEqual(imagediffdb._sanitize_locator(1234), '1234') self.assertEqual(imagediffdb._sanitize_locator('one/two'), 'one_two') @@ -76,9 +76,9 @@ class ImageDiffDbTest(unittest.TestCase): ] # Add all image pairs to the database - db = imagediffdb.ImageDiffDB(self._temp_dir) + db = imagediffdb.ImageDiffDB(self.temp_dir) for selftest in selftests: - retval = db.add_image_pair( + db.add_image_pair( expected_image_locator=selftest[0], expected_image_url=selftest[1], actual_image_locator=selftest[2], actual_image_url=selftest[3]) diff --git a/gm/rebaseline_server/imagepair_test.py b/gm/rebaseline_server/imagepair_test.py index 14fe4c1143..ef7695acac 100755 --- a/gm/rebaseline_server/imagepair_test.py +++ b/gm/rebaseline_server/imagepair_test.py @@ -26,11 +26,11 @@ IMG_URL_BASE = ('http://chromium-skia-gm.commondatastorage.googleapis.com/' class ImagePairTest(unittest.TestCase): def setUp(self): - self._temp_dir = tempfile.mkdtemp() + self.temp_dir = tempfile.mkdtemp() self.maxDiff = None def tearDown(self): - shutil.rmtree(self._temp_dir) + shutil.rmtree(self.temp_dir) def shortDescription(self): """Tells unittest framework to not print docstrings for test cases.""" @@ -163,7 +163,7 @@ class ImagePairTest(unittest.TestCase): ], ] - db = imagediffdb.ImageDiffDB(self._temp_dir) + db = imagediffdb.ImageDiffDB(self.temp_dir) for selftest in selftests: image_pair = imagepair.ImagePair( image_diff_db=db, |