| Index: tests/selenium/pdiff_test.py
|
| ===================================================================
|
| --- tests/selenium/pdiff_test.py (revision 0)
|
| +++ tests/selenium/pdiff_test.py (revision 0)
|
| @@ -0,0 +1,139 @@
|
| +import os
|
| +import re
|
| +import subprocess
|
| +import unittest
|
| +import sys
|
| +
|
| +import selenium_utilities
|
| +import selenium_constants
|
| +
|
| +class PDiffTest(unittest.TestCase):
|
| + """A perceptual diff test class, for running perceptual diffs on any
|
| + number of screenshots."""
|
| +
|
| + def __init__(self, name, num_screenshots, screenshot_name, pdiff_path,
|
| + gen_dir, ref_dir, options):
|
| + unittest.TestCase.__init__(self, name)
|
| + self.name = name
|
| + self.num_screenshots = num_screenshots
|
| + self.screenshot_name = screenshot_name
|
| + self.pdiff_path = pdiff_path
|
| + self.gen_dir = gen_dir
|
| + self.ref_dir = ref_dir
|
| + self.options = options
|
| +
|
| + def shortDescription(self):
|
| + """override unittest.TestCase shortDescription for our own descriptions."""
|
| + return "Screenshot comparison for: " + self.name
|
| +
|
| + def PDiffTest(self):
|
| + """Runs a generic Perceptual Diff test."""
|
| + # Get arguments for perceptual diff.
|
| + pixel_threshold = "10"
|
| + alpha_threshold = "1.0"
|
| + use_colorfactor = False
|
| + use_downsample = False
|
| + use_edge = True
|
| + edge_threshold = "5"
|
| +
|
| + for opt in self.options:
|
| + if opt.startswith("pdiff_threshold"):
|
| + pixel_threshold = selenium_utilities.GetArgument(opt)
|
| + elif (opt.startswith("pdiff_threshold_mac") and
|
| + sys.platform == "darwin"):
|
| + pixel_threshold = selenium_utilities.GetArgument(opt)
|
| + elif (opt.startswith("pdiff_threshold_win") and
|
| + sys.platform == 'win32' or sys.platform == "cygwin"):
|
| + pixel_threshold = selenium_utilities.GetArgument(opt)
|
| + elif (opt.startswith("pdiff_threshold_linux") and
|
| + sys.platform[:5] == "linux"):
|
| + pixel_threshold = selenium_utilities.GetArgument(opt)
|
| + elif (opt.startswith("colorfactor")):
|
| + colorfactor = selenium_utilities.GetArgument(opt)
|
| + use_colorfactor = True
|
| + elif (opt.startswith("downsample")):
|
| + downsample_factor = selenium_utilities.GetArgument(opt)
|
| + use_downsample = True
|
| + elif (opt.startswith("pdiff_edge_ignore_off")):
|
| + use_edge = False
|
| + elif (opt.startswith("pdiff_edge_threshold")):
|
| + edge_threshold = selenium_utilities.GetArgument(opt)
|
| +
|
| + results = []
|
| + # Loop over number of screenshots.
|
| + for screenshot_no in range(self.num_screenshots):
|
| + # Find reference image.
|
| + J = os.path.join
|
| + platform_img_path = J(self.ref_dir,
|
| + selenium_constants.PLATFORM_SCREENSHOT_DIR,
|
| + self.screenshot_name + str(screenshot_no + 1) +
|
| + '_reference.png')
|
| + reg_img_path = J(self.ref_dir,
|
| + selenium_constants.DEFAULT_SCREENSHOT_DIR,
|
| + self.screenshot_name + str(screenshot_no + 1) +
|
| + '_reference.png')
|
| +
|
| + if os.path.exists(platform_img_path):
|
| + ref_img_path = platform_img_path
|
| + elif os.path.exists(reg_img_path):
|
| + ref_img_path = reg_img_path
|
| + else:
|
| + self.fail('Reference image for ' + self.screenshot_name + ' not found.'
|
| + + '\nNeither file exists %s NOR %s' %
|
| + (reg_img_path, platform_img_path))
|
| +
|
| + # Find generated image.
|
| + gen_img_path = J(self.gen_dir, self.screenshot_name +
|
| + str(screenshot_no + 1) + '.png')
|
| + diff_img_path = J(self.gen_dir, 'cmp_' + self.screenshot_name +
|
| + str(screenshot_no + 1) + '.png')
|
| +
|
| + self.assertTrue(os.path.exists(gen_img_path),
|
| + 'Generated screenshot for ' + self.screenshot_name +
|
| + ' not found.\nFile does not exist: %s' % gen_img_path)
|
| +
|
| + # Run perceptual diff
|
| + arguments = [self.pdiff_path,
|
| + ref_img_path,
|
| + gen_img_path,
|
| + "-output", diff_img_path,
|
| + "-fov", "45",
|
| + "-alphaThreshold", alpha_threshold,
|
| + # Turn on verbose output for the percetual diff so we
|
| + # can see how far off we are on the threshold.
|
| + "-verbose",
|
| + # Set the threshold to zero so we can get a count
|
| + # of the different pixels. This causes the program
|
| + # to return failure for most images, but we can compare
|
| + # the values ourselves below.
|
| + "-threshold", "0"]
|
| + if use_colorfactor:
|
| + arguments += ["-colorfactor", colorfactor]
|
| + if use_downsample:
|
| + arguments += ["-downsample", downsample_factor]
|
| + if use_edge:
|
| + arguments += ["-ignoreEdges", edge_threshold]
|
| +
|
| + pdiff_pipe = subprocess.Popen(arguments,
|
| + stdout=subprocess.PIPE,
|
| + stderr=subprocess.PIPE)
|
| + (pdiff_stdout, pdiff_stderr) = pdiff_pipe.communicate()
|
| + result = pdiff_pipe.returncode
|
| + # Find out how many pixels were different by looking at the output.
|
| + pixel_re = re.compile("(\d+) pixels are different", re.DOTALL)
|
| + pixel_match = pixel_re.search(pdiff_stdout)
|
| + different_pixels = "0"
|
| + if pixel_match:
|
| + different_pixels = pixel_match.group(1)
|
| +
|
| + results += [(gen_img_path, int(different_pixels))]
|
| +
|
| + all_tests_passed = True
|
| + msg = "Pixel Threshold is %s. Failing screenshots:\n" % pixel_threshold
|
| + for path, pixels in results:
|
| + if pixels >= pixel_threshold:
|
| + all_tests_passed = False
|
| + msg += " %s, differing by %s\n" % (path, str(pixels))
|
| +
|
| + if not all_tests_passed:
|
| + self.assertTrue(all_tests_passed, msg)
|
|
|