chromium/ui/base/test/skia_gold_matching_algorithm.h

// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_BASE_TEST_SKIA_GOLD_MATCHING_ALGORITHM_H_
#define UI_BASE_TEST_SKIA_GOLD_MATCHING_ALGORITHM_H_

#include <string>

namespace base {
class CommandLine;
}

namespace ui {
namespace test {

// Describes what algorithm to use to match golden images.
// Fuzzy and Sobel algorithms have adjustable parameters:
//
// Fuzzy has the max number of different pixels, the max per-channel delta sum
// (i.e. how much a pixel can differ by and still be considered the same), and
// how many border pixels to ignore. The number of ignored border pixels is
// mainly to make the Sobel filter work better, as if an edge goes all the way
// to the border of the image, the pixels along the border won't be blacked
// out due to the Sobel filter.
//
// Sobel has the parameters of fuzzy + the edge threshold, which determines how
// much of the image should be blacked out based on the generated Sobel filter.
//
// In general, it works like this:
// 1. Try an exact comparison check against all approved images for the test,
// returning success if a hash matches.
// 2. Get the most recent image for the trace (test + any reported JSON keys,
// e.g. OS/hardware information)
// 3. If the algorithm is Sobel, generate a Sobel filter and black out parts
// of the image based on the provided edge threshold.
// 4. Do a fuzzy comparison of the images.
//
// To determine the suitable parameter values using historical data for a test:
// https://cs.chromium.org/chromium/src/content/test/gpu/gold_inexact_matching/determine_gold_inexact_parameters.py
class SkiaGoldMatchingAlgorithm {};

class ExactSkiaGoldMatchingAlgorithm : public SkiaGoldMatchingAlgorithm {};

class FuzzySkiaGoldMatchingAlgorithm : public SkiaGoldMatchingAlgorithm {};

class SobelSkiaGoldMatchingAlgorithm : public FuzzySkiaGoldMatchingAlgorithm {};

// With this algorithm, an image is regarded to match a golden image when:
//   1. the image is an exact match, and
//   2. the set of golden images for the test must only contain a single image.
// This algorithm is used in Ash pixel testing to facilitate the gold image
// revision update.
// The main difference between this and `ExactSkiaGoldMatchingAlgorithm` is:
// * ExactSkiaGoldMatchingAlgorithm
//   Your test can match multiple valid Gold images. For a test run, if the
//   pixel output is one of the Gold images, we consider it's valid and test
//   would pass.
//   Any committers can approve a new Gold image. The new Gold image would be
//   added to the valid Gold images set.
//
// * PositiveIfOnlyImageAlgorithm
//   There is only 1 valid Gold image. No one can approve a new Gold image if
//   there is already a Gold image. In order to updating the Gold image, you
//   need to add a revision to the screenshot name, so it's treated as a new
//   test from Gold's perspective.
//
// Say you have a button pixel test with screenshot name `pwd_manager_button1`.
// With ExactSkiaGoldMatchingAlgorithm:
//   When a cl updates all button styles, the cl owner may approve all new
//   styles via Skia Gold, gets a button style owner to approve it, and merges
//   the change.
//   In this case, the feature owner(pwd manager UI owner) would not get
//   notified. If you as feature owner don't want this behavior, you can use
// PositiveIfOnlyImageAlgorithm:
//   Your screenshot name would be `pwd_manager_button1.rev0`. When a cl updates
//   all button styles, the cl owner need to edit your test case, change the
//   screenshot name to `pwd_manager_button1.rev1`, and seek feature owner's
//   approval for the test case change. In this way, feature owner would know
//   the UI changes.
//
// This algorithm would increase the Gold image maintenance cost. Toolkit owners
// who regularly update styles might be hindered as they need to edit all test
// cases. So use your best judgement for the algorithm you choose.
class PositiveIfOnlyImageAlgorithm : public SkiaGoldMatchingAlgorithm {};

}  // namespace test
}  // namespace ui

#endif  // UI_BASE_TEST_SKIA_GOLD_MATCHING_ALGORITHM_H_