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