1#!/usr/bin/python 2 3""" 4Copyright 2013 Google Inc. 5 6Use of this source code is governed by a BSD-style license that can be 7found in the LICENSE file. 8 9Test imagediffdb.py 10""" 11 12# System-level imports 13import logging 14import shutil 15import tempfile 16import unittest 17 18# Local imports 19import imagediffdb 20 21 22IMG_URL_BASE = ('http://chromium-skia-gm.commondatastorage.googleapis.com/gm/' 23 'bitmap-64bitMD5/') 24 25 26class ImageDiffDbTest(unittest.TestCase): 27 28 def setUp(self): 29 self._temp_dir = tempfile.mkdtemp() 30 self.maxDiff = None 31 32 def tearDown(self): 33 shutil.rmtree(self._temp_dir) 34 35 def shortDescription(self): 36 """Tell unittest framework to not print docstrings for test cases.""" 37 return None 38 39 def test_sanitize_locator(self): 40 """Test _sanitize_locator().""" 41 self.assertEqual(imagediffdb._sanitize_locator('simple'), 'simple') 42 self.assertEqual(imagediffdb._sanitize_locator(1234), '1234') 43 self.assertEqual(imagediffdb._sanitize_locator('one/two'), 'one_two') 44 self.assertEqual(imagediffdb._sanitize_locator('one\\two'), 'one_two') 45 self.assertEqual(imagediffdb._sanitize_locator('one_two'), 'one_two') 46 47 def test_simple(self): 48 """Test ImageDiffDB, downloading real known images from Google Storage. 49 50 TODO(epoger): Instead of hitting Google Storage, we should read image 51 files from local disk using a file:// IMG_URL_BASE. 52 """ 53 # params for each self-test: 54 # 0. expected image locator 55 # 1. expected image URL 56 # 2. actual image locator 57 # 3. actual image URL 58 # 4. expected percent_pixels_differing (as a string, to 4 decimal places) 59 # 5. expected perceptual difference (as a string, to 4 decimal places) 60 # 6. expected max_diff_per_channel 61 selftests = [ 62 [ 63 'arcofzorro/16206093933823793653', 64 IMG_URL_BASE + 'arcofzorro/16206093933823793653.png', 65 'arcofzorro/13786535001616823825', 66 IMG_URL_BASE + 'arcofzorro/13786535001616823825.png', 67 '0.0662', '0.0662', [255, 255, 247], 68 ], 69 [ 70 'gradients_degenerate_2pt/10552995703607727960', 71 IMG_URL_BASE + 'gradients_degenerate_2pt/10552995703607727960.png', 72 'gradients_degenerate_2pt/11198253335583713230', 73 IMG_URL_BASE + 'gradients_degenerate_2pt/11198253335583713230.png', 74 '100.0000', '100.0000', [255, 0, 255], 75 ], 76 ] 77 78 # Add all image pairs to the database 79 db = imagediffdb.ImageDiffDB(self._temp_dir) 80 for selftest in selftests: 81 retval = db.add_image_pair( 82 expected_image_locator=selftest[0], expected_image_url=selftest[1], 83 actual_image_locator=selftest[2], actual_image_url=selftest[3]) 84 85 # Fetch each image pair from the database 86 for selftest in selftests: 87 record = db.get_diff_record(expected_image_locator=selftest[0], 88 actual_image_locator=selftest[2]) 89 self.assertEqual('%.4f' % record.get_percent_pixels_differing(), 90 selftest[4]) 91 self.assertEqual('%.4f' % record.get_perceptual_difference(), selftest[5]) 92 self.assertEqual(record.get_max_diff_per_channel(), selftest[6]) 93 94 95def main(): 96 suite = unittest.TestLoader().loadTestsFromTestCase(ImageDiffDbTest) 97 unittest.TextTestRunner(verbosity=2).run(suite) 98 99 100if __name__ == '__main__': 101 main() 102