19985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org#!/usr/bin/python
29985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
39985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org"""
49985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgCopyright 2014 Google Inc.
59985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
69985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgUse of this source code is governed by a BSD-style license that can be
79985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgfound in the LICENSE file.
89985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
99985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgTest imagepair.py
109985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org"""
119985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
129985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org# System-level imports
139985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgimport shutil
149985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgimport tempfile
159985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgimport unittest
169985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
179985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org# Local imports
189985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgimport imagediffdb
199985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgimport imagepair
209985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
219985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
229985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgIMG_URL_BASE = 'http://chromium-skia-gm.commondatastorage.googleapis.com/gm/bitmap-64bitMD5/'
239985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
249985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
259985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgclass ImagePairTest(unittest.TestCase):
269985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
279985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org  def setUp(self):
289985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    self._temp_dir = tempfile.mkdtemp()
299985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    self.maxDiff = None
309985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
319985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org  def tearDown(self):
329985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    shutil.rmtree(self._temp_dir)
339985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
349985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org  def shortDescription(self):
35536b15ffb05a20f3681ed72749a3bc09c5386c10commit-bot@chromium.org    """Tells unittest framework to not print docstrings for test cases."""
369985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    return None
379985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
389985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org  def test_endToEnd(self):
39536b15ffb05a20f3681ed72749a3bc09c5386c10commit-bot@chromium.org    """Tests ImagePair, using a real ImageDiffDB to download real images.
409985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
419985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    TODO(epoger): Either in addition to or instead of this end-to-end test,
429985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    we should perform some tests using either:
439985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    1. a mock ImageDiffDB, or
449985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    2. a real ImageDiffDB that doesn't hit Google Storage looking for input
459985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org       image files (maybe a file:// IMG_URL_BASE)
469985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    """
479985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    # params for each self-test:
489985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    #
499985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    # inputs:
509985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    #  0. imageA_relative_URL
519985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    #  1. imageB_relative_URL
529985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    #  2. expectations dict
539985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    #  3. extra_columns dict
549985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    # expected output:
559985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    #  4. expected result of ImagePair.as_dict()
569985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    selftests = [
579985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org        [
589985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            # inputs:
599985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'arcofzorro/16206093933823793653.png',
609985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'arcofzorro/16206093933823793653.png',
619985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            None,
629985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            {
639985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'builder': 'MyBuilder',
649985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'test': 'MyTest',
659985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            },
669985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            # expected output:
679985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            {
68536b15ffb05a20f3681ed72749a3bc09c5386c10commit-bot@chromium.org                'extraColumns': {
699985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'builder': 'MyBuilder',
709985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'test': 'MyTest',
719985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                },
729985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'imageAUrl': 'arcofzorro/16206093933823793653.png',
739985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'imageBUrl': 'arcofzorro/16206093933823793653.png',
749985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'isDifferent': False,
759985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            },
769985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org        ],
779985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
789985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org        [
799985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            # inputs:
809985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'arcofzorro/16206093933823793653.png',
819985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'arcofzorro/13786535001616823825.png',
829985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            None,
839985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            None,
849985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            # expected output:
859985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            {
869985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'differenceData': {
879985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'maxDiffPerChannel': [255, 255, 247],
889985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'numDifferingPixels': 662,
899985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'percentDifferingPixels': 0.0662,
9016f418080ff6751e15e0193263149412de9c848acommit-bot@chromium.org                    'perceptualDifference': 0.06620000000000914,
919985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                },
929985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'imageAUrl': 'arcofzorro/16206093933823793653.png',
939985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'imageBUrl': 'arcofzorro/13786535001616823825.png',
949985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'isDifferent': True,
959985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            },
969985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org        ],
979985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
989985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org        [
999985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            # inputs:
1009985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'gradients_degenerate_2pt/10552995703607727960.png',
1019985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'gradients_degenerate_2pt/11198253335583713230.png',
1029985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            {
1039985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'ignoreFailure': True,
1049985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'bugs': [1001, 1002],
1059985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            },
1069985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            {
1079985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'builder': 'MyBuilder',
1089985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'test': 'MyTest',
1099985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            },
1109985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            # expected output:
1119985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            {
1129985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'differenceData': {
1139985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'maxDiffPerChannel': [255, 0, 255],
1149985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'numDifferingPixels': 102400,
1159985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'percentDifferingPixels': 100.00,
11616f418080ff6751e15e0193263149412de9c848acommit-bot@chromium.org                    'perceptualDifference': 100.00,
1179985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                },
118536b15ffb05a20f3681ed72749a3bc09c5386c10commit-bot@chromium.org                'expectations': {
1199985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'bugs': [1001, 1002],
1209985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'ignoreFailure': True,
1219985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                },
122536b15ffb05a20f3681ed72749a3bc09c5386c10commit-bot@chromium.org                'extraColumns': {
1239985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'builder': 'MyBuilder',
1249985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'test': 'MyTest',
1259985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                },
1269985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'imageAUrl':
1279985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'gradients_degenerate_2pt/10552995703607727960.png',
1289985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'imageBUrl':
1299985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                    'gradients_degenerate_2pt/11198253335583713230.png',
1309985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org                'isDifferent': True,
1319985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            },
1329985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org        ],
1336844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org
1346844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org        # Test fix for http://skbug.com/2368 -- how do we handle an ImagePair
1356844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org        # missing one of its images?
1366844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org        [
1376844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            # inputs:
1386844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            'arcofzorro/16206093933823793653.png',
1396844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            'nonexistentDir/111111.png',
1406844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            {
1416844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'ignoreFailure': True,
1426844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'bugs': [1001, 1002],
1436844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            },
1446844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            {
1456844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'builder': 'MyBuilder',
1466844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'test': 'MyTest',
1476844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            },
1486844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            # expected output:
1496844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            {
1506844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'expectations': {
1516844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                    'bugs': [1001, 1002],
1526844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                    'ignoreFailure': True,
1536844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                },
1546844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'extraColumns': {
1556844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                    'builder': 'MyBuilder',
1566844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                    'test': 'MyTest',
1576844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                },
1586844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'imageAUrl': 'arcofzorro/16206093933823793653.png',
1596844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'imageBUrl': 'nonexistentDir/111111.png',
1606844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org                'isDifferent': True,
1616844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org            },
1626844958fffcf9ee19370f47aba8cba909caef4f7commit-bot@chromium.org        ],
1639985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    ]
1649985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
1659985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    db = imagediffdb.ImageDiffDB(self._temp_dir)
1669985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    for selftest in selftests:
1679985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org      image_pair = imagepair.ImagePair(
1689985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org          image_diff_db=db,
1699985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org          base_url=IMG_URL_BASE,
1709985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org          imageA_relative_url=selftest[0],
1719985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org          imageB_relative_url=selftest[1],
1729985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org          expectations=selftest[2],
1739985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org          extra_columns=selftest[3])
1749985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org      self.assertEqual(image_pair.as_dict(), selftest[4])
1759985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
1769985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
1779985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgdef main():
1789985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org  suite = unittest.TestLoader().loadTestsFromTestCase(ImagePairTest)
1799985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org  unittest.TextTestRunner(verbosity=2).run(suite)
1809985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
1819985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
1829985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.orgif __name__ == '__main__':
1839985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org  main()
184