aboutsummaryrefslogtreecommitdiffhomepage
path: root/gm/rebaseline_server
diff options
context:
space:
mode:
authorGravatar epoger <epoger@google.com>2014-07-17 12:54:16 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2014-07-17 12:54:16 -0700
commit66ed8dc4bfd63e4552a213cb17909f9fbbf59abd (patch)
tree4d48cfa8ba43750c051f542f23b48b5f953e58ea /gm/rebaseline_server
parent733418f91e4d90f4ec250d9a97120618a5a89b49 (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-xgm/rebaseline_server/base_unittest.py131
-rwxr-xr-xgm/rebaseline_server/compare_configs_test.py17
-rwxr-xr-xgm/rebaseline_server/compare_rendered_pictures_test.py26
-rwxr-xr-xgm/rebaseline_server/compare_to_expectations_test.py12
-rwxr-xr-xgm/rebaseline_server/download_actuals_test.py10
-rw-r--r--gm/rebaseline_server/imagediffdb.py11
-rwxr-xr-xgm/rebaseline_server/imagediffdb_test.py10
-rwxr-xr-xgm/rebaseline_server/imagepair_test.py6
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,