19dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com#!/usr/bin/python
29dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
39dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com"""
49dddf6f6b957166b6cd6080f405b762aab109948epoger@google.comCopyright 2013 Google Inc.
59dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
69dddf6f6b957166b6cd6080f405b762aab109948epoger@google.comUse of this source code is governed by a BSD-style license that can be
79dddf6f6b957166b6cd6080f405b762aab109948epoger@google.comfound in the LICENSE file.
89dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
99dddf6f6b957166b6cd6080f405b762aab109948epoger@google.comTest imagediffdb.py
109dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com"""
119dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
129dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com# System-level imports
132a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.orgimport shutil
142a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.orgimport tempfile
152a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.orgimport unittest
169dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
179dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com# Local imports
189dddf6f6b957166b6cd6080f405b762aab109948epoger@google.comimport imagediffdb
199dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
209dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
2144546f85d9170d9dbbb0423813c339c1def30074commit-bot@chromium.orgIMG_URL_BASE = ('http://chromium-skia-gm.commondatastorage.googleapis.com/gm/'
2244546f85d9170d9dbbb0423813c339c1def30074commit-bot@chromium.org                'bitmap-64bitMD5/')
232a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
242a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
252a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.orgclass ImageDiffDbTest(unittest.TestCase):
262a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
272a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org  def setUp(self):
2866ed8dc4bfd63e4552a213cb17909f9fbbf59abdepoger    self.temp_dir = tempfile.mkdtemp()
299985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    self.maxDiff = None
302a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
312a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org  def tearDown(self):
3266ed8dc4bfd63e4552a213cb17909f9fbbf59abdepoger    shutil.rmtree(self.temp_dir)
332a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
342a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org  def shortDescription(self):
352a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    """Tell unittest framework to not print docstrings for test cases."""
362a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    return None
372a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
389985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org  def test_sanitize_locator(self):
399985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    """Test _sanitize_locator()."""
4066ed8dc4bfd63e4552a213cb17909f9fbbf59abdepoger    # pylint: disable=W0212
419985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    self.assertEqual(imagediffdb._sanitize_locator('simple'), 'simple')
429985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    self.assertEqual(imagediffdb._sanitize_locator(1234), '1234')
439985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    self.assertEqual(imagediffdb._sanitize_locator('one/two'),  'one_two')
449985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    self.assertEqual(imagediffdb._sanitize_locator('one\\two'), 'one_two')
459985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    self.assertEqual(imagediffdb._sanitize_locator('one_two'),  'one_two')
469985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
472a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org  def test_simple(self):
489985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    """Test ImageDiffDB, downloading real known images from Google Storage.
499985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org
509985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    TODO(epoger): Instead of hitting Google Storage, we should read image
519985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    files from local disk using a file:// IMG_URL_BASE.
529985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org    """
532a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    # params for each self-test:
542a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    # 0. expected image locator
552a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    # 1. expected image URL
562a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    # 2. actual image locator
572a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    # 3. actual image URL
582a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    # 4. expected percent_pixels_differing (as a string, to 4 decimal places)
59984b97c496e3e2d798c1091de4066f495e8afebdepoger    # 5. expected perceptual difference (as a string, to 4 decimal places)
60984b97c496e3e2d798c1091de4066f495e8afebdepoger    # 6. expected max_diff_per_channel
612a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    selftests = [
622a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org        [
639985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'arcofzorro/16206093933823793653',
642a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org            IMG_URL_BASE + 'arcofzorro/16206093933823793653.png',
659985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'arcofzorro/13786535001616823825',
662a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org            IMG_URL_BASE + 'arcofzorro/13786535001616823825.png',
67984b97c496e3e2d798c1091de4066f495e8afebdepoger            '0.0662', '0.0662', [255, 255, 247],
682a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org        ],
692a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org        [
709985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'gradients_degenerate_2pt/10552995703607727960',
712a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org            IMG_URL_BASE + 'gradients_degenerate_2pt/10552995703607727960.png',
729985ef5ed8c0b5cf3530ccf13c0774c6ef6256ddcommit-bot@chromium.org            'gradients_degenerate_2pt/11198253335583713230',
732a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org            IMG_URL_BASE + 'gradients_degenerate_2pt/11198253335583713230.png',
74984b97c496e3e2d798c1091de4066f495e8afebdepoger            '100.0000', '100.0000', [255, 0, 255],
752a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org        ],
762a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    ]
772a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
782a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    # Add all image pairs to the database
7966ed8dc4bfd63e4552a213cb17909f9fbbf59abdepoger    db = imagediffdb.ImageDiffDB(self.temp_dir)
802a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    for selftest in selftests:
8166ed8dc4bfd63e4552a213cb17909f9fbbf59abdepoger      db.add_image_pair(
822a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org          expected_image_locator=selftest[0], expected_image_url=selftest[1],
832a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org          actual_image_locator=selftest[2],   actual_image_url=selftest[3])
842a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
852a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    # Fetch each image pair from the database
862a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org    for selftest in selftests:
872a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org      record = db.get_diff_record(expected_image_locator=selftest[0],
882a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org                                  actual_image_locator=selftest[2])
892a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org      self.assertEqual('%.4f' % record.get_percent_pixels_differing(),
902a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org                       selftest[4])
91984b97c496e3e2d798c1091de4066f495e8afebdepoger      self.assertEqual('%.4f' % record.get_perceptual_difference(), selftest[5])
92984b97c496e3e2d798c1091de4066f495e8afebdepoger      self.assertEqual(record.get_max_diff_per_channel(), selftest[6])
932a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org
949dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
959dddf6f6b957166b6cd6080f405b762aab109948epoger@google.comdef main():
962a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org  suite = unittest.TestLoader().loadTestsFromTestCase(ImageDiffDbTest)
972a78e82f5eb82c3832231e36957110044b0783b3commit-bot@chromium.org  unittest.TextTestRunner(verbosity=2).run(suite)
989dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
999dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com
1009dddf6f6b957166b6cd6080f405b762aab109948epoger@google.comif __name__ == '__main__':
1019dddf6f6b957166b6cd6080f405b762aab109948epoger@google.com  main()
102