| #!/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 imagepair.py |
| """ |
| |
| # System-level imports |
| import shutil |
| import tempfile |
| import unittest |
| |
| # Local imports |
| import imagediffdb |
| import imagepair |
| |
| |
| IMG_URL_BASE = ('http://chromium-skia-gm.commondatastorage.googleapis.com/' |
| 'gm/bitmap-64bitMD5/') |
| |
| |
| class ImagePairTest(unittest.TestCase): |
| |
| def setUp(self): |
| self.temp_dir = tempfile.mkdtemp() |
| self.maxDiff = None |
| |
| def tearDown(self): |
| shutil.rmtree(self.temp_dir) |
| |
| def shortDescription(self): |
| """Tells unittest framework to not print docstrings for test cases.""" |
| return None |
| |
| def test_endToEnd(self): |
| """Tests ImagePair, using a real ImageDiffDB to download real images. |
| |
| TODO(epoger): Either in addition to or instead of this end-to-end test, |
| we should perform some tests using either: |
| 1. a mock ImageDiffDB, or |
| 2. a real ImageDiffDB that doesn't hit Google Storage looking for input |
| image files (maybe a file:// IMG_URL_BASE) |
| """ |
| # params for each self-test: |
| # |
| # inputs: |
| # 0. imageA_relative_URL |
| # 1. imageB_relative_URL |
| # 2. expectations dict |
| # 3. extra_columns dict |
| # expected output: |
| # 4. expected result of ImagePair.as_dict() |
| selftests = [ |
| [ |
| # inputs: |
| 'arcofzorro/16206093933823793653.png', |
| 'arcofzorro/16206093933823793653.png', |
| None, |
| { |
| 'builder': 'MyBuilder', |
| 'test': 'MyTest', |
| }, |
| # expected output: |
| { |
| 'extraColumns': { |
| 'builder': 'MyBuilder', |
| 'test': 'MyTest', |
| }, |
| 'imageAUrl': 'arcofzorro/16206093933823793653.png', |
| 'imageBUrl': 'arcofzorro/16206093933823793653.png', |
| 'isDifferent': False, |
| }, |
| ], |
| |
| [ |
| # inputs: |
| 'arcofzorro/16206093933823793653.png', |
| 'arcofzorro/13786535001616823825.png', |
| None, |
| None, |
| # expected output: |
| { |
| 'differenceData': { |
| 'maxDiffPerChannel': [255, 255, 247], |
| 'numDifferingPixels': 662, |
| 'percentDifferingPixels': 0.0662, |
| 'perceptualDifference': 0.06620300000000157, |
| }, |
| 'imageAUrl': 'arcofzorro/16206093933823793653.png', |
| 'imageBUrl': 'arcofzorro/13786535001616823825.png', |
| 'isDifferent': True, |
| }, |
| ], |
| |
| [ |
| # inputs: |
| 'gradients_degenerate_2pt/10552995703607727960.png', |
| 'gradients_degenerate_2pt/11198253335583713230.png', |
| { |
| 'ignoreFailure': True, |
| 'bugs': [1001, 1002], |
| }, |
| { |
| 'builder': 'MyBuilder', |
| 'test': 'MyTest', |
| }, |
| # expected output: |
| { |
| 'differenceData': { |
| 'maxDiffPerChannel': [255, 0, 255], |
| 'numDifferingPixels': 102400, |
| 'percentDifferingPixels': 100.00, |
| 'perceptualDifference': 100.00, |
| }, |
| 'expectations': { |
| 'bugs': [1001, 1002], |
| 'ignoreFailure': True, |
| }, |
| 'extraColumns': { |
| 'builder': 'MyBuilder', |
| 'test': 'MyTest', |
| }, |
| 'imageAUrl': |
| 'gradients_degenerate_2pt/10552995703607727960.png', |
| 'imageBUrl': |
| 'gradients_degenerate_2pt/11198253335583713230.png', |
| 'isDifferent': True, |
| }, |
| ], |
| |
| # Test fix for http://skbug.com/2368 -- how do we handle an ImagePair |
| # missing one of its images? |
| [ |
| # inputs: |
| 'arcofzorro/16206093933823793653.png', |
| 'nonexistentDir/111111.png', |
| { |
| 'ignoreFailure': True, |
| 'bugs': [1001, 1002], |
| }, |
| { |
| 'builder': 'MyBuilder', |
| 'test': 'MyTest', |
| }, |
| # expected output: |
| { |
| 'expectations': { |
| 'bugs': [1001, 1002], |
| 'ignoreFailure': True, |
| }, |
| 'extraColumns': { |
| 'builder': 'MyBuilder', |
| 'test': 'MyTest', |
| }, |
| 'imageAUrl': 'arcofzorro/16206093933823793653.png', |
| 'imageBUrl': 'nonexistentDir/111111.png', |
| 'isDifferent': True, |
| }, |
| ], |
| |
| # One of the two images is missing, but download_all_images=True so we |
| # should download it anyway. |
| [ |
| # inputs: |
| None, |
| 'arcofzorro/13786535001616823825.png', |
| None, |
| None, |
| # expected output: |
| { |
| 'imageAUrl': None, |
| 'imageBUrl': 'arcofzorro/13786535001616823825.png', |
| 'isDifferent': True, |
| }, |
| ], |
| |
| ] |
| |
| db = imagediffdb.ImageDiffDB(self.temp_dir) |
| for selftest in selftests: |
| image_pair = imagepair.ImagePair( |
| image_diff_db=db, |
| base_url=IMG_URL_BASE, |
| imageA_relative_url=selftest[0], |
| imageB_relative_url=selftest[1], |
| expectations=selftest[2], |
| extra_columns=selftest[3], |
| download_all_images=True) |
| self.assertEqual(image_pair.as_dict(), selftest[4]) |
| |
| |
| def main(): |
| suite = unittest.TestLoader().loadTestsFromTestCase(ImagePairTest) |
| unittest.TextTestRunner(verbosity=2).run(suite) |
| |
| |
| if __name__ == '__main__': |
| main() |