1# Copyright 2013 The Chromium Authors. All rights reserved. 2# Use of this source code is governed by a BSD-style license that can be 3# found in the LICENSE file. 4 5from PIL import Image 6import unittest 7import sets 8 9from tests.rendering_test_manager import mock_cloud_bucket 10from tests.rendering_test_manager import cloud_bucket 11from tools import rendering_test_manager 12from tools import image_tools 13 14 15class BucketRenderingTestManagerUnitTest(unittest.TestCase): 16 17 def setUp(self): 18 # Set up structures that will be reused throughout testing. 19 self.bucket = mock_cloud_bucket.MockCloudBucket() 20 self.manager = rendering_test_manager.RenderingTestManager(self.bucket) 21 self.white = Image.new('RGB', (25, 25), (255, 255, 255)) 22 self.red = Image.new('RGB', (25, 25), (255, 0, 0)) 23 self.black = Image.new('RGB', (25, 25), (0, 0, 0)) 24 25 def testUploadImage(self): 26 self.bucket.Reset() 27 # Upload some images to the datastore. 28 self.manager.UploadImage('path/to/white.png', self.white) 29 self.manager.UploadImage('path/to/black.png', self.black) 30 self.manager.UploadImage('path/to/red.png', self.red) 31 # Confirm that the images actually got uploaded. 32 self.assertEquals(self.bucket.datastore['path/to/white.png'], 33 image_tools.SerializeImage(self.white)) 34 self.assertEquals(self.bucket.datastore['path/to/black.png'], 35 image_tools.SerializeImage(self.black)) 36 self.assertEquals(self.bucket.datastore['path/to/red.png'], 37 image_tools.SerializeImage(self.red)) 38 39 def testDownloadImage(self): 40 self.bucket.Reset() 41 # Upload some images to the datastore. 42 self.manager.UploadImage('path/to/white.png', self.white) 43 self.manager.UploadImage('path/to/black.png', self.black) 44 self.manager.UploadImage('path/to/red.png', self.red) 45 # Check that the DownloadImage function gets the correct images. 46 self.assertEquals( 47 image_tools.SerializeImage( 48 self.manager.DownloadImage('path/to/white.png')), 49 image_tools.SerializeImage(self.white)) 50 self.assertEquals( 51 image_tools.SerializeImage( 52 self.manager.DownloadImage('path/to/black.png')), 53 image_tools.SerializeImage(self.black)) 54 self.assertEquals( 55 image_tools.SerializeImage( 56 self.manager.DownloadImage('path/to/red.png')), 57 image_tools.SerializeImage(self.red)) 58 # Check that the DownloadImage function throws an error for a 59 # nonexistant image. 60 self.assertRaises(cloud_bucket.FileNotFoundError, 61 self.manager.DownloadImage, 62 'path/to/yellow.png') 63 64 def testUploadTest(self): 65 self.bucket.Reset() 66 # Upload some tests to the datastore. 67 self.manager.UploadTest('test1', [self.white, self.black]) 68 self.manager.UploadTest('test2', [self.black, self.black]) 69 # Confirm that the tests were successfully uploaded. 70 self.assertEquals(self.bucket.datastore['tests/test1/expected.png'], 71 image_tools.SerializeImage(self.white)) 72 self.assertEquals(self.bucket.datastore['tests/test1/mask.png'], 73 image_tools.SerializeImage(self.white)) 74 self.assertEquals(self.bucket.datastore['tests/test2/expected.png'], 75 image_tools.SerializeImage(self.black)) 76 self.assertEquals(self.bucket.datastore['tests/test2/mask.png'], 77 image_tools.SerializeImage(self.black)) 78 79 def testRunTest(self): 80 self.bucket.Reset() 81 82 self.manager.UploadTest('test1', [self.red, self.red]) 83 self.manager.RunTest('test1', 'run1', self.black) 84 self.assertEquals( 85 self.bucket.datastore['failures/test1/run1/actual.png'], 86 image_tools.SerializeImage(self.black)) 87 self.manager.RunTest('test1', 'run2', self.red) 88 self.assertFalse( 89 self.bucket.datastore.has_key('failures/test1/run2/actual.png')) 90 self.assertRaises(cloud_bucket.FileNotFoundError, self.manager.RunTest, 91 'test2', 'run1', self.black) 92 93 def testGetTest(self): 94 self.bucket.Reset() 95 # Upload some tests to the datastore 96 self.manager.UploadTest('test1', [self.white, self.black]) 97 self.manager.UploadTest('test2', [self.red, self.white]) 98 test1 = self.manager.GetTest('test1') 99 test2 = self.manager.GetTest('test2') 100 # Check that GetTest gets the appropriate tests. 101 self.assertEquals(image_tools.SerializeImage(test1.expected), 102 image_tools.SerializeImage(self.white)) 103 self.assertEquals(image_tools.SerializeImage(test1.mask), 104 image_tools.SerializeImage(self.white)) 105 self.assertEquals(image_tools.SerializeImage(test2.expected), 106 image_tools.SerializeImage(self.red)) 107 self.assertEquals(image_tools.SerializeImage(test2.mask), 108 image_tools.SerializeImage(self.white)) 109 # Check that GetTest throws an error for a nonexistant test. 110 self.assertRaises( 111 cloud_bucket.FileNotFoundError, self.manager.GetTest, 'test3') 112 113 def testTestExists(self): 114 self.bucket.Reset() 115 self.manager.UploadTest('test1', [self.white, self.black]) 116 self.manager.UploadTest('test2', [self.white, self.black]) 117 self.assertTrue(self.manager.TestExists('test1')) 118 self.assertTrue(self.manager.TestExists('test2')) 119 self.assertFalse(self.manager.TestExists('test3')) 120 121 def testFailureExists(self): 122 self.bucket.Reset() 123 self.manager.UploadTest('test1', [self.white, self.white]) 124 self.manager.RunTest('test1', 'run1', self.black) 125 self.manager.RunTest('test1', 'run2', self.white) 126 self.assertTrue(self.manager.FailureExists('test1', 'run1')) 127 self.assertFalse(self.manager.FailureExists('test1', 'run2')) 128 129 def testRemoveTest(self): 130 self.bucket.Reset() 131 self.manager.UploadTest('test1', [self.white, self.white]) 132 self.manager.UploadTest('test2', [self.white, self.white]) 133 self.assertTrue(self.manager.TestExists('test1')) 134 self.assertTrue(self.manager.TestExists('test2')) 135 self.manager.RemoveTest('test1') 136 self.assertFalse(self.manager.TestExists('test1')) 137 self.assertTrue(self.manager.TestExists('test2')) 138 self.manager.RemoveTest('test2') 139 self.assertFalse(self.manager.TestExists('test1')) 140 self.assertFalse(self.manager.TestExists('test2')) 141 142 def testRemoveFailure(self): 143 self.bucket.Reset() 144 self.manager.UploadTest('test1', [self.white, self.white]) 145 self.manager.UploadTest('test2', [self.white, self.white]) 146 self.manager.RunTest('test1', 'run1', self.black) 147 self.manager.RunTest('test1', 'run2', self.black) 148 self.manager.RemoveFailure('test1', 'run1') 149 self.assertFalse(self.manager.FailureExists('test1', 'run1')) 150 self.assertTrue(self.manager.TestExists('test1')) 151 self.assertTrue(self.manager.FailureExists('test1', 'run2')) 152 self.assertTrue(self.manager.TestExists('test2')) 153 154 def testGetFailure(self): 155 self.bucket.Reset() 156 # Upload a result 157 self.manager.UploadTest('test1', [self.red, self.red]) 158 self.manager.RunTest('test1', 'run1', self.black) 159 res = self.manager.GetFailure('test1', 'run1') 160 # Check that the function correctly got the result. 161 self.assertEquals(image_tools.SerializeImage(res.expected), 162 image_tools.SerializeImage(self.red)) 163 self.assertEquals(image_tools.SerializeImage(res.diff), 164 image_tools.SerializeImage(self.white)) 165 self.assertEquals(image_tools.SerializeImage(res.actual), 166 image_tools.SerializeImage(self.black)) 167 # Check that the function raises an error when given non-existant results. 168 self.assertRaises(cloud_bucket.FileNotFoundError, 169 self.manager.GetFailure, 170 'test1', 'run2') 171 self.assertRaises(cloud_bucket.FileNotFoundError, 172 self.manager.GetFailure, 173 'test2', 'run1') 174 175 def testGetAllPaths(self): 176 self.bucket.Reset() 177 # Upload some tests. 178 self.manager.UploadTest('test1', [self.white, self.black]) 179 self.manager.UploadTest('test2', [self.red, self.white]) 180 # Check that the function gets all urls matching the prefix. 181 self.assertEquals( 182 sets.Set(self.manager.GetAllPaths('tests/test')), 183 sets.Set(['tests/test1/expected.png', 184 'tests/test1/mask.png', 185 'tests/test2/expected.png', 186 'tests/test2/mask.png'])) 187 self.assertEquals(sets.Set(self.manager.GetAllPaths('tests/test1')), 188 sets.Set(['tests/test1/expected.png', 189 'tests/test1/mask.png'])) 190 self.assertEquals(sets.Set(self.manager.GetAllPaths('tests/test3')), 191 sets.Set()) 192 193 194if __name__ == '__main__': 195 unittest.main() 196