173 lines
8.3 KiB
Python
173 lines
8.3 KiB
Python
|
|
"""
|
||
|
|
This file contains macros that generate multiple test targets, one per file.
|
||
|
|
"""
|
||
|
|
|
||
|
|
load("//bazel:cc_test_with_flags.bzl", "cc_test_with_flags")
|
||
|
|
|
||
|
|
def skia_cpu_tests(
|
||
|
|
name,
|
||
|
|
tests,
|
||
|
|
harness,
|
||
|
|
resources = [],
|
||
|
|
flags = {},
|
||
|
|
extra_deps = [],
|
||
|
|
limit_to = []):
|
||
|
|
"""Defines tests that should run only with --config=cpu
|
||
|
|
|
||
|
|
This macro will create one cc_test_with_flags rule for each file in tests.
|
||
|
|
These tests are configured to use the BazelTestRunner and actually run all tests
|
||
|
|
(e.g. those defined with DEF_TEST) in the file if no GPU backend has been specified,
|
||
|
|
that is, the bazel test command was invoked with --config=cpu (see buildrc for this
|
||
|
|
definition).
|
||
|
|
|
||
|
|
This macro cannot un-define those targets completely if a GPU backend has been specified
|
||
|
|
because the macro runs before the config flags are available for use. An analogy is a
|
||
|
|
C++ macro cannot do a #if on the value of a C++ variable.
|
||
|
|
|
||
|
|
Instead, if a GPU backend has been specified (e.g. --config=gl), we only compile the
|
||
|
|
BazelNoopRunner.cpp and nothing else (e.g. no deps, not even Skia). This makes any CPU tests
|
||
|
|
a trivially passing executable, which can easily be cached and effectively skipped.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
name: The name of the test_suite that groups these tests together.
|
||
|
|
tests: A list of strings, corresponding to C++ files with one or more DEF_TEST (see Test.h).
|
||
|
|
harness: A label (string) corresponding to a skia_cc_library which all the supplementary
|
||
|
|
test helpers, utils, etc. (e.g. Test.h and Test.cpp). Ideally, this is as small
|
||
|
|
as feasible, to avoid unnecessary bloat or recompilation if something unrelated
|
||
|
|
changes.
|
||
|
|
resources: A label corresponding to a file_group target that has any skia resource files
|
||
|
|
(e.g. images, fonts) needed to run these tests. Resources change infrequently,
|
||
|
|
so it's not super important that this be a precise list.
|
||
|
|
flags: A map of strings to lists of strings to specify features that must be compiled in
|
||
|
|
for these tests to work. For example, tests targeting our codec logic will want the
|
||
|
|
various codecs included, but most tests won't need that.
|
||
|
|
extra_deps: A list of labels corresponding to skia_cc_library targets which this test needs
|
||
|
|
to work, typically some utility located under //tools
|
||
|
|
limit_to: A list of platform labels (e.g. @platform//os:foo; @platform//cpu:bar) which
|
||
|
|
restrict where this test will be compiled and ran. If the list is empty, it will
|
||
|
|
run anywhere. If it is non-empty, it will only run on platforms which match the
|
||
|
|
entire set of constraints. See https://github.com/bazelbuild/platforms for these.
|
||
|
|
"""
|
||
|
|
test_targets = []
|
||
|
|
for filename in tests:
|
||
|
|
new_target = filename[:-4] # trim .cpp
|
||
|
|
test_targets.append(new_target)
|
||
|
|
cc_test_with_flags(
|
||
|
|
name = new_target,
|
||
|
|
size = "small",
|
||
|
|
srcs = select({
|
||
|
|
# Make this a no-op test if compiling with a GPU backend.
|
||
|
|
":skip_cpu_tests": ["BazelNoopRunner.cpp"],
|
||
|
|
"//conditions:default": [
|
||
|
|
"BazelTestRunner.cpp",
|
||
|
|
filename,
|
||
|
|
],
|
||
|
|
}),
|
||
|
|
deps = select({
|
||
|
|
":skip_cpu_tests": [],
|
||
|
|
# Only build and apply deps if we have a no-op test.
|
||
|
|
"//conditions:default": [
|
||
|
|
harness,
|
||
|
|
"//:skia_internal",
|
||
|
|
] + extra_deps,
|
||
|
|
}),
|
||
|
|
data = resources,
|
||
|
|
set_flags = flags,
|
||
|
|
target_compatible_with = limit_to,
|
||
|
|
)
|
||
|
|
|
||
|
|
# https://bazel.build/reference/be/general#test_suite
|
||
|
|
native.test_suite(
|
||
|
|
name = name,
|
||
|
|
tests = test_targets,
|
||
|
|
)
|
||
|
|
|
||
|
|
def skia_ganesh_tests(
|
||
|
|
name,
|
||
|
|
tests,
|
||
|
|
harness,
|
||
|
|
resources = [],
|
||
|
|
flags = {},
|
||
|
|
extra_deps = [],
|
||
|
|
limit_to = []):
|
||
|
|
"""Defines tests that should run only when a Ganesh GPU backend is compiled in, e.g --config=gl
|
||
|
|
|
||
|
|
This macro will create one cc_test_with_flags rule for each file in tests.
|
||
|
|
These tests are configured to use the BazelTestRunner and actually run all tests (e.g. those
|
||
|
|
defined with DEF_TEST or DEF_GANESH_TEST) in the file if a Ganesh GPU backend has been
|
||
|
|
specified, that is, the bazel test command was invoked with --config=gl or --config=vk
|
||
|
|
(see buildrc for this definition).
|
||
|
|
|
||
|
|
This macro cannot un-define those targets completely if only the CPU backend is being used
|
||
|
|
because the macro runs before the config flags are available for use. An analogy is a
|
||
|
|
C++ macro cannot do a #if on the value of a C++ variable.
|
||
|
|
|
||
|
|
Instead, if a Ganesh GPU backend has not been specified (e.g. --config=cpu), we only compile the
|
||
|
|
BazelNoopRunner.cpp and nothing else (e.g. no deps, not even Skia). This makes any Ganesh GPU
|
||
|
|
tests a trivially passing executable, which can easily be cached and effectively skipped.
|
||
|
|
|
||
|
|
Test files may have both CPU tests (i.e. DEF_TEST) and GPU tests (e.g. DEF_GANESH_TEST). The
|
||
|
|
BazelTestRunner will always run all tests that were compiled in. The CPU tests defined in this
|
||
|
|
way will *not* be run with --config=cpu because they live in a file that can only be compiled
|
||
|
|
with at least one GPU backend; they will be run with a config like --config=gl, along side the
|
||
|
|
GPU tests defined with DEF_GANESH_TEST.
|
||
|
|
|
||
|
|
Args:
|
||
|
|
name: The name of the test_suite that groups these tests together.
|
||
|
|
tests: A list of strings, corresponding to C++ files with one or more DEF_GANESH_TEST
|
||
|
|
(see Test.h).
|
||
|
|
harness: A label (string) corresponding to a skia_cc_library which all the supplementary
|
||
|
|
test helpers, utils, etc. (e.g. Test.h and Test.cpp). Ideally, this is as small
|
||
|
|
as feasible, to avoid unnecessary bloat or recompilation if something unrelated
|
||
|
|
changes.
|
||
|
|
resources: A label corresponding to a file_group target that has any skia resource files
|
||
|
|
(e.g. images, fonts) needed to run these tests. Resources change infrequently,
|
||
|
|
so it's not super important that this be a precise list.
|
||
|
|
flags: A map of strings to lists of strings to specify features that must be compiled in
|
||
|
|
for these tests to work. For example, tests targeting our codec logic will want the
|
||
|
|
various codecs included, but most tests won't need that.
|
||
|
|
extra_deps: A list of labels corresponding to skia_cc_library targets which this test needs
|
||
|
|
to work, typically some utility located under //tools
|
||
|
|
limit_to: A list of platform labels (e.g. @platform//os:foo; @platform//cpu:bar) which
|
||
|
|
restrict where this test will be compiled and ran. If the list is empty, it will
|
||
|
|
run anywhere. If it is non-empty, it will only run on platforms which match the
|
||
|
|
entire set of constraints. See https://github.com/bazelbuild/platforms for these.
|
||
|
|
"""
|
||
|
|
test_targets = []
|
||
|
|
for filename in tests:
|
||
|
|
new_target = filename[:-4] # trim .cpp
|
||
|
|
test_targets.append(new_target)
|
||
|
|
cc_test_with_flags(
|
||
|
|
name = new_target,
|
||
|
|
size = "small",
|
||
|
|
srcs = select({
|
||
|
|
"//src/gpu:has_gpu_backend": [
|
||
|
|
"BazelTestRunner.cpp",
|
||
|
|
filename,
|
||
|
|
],
|
||
|
|
# Make this a no-op test if not compiling with a Ganesh GPU backend.
|
||
|
|
"//conditions:default": ["BazelNoopRunner.cpp"],
|
||
|
|
}),
|
||
|
|
deps = select({
|
||
|
|
# Only build and apply deps if we have a no-op test.
|
||
|
|
"//src/gpu:has_gpu_backend": [
|
||
|
|
harness,
|
||
|
|
"//:skia_internal",
|
||
|
|
] + extra_deps,
|
||
|
|
"//conditions:default": [],
|
||
|
|
}),
|
||
|
|
data = resources,
|
||
|
|
set_flags = flags,
|
||
|
|
target_compatible_with = limit_to,
|
||
|
|
tags = [
|
||
|
|
# We currently have no RBE machines with GPUs, so we cannot run these remotely.
|
||
|
|
"no-remote",
|
||
|
|
],
|
||
|
|
)
|
||
|
|
|
||
|
|
# https://bazel.build/reference/be/general#test_suite
|
||
|
|
native.test_suite(
|
||
|
|
name = name,
|
||
|
|
tests = test_targets,
|
||
|
|
)
|