blob: 2b55c2c012d4ad16e5e477bbf455ca326abfe315 [file] [log] [blame]
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
from PIL import Image
import sys
import unittest
import cloud_bucket
import image_tools
import ispy_utils
import mock_cloud_bucket
class ISpyUtilsUnitTest(unittest.TestCase):
def setUp(self):
# Set up structures that will be reused throughout testing.
self.bucket = mock_cloud_bucket.MockCloudBucket()
self.ispy_utils = ispy_utils.ISpyUtils(self.bucket)
self.white = Image.new('RGBA', (25, 25), (255, 255, 255, 255))
self.red = Image.new('RGBA', (25, 25), (255, 0, 0, 255))
self.black = Image.new('RGBA', (25, 25), (0, 0, 0, 255))
self.masked = Image.new('RGBA', (25, 25), (210, 0, 0, 255))
def testUploadImage(self):
self.bucket.Reset()
# Upload some images to the datastore.
self.ispy_utils.UploadImage('path/to/white.png', self.white)
self.ispy_utils.UploadImage('path/to/black.png', self.black)
self.ispy_utils.UploadImage('path/to/red.png', self.red)
# Confirm that the images actually got uploaded.
self.assertEquals(self.bucket.datastore['path/to/white.png'],
image_tools.EncodePNG(self.white))
self.assertEquals(self.bucket.datastore['path/to/black.png'],
image_tools.EncodePNG(self.black))
self.assertEquals(self.bucket.datastore['path/to/red.png'],
image_tools.EncodePNG(self.red))
def testDownloadImage(self):
self.bucket.Reset()
# Upload some images to the datastore.
self.ispy_utils.UploadImage('path/to/white.png', self.white)
self.ispy_utils.UploadImage('path/to/black.png', self.black)
self.ispy_utils.UploadImage('path/to/red.png', self.red)
# Check that the DownloadImage function gets the correct images.
self.assertEquals(
image_tools.EncodePNG(
self.ispy_utils.DownloadImage('path/to/white.png')),
image_tools.EncodePNG(self.white))
self.assertEquals(
image_tools.EncodePNG(
self.ispy_utils.DownloadImage('path/to/black.png')),
image_tools.EncodePNG(self.black))
self.assertEquals(
image_tools.EncodePNG(
self.ispy_utils.DownloadImage('path/to/red.png')),
image_tools.EncodePNG(self.red))
# Check that the DownloadImage function throws an error for a
# nonexistant image.
self.assertRaises(cloud_bucket.FileNotFoundError,
self.ispy_utils.DownloadImage,
'path/to/yellow.png')
def testUpdateImage(self):
self.bucket.Reset()
# Upload some images to the datastore.
self.ispy_utils.UploadImage('path/to/image.png', self.white)
self.assertEquals(self.bucket.datastore['path/to/image.png'],
image_tools.EncodePNG(self.white))
self.ispy_utils.UpdateImage('path/to/image.png', self.black)
# Confirm that the image actually got updated.
self.assertEquals(self.bucket.datastore['path/to/image.png'],
image_tools.EncodePNG(self.black))
def testGenerateExpectation(self):
self.bucket.Reset()
# Upload some tests to the datastore.
self.ispy_utils.GenerateExpectation('test', [self.white, self.black])
self.ispy_utils.GenerateExpectation('test1', [self.black, self.black])
self.ispy_utils.GenerateExpectation('test2', [self.black])
# Confirm that the tests were successfully uploaded.
self.assertEquals(self.bucket.datastore[
ispy_utils.GetExpectationPath('test', 'expected.png')],
image_tools.EncodePNG(self.white))
self.assertEquals(self.bucket.datastore[
ispy_utils.GetExpectationPath('test', 'mask.png')],
image_tools.EncodePNG(self.white))
self.assertEquals(self.bucket.datastore[
ispy_utils.GetExpectationPath('test1', 'expected.png')],
image_tools.EncodePNG(self.black))
self.assertEquals(self.bucket.datastore[
ispy_utils.GetExpectationPath('test1', 'mask.png')],
image_tools.EncodePNG(self.black))
self.assertEquals(self.bucket.datastore[
ispy_utils.GetExpectationPath('test2', 'expected.png')],
image_tools.EncodePNG(self.black))
self.assertEquals(self.bucket.datastore[
ispy_utils.GetExpectationPath('test2', 'mask.png')],
image_tools.EncodePNG(self.black))
def testPerformComparison(self):
self.bucket.Reset()
self.ispy_utils.GenerateExpectation('test1', [self.red, self.red])
self.ispy_utils.PerformComparison('test', 'test1', self.black)
self.assertEquals(self.bucket.datastore[
ispy_utils.GetFailurePath('test', 'test1', 'actual.png')],
image_tools.EncodePNG(self.black))
self.ispy_utils.PerformComparison('test', 'test1', self.red)
self.assertTrue(self.bucket.datastore.has_key(
ispy_utils.GetFailurePath('test', 'test1', 'actual.png')))
def testGetExpectation(self):
self.bucket.Reset()
# Upload some tests to the datastore
self.ispy_utils.GenerateExpectation('test1', [self.white, self.black])
self.ispy_utils.GenerateExpectation('test2', [self.red, self.white])
test1 = self.ispy_utils.GetExpectation('test1')
test2 = self.ispy_utils.GetExpectation('test2')
# Check that GetExpectation gets the appropriate tests.
self.assertEquals(image_tools.EncodePNG(test1.expected),
image_tools.EncodePNG(self.white))
self.assertEquals(image_tools.EncodePNG(test1.mask),
image_tools.EncodePNG(self.white))
self.assertEquals(image_tools.EncodePNG(test2.expected),
image_tools.EncodePNG(self.red))
self.assertEquals(image_tools.EncodePNG(test2.mask),
image_tools.EncodePNG(self.white))
# Check that GetExpectation throws an error for a nonexistant test.
self.assertRaises(
cloud_bucket.FileNotFoundError, self.ispy_utils.GetExpectation, 'test3')
def testExpectationExists(self):
self.bucket.Reset()
self.ispy_utils.GenerateExpectation('test1', [self.white, self.black])
self.ispy_utils.GenerateExpectation('test2', [self.white, self.black])
self.assertTrue(self.ispy_utils.ExpectationExists('test1'))
self.assertTrue(self.ispy_utils.ExpectationExists('test2'))
self.assertFalse(self.ispy_utils.ExpectationExists('test3'))
def testFailureExists(self):
self.bucket.Reset()
self.ispy_utils.GenerateExpectation('test1', [self.white, self.white])
self.ispy_utils.PerformComparison('test', 'test1', self.black)
self.ispy_utils.PerformComparison('test', 'test1', self.white)
self.assertTrue(self.ispy_utils.FailureExists('test', 'test1'))
self.assertFalse(self.ispy_utils.FailureExists('test', 'test2'))
def testRemoveExpectation(self):
self.bucket.Reset()
self.ispy_utils.GenerateExpectation('test1', [self.white, self.white])
self.ispy_utils.GenerateExpectation('test2', [self.white, self.white])
self.assertTrue(self.ispy_utils.ExpectationExists('test1'))
self.assertTrue(self.ispy_utils.ExpectationExists('test2'))
self.ispy_utils.RemoveExpectation('test1')
self.assertFalse(self.ispy_utils.ExpectationExists('test1'))
self.assertTrue(self.ispy_utils.ExpectationExists('test2'))
self.ispy_utils.RemoveExpectation('test2')
self.assertFalse(self.ispy_utils.ExpectationExists('test1'))
self.assertFalse(self.ispy_utils.ExpectationExists('test2'))
def testRemoveFailure(self):
self.bucket.Reset()
self.ispy_utils.GenerateExpectation('test1', [self.white, self.white])
self.ispy_utils.GenerateExpectation('test2', [self.white, self.white])
self.ispy_utils.PerformComparison('test', 'test1', self.black)
self.ispy_utils.RemoveFailure('test', 'test1')
self.assertFalse(self.ispy_utils.FailureExists('test', 'test1'))
self.assertTrue(self.ispy_utils.ExpectationExists('test1'))
self.assertFalse(self.ispy_utils.FailureExists('test', 'test2'))
self.assertTrue(self.ispy_utils.ExpectationExists('test2'))
def testGetFailure(self):
self.bucket.Reset()
# Upload a result
self.ispy_utils.GenerateExpectation('test1', [self.red, self.red])
self.ispy_utils.PerformComparison('test', 'test1', self.black)
res = self.ispy_utils.GetFailure('test', 'test1')
# Check that the function correctly got the result.
self.assertEquals(image_tools.EncodePNG(res.expected),
image_tools.EncodePNG(self.red))
self.assertEquals(image_tools.EncodePNG(res.diff),
image_tools.EncodePNG(self.masked))
self.assertEquals(image_tools.EncodePNG(res.actual),
image_tools.EncodePNG(self.black))
# Check that the function raises an error when given non-existant results.
self.assertRaises(cloud_bucket.FileNotFoundError,
self.ispy_utils.GetFailure, 'test', 'test2')
def testGetAllPaths(self):
self.bucket.Reset()
# Upload some tests.
self.ispy_utils.GenerateExpectation('test1', [self.white, self.black])
# Check that the function gets all urls matching the prefix.
self.assertEquals(
set(self.ispy_utils.GetAllPaths(
ispy_utils.GetExpectationPath('test1'))),
set([ispy_utils.GetExpectationPath('test1', 'expected.png'),
ispy_utils.GetExpectationPath('test1', 'mask.png')]))
self.assertEquals(
set(self.ispy_utils.GetAllPaths(
ispy_utils.GetExpectationPath('test3'))), set())
if __name__ == '__main__':
unittest.main()