xref: /aosp_15_r20/external/bazelbuild-rules_android/test/utils/unittest.bzl (revision 9e965d6fece27a77de5377433c2f7e6999b8cc0b)
1*9e965d6fSRomain Jobredeaux# Copyright 2018 The Bazel Authors. All rights reserved.
2*9e965d6fSRomain Jobredeaux#
3*9e965d6fSRomain Jobredeaux# Licensed under the Apache License, Version 2.0 (the "License");
4*9e965d6fSRomain Jobredeaux# you may not use this file except in compliance with the License.
5*9e965d6fSRomain Jobredeaux# You may obtain a copy of the License at
6*9e965d6fSRomain Jobredeaux#
7*9e965d6fSRomain Jobredeaux#    http://www.apache.org/licenses/LICENSE-2.0
8*9e965d6fSRomain Jobredeaux#
9*9e965d6fSRomain Jobredeaux# Unless required by applicable law or agreed to in writing, software
10*9e965d6fSRomain Jobredeaux# distributed under the License is distributed on an "AS IS" BASIS,
11*9e965d6fSRomain Jobredeaux# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9e965d6fSRomain Jobredeaux# See the License for the specific language governing permissions and
13*9e965d6fSRomain Jobredeaux# limitations under the License.
14*9e965d6fSRomain Jobredeaux
15*9e965d6fSRomain Jobredeaux"""Bazel lib that provides test helpers for testing."""
16*9e965d6fSRomain Jobredeaux
17*9e965d6fSRomain Jobredeauxload(":file.bzl", _file = "file")
18*9e965d6fSRomain Jobredeauxload(
19*9e965d6fSRomain Jobredeaux    "@bazel_skylib//lib:unittest.bzl",
20*9e965d6fSRomain Jobredeaux    _analysistest = "analysistest",
21*9e965d6fSRomain Jobredeaux    _unittest = "unittest",
22*9e965d6fSRomain Jobredeaux)
23*9e965d6fSRomain Jobredeaux
24*9e965d6fSRomain JobredeauxTestInfo = provider(
25*9e965d6fSRomain Jobredeaux    doc = "Provides a test a suggested set of attributes.",
26*9e965d6fSRomain Jobredeaux    fields = {
27*9e965d6fSRomain Jobredeaux        "name": "The name of the test.",
28*9e965d6fSRomain Jobredeaux        "prefix": "The prefix used to isolate artifact and target names.",
29*9e965d6fSRomain Jobredeaux    },
30*9e965d6fSRomain Jobredeaux)
31*9e965d6fSRomain Jobredeaux
32*9e965d6fSRomain Jobredeauxdef _prefix(prefix, name):
33*9e965d6fSRomain Jobredeaux    """Prepends the given prefix to the given name."""
34*9e965d6fSRomain Jobredeaux    return "%s-%s" % (prefix, name)
35*9e965d6fSRomain Jobredeaux
36*9e965d6fSRomain Jobredeauxdef _prefix_from_test_info(test_info, name):
37*9e965d6fSRomain Jobredeaux    """Prepends the prefix of a TestInfo to the given name."""
38*9e965d6fSRomain Jobredeaux    return _prefix(test_info.prefix, name)
39*9e965d6fSRomain Jobredeaux
40*9e965d6fSRomain Jobredeauxdef _test_suite(
41*9e965d6fSRomain Jobredeaux        name = None,
42*9e965d6fSRomain Jobredeaux        test_scenarios = None):
43*9e965d6fSRomain Jobredeaux    """Creates a test suite containing the list of test targets.
44*9e965d6fSRomain Jobredeaux
45*9e965d6fSRomain Jobredeaux    Args:
46*9e965d6fSRomain Jobredeaux      name: Name of the test suite, also used as part of a prefix for naming.
47*9e965d6fSRomain Jobredeaux      test_scenarios: A list of methods, that setup and the test. Each scenario
48*9e965d6fSRomain Jobredeaux        method should accept a TestInfo provider.
49*9e965d6fSRomain Jobredeaux    """
50*9e965d6fSRomain Jobredeaux    test_targets = []
51*9e965d6fSRomain Jobredeaux    for scenario_name, make_scenario in test_scenarios.items():
52*9e965d6fSRomain Jobredeaux        test_prefix = _prefix(name, scenario_name)
53*9e965d6fSRomain Jobredeaux        test_info = TestInfo(
54*9e965d6fSRomain Jobredeaux            prefix = test_prefix,
55*9e965d6fSRomain Jobredeaux            name = test_prefix + "_test",
56*9e965d6fSRomain Jobredeaux        )
57*9e965d6fSRomain Jobredeaux        make_scenario(test_info)
58*9e965d6fSRomain Jobredeaux        test_targets.append(test_info.name)
59*9e965d6fSRomain Jobredeaux
60*9e965d6fSRomain Jobredeaux    native.test_suite(
61*9e965d6fSRomain Jobredeaux        name = name,
62*9e965d6fSRomain Jobredeaux        tests = test_targets,
63*9e965d6fSRomain Jobredeaux    )
64*9e965d6fSRomain Jobredeaux
65*9e965d6fSRomain Jobredeauxdef _fake_java_library(name):
66*9e965d6fSRomain Jobredeaux    class_name = "".join(
67*9e965d6fSRomain Jobredeaux        [part.title() for part in name.replace("-", "_").split("_")],
68*9e965d6fSRomain Jobredeaux    )
69*9e965d6fSRomain Jobredeaux    native.java_library(
70*9e965d6fSRomain Jobredeaux        name = name,
71*9e965d6fSRomain Jobredeaux        srcs = [_file.create(
72*9e965d6fSRomain Jobredeaux            class_name + ".java",
73*9e965d6fSRomain Jobredeaux            contents = """@SuppressWarnings("DefaultPackage")
74*9e965d6fSRomain Jobredeauxclass %s{}""" % class_name,
75*9e965d6fSRomain Jobredeaux        )],
76*9e965d6fSRomain Jobredeaux    )
77*9e965d6fSRomain Jobredeaux
78*9e965d6fSRomain Jobredeauxdef _fake_jar(name):
79*9e965d6fSRomain Jobredeaux    if not name.endswith(".jar"):
80*9e965d6fSRomain Jobredeaux        fail("fake_jar method requires name to end with '.jar'")
81*9e965d6fSRomain Jobredeaux    _fake_java_library(name[:-4])
82*9e965d6fSRomain Jobredeaux    return name
83*9e965d6fSRomain Jobredeaux
84*9e965d6fSRomain Jobredeauxdef _fake_executable(name):
85*9e965d6fSRomain Jobredeaux    return _file.create(name, contents = "echo %s" % name, executable = True)
86*9e965d6fSRomain Jobredeaux
87*9e965d6fSRomain Jobredeauxdef _analysis_test_error(message, *args):
88*9e965d6fSRomain Jobredeaux    return [
89*9e965d6fSRomain Jobredeaux        AnalysisTestResultInfo(
90*9e965d6fSRomain Jobredeaux            success = False,
91*9e965d6fSRomain Jobredeaux            message = message % args,
92*9e965d6fSRomain Jobredeaux        ),
93*9e965d6fSRomain Jobredeaux    ]
94*9e965d6fSRomain Jobredeaux
95*9e965d6fSRomain Jobredeauxanalysistest = _analysistest
96*9e965d6fSRomain Jobredeaux
97*9e965d6fSRomain Jobredeauxunittest = struct(
98*9e965d6fSRomain Jobredeaux    # Forward through unittest methods through the current unittest.
99*9e965d6fSRomain Jobredeaux    analysis_test_error = _analysis_test_error,
100*9e965d6fSRomain Jobredeaux    begin = _unittest.begin,
101*9e965d6fSRomain Jobredeaux    end = _unittest.end,
102*9e965d6fSRomain Jobredeaux    fake_executable = _fake_executable,
103*9e965d6fSRomain Jobredeaux    fake_jar = _fake_jar,
104*9e965d6fSRomain Jobredeaux    fake_java_library = _fake_java_library,
105*9e965d6fSRomain Jobredeaux    make = _unittest.make,
106*9e965d6fSRomain Jobredeaux    prefix = _prefix_from_test_info,
107*9e965d6fSRomain Jobredeaux    test_suite = _test_suite,
108*9e965d6fSRomain Jobredeaux)
109