xref: /aosp_15_r20/external/dagger2/test_defs.bzl (revision f585d8a307d0621d6060bd7e80091fdcbf94fe27)
1*f585d8a3SJacky Wang# Copyright (C) 2017 The Dagger Authors.
2*f585d8a3SJacky Wang#
3*f585d8a3SJacky Wang# Licensed under the Apache License, Version 2.0 (the "License");
4*f585d8a3SJacky Wang# you may not use this file except in compliance with the License.
5*f585d8a3SJacky Wang# You may obtain a copy of the License at
6*f585d8a3SJacky Wang#
7*f585d8a3SJacky Wang# http://www.apache.org/licenses/LICENSE-2.0
8*f585d8a3SJacky Wang#
9*f585d8a3SJacky Wang# Unless required by applicable law or agreed to in writing, software
10*f585d8a3SJacky Wang# distributed under the License is distributed on an "AS IS" BASIS,
11*f585d8a3SJacky Wang# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*f585d8a3SJacky Wang# See the License for the specific language governing permissions and
13*f585d8a3SJacky Wang# limitations under the License.
14*f585d8a3SJacky Wang
15*f585d8a3SJacky Wang"""This file defines constants useful across the Dagger tests."""
16*f585d8a3SJacky Wang
17*f585d8a3SJacky Wangload("@rules_java//java:defs.bzl", "java_library", "java_test")
18*f585d8a3SJacky Wangload("//:build_defs.bzl", "JAVA_RELEASE_MIN")
19*f585d8a3SJacky Wangload(
20*f585d8a3SJacky Wang    "@io_bazel_rules_kotlin//kotlin:kotlin.bzl",
21*f585d8a3SJacky Wang    "kt_jvm_library",
22*f585d8a3SJacky Wang    "kt_jvm_test",
23*f585d8a3SJacky Wang)
24*f585d8a3SJacky Wang
25*f585d8a3SJacky Wang# Defines a set of build variants and the list of extra javacopts to build with.
26*f585d8a3SJacky Wang# The key will be appended to the generated test names to ensure uniqueness.
27*f585d8a3SJacky Wang_NON_FUNCTIONAL_BUILD_VARIANTS = {None: []}
28*f585d8a3SJacky Wang_FUNCTIONAL_BUILD_VARIANTS = {
29*f585d8a3SJacky Wang    None: [],  # The default build variant (no javacopts).
30*f585d8a3SJacky Wang    "ExtendsComponent": ["-Adagger.generatedClassExtendsComponent=enabled"],
31*f585d8a3SJacky Wang    "Shards": ["-Adagger.keysPerComponentShard=2"],
32*f585d8a3SJacky Wang    "FastInit": ["-Adagger.fastInit=enabled"],
33*f585d8a3SJacky Wang    "FastInit_Shards": ["-Adagger.fastInit=enabled", "-Adagger.keysPerComponentShard=2"],
34*f585d8a3SJacky Wang}
35*f585d8a3SJacky Wang
36*f585d8a3SJacky Wangdef GenKtLibrary(
37*f585d8a3SJacky Wang        name,
38*f585d8a3SJacky Wang        srcs,
39*f585d8a3SJacky Wang        deps = None,
40*f585d8a3SJacky Wang        gen_library_deps = None,
41*f585d8a3SJacky Wang        plugins = None,
42*f585d8a3SJacky Wang        javacopts = None,
43*f585d8a3SJacky Wang        functional = True,
44*f585d8a3SJacky Wang        require_jdk7_syntax = True):
45*f585d8a3SJacky Wang    _GenTestsWithVariants(
46*f585d8a3SJacky Wang        library_rule_type = kt_jvm_library,
47*f585d8a3SJacky Wang        test_rule_type = None,
48*f585d8a3SJacky Wang        name = name,
49*f585d8a3SJacky Wang        srcs = srcs,
50*f585d8a3SJacky Wang        deps = deps,
51*f585d8a3SJacky Wang        gen_library_deps = gen_library_deps,
52*f585d8a3SJacky Wang        test_only_deps = None,
53*f585d8a3SJacky Wang        shard_count = None,
54*f585d8a3SJacky Wang        plugins = plugins,
55*f585d8a3SJacky Wang        javacopts = javacopts,
56*f585d8a3SJacky Wang        functional = functional,
57*f585d8a3SJacky Wang        require_jdk7_syntax = require_jdk7_syntax,
58*f585d8a3SJacky Wang    )
59*f585d8a3SJacky Wang
60*f585d8a3SJacky Wangdef GenKtTests(
61*f585d8a3SJacky Wang        name,
62*f585d8a3SJacky Wang        srcs,
63*f585d8a3SJacky Wang        deps = None,
64*f585d8a3SJacky Wang        gen_library_deps = None,
65*f585d8a3SJacky Wang        test_only_deps = None,
66*f585d8a3SJacky Wang        plugins = None,
67*f585d8a3SJacky Wang        javacopts = None,
68*f585d8a3SJacky Wang        shard_count = None,
69*f585d8a3SJacky Wang        functional = True,
70*f585d8a3SJacky Wang        require_jdk7_syntax = True):
71*f585d8a3SJacky Wang    _GenTestsWithVariants(
72*f585d8a3SJacky Wang        library_rule_type = kt_jvm_library,
73*f585d8a3SJacky Wang        test_rule_type = kt_jvm_test,
74*f585d8a3SJacky Wang        name = name,
75*f585d8a3SJacky Wang        srcs = srcs,
76*f585d8a3SJacky Wang        deps = deps,
77*f585d8a3SJacky Wang        gen_library_deps = gen_library_deps,
78*f585d8a3SJacky Wang        test_only_deps = test_only_deps,
79*f585d8a3SJacky Wang        plugins = plugins,
80*f585d8a3SJacky Wang        javacopts = javacopts,
81*f585d8a3SJacky Wang        shard_count = shard_count,
82*f585d8a3SJacky Wang        functional = functional,
83*f585d8a3SJacky Wang        require_jdk7_syntax = require_jdk7_syntax,
84*f585d8a3SJacky Wang    )
85*f585d8a3SJacky Wang
86*f585d8a3SJacky Wangdef GenJavaLibrary(
87*f585d8a3SJacky Wang        name,
88*f585d8a3SJacky Wang        srcs,
89*f585d8a3SJacky Wang        deps = None,
90*f585d8a3SJacky Wang        gen_library_deps = None,
91*f585d8a3SJacky Wang        plugins = None,
92*f585d8a3SJacky Wang        javacopts = None,
93*f585d8a3SJacky Wang        functional = True,
94*f585d8a3SJacky Wang        require_jdk7_syntax = True):
95*f585d8a3SJacky Wang    if any([src for src in srcs if src.endswith(".kt")]):
96*f585d8a3SJacky Wang        fail("GenJavaLibrary ':{0}' should not contain kotlin sources.".format(name))
97*f585d8a3SJacky Wang    _GenTestsWithVariants(
98*f585d8a3SJacky Wang        library_rule_type = java_library,
99*f585d8a3SJacky Wang        test_rule_type = None,
100*f585d8a3SJacky Wang        name = name,
101*f585d8a3SJacky Wang        srcs = srcs,
102*f585d8a3SJacky Wang        deps = deps,
103*f585d8a3SJacky Wang        gen_library_deps = gen_library_deps,
104*f585d8a3SJacky Wang        test_only_deps = None,
105*f585d8a3SJacky Wang        plugins = plugins,
106*f585d8a3SJacky Wang        javacopts = javacopts,
107*f585d8a3SJacky Wang        shard_count = None,
108*f585d8a3SJacky Wang        functional = functional,
109*f585d8a3SJacky Wang        require_jdk7_syntax = require_jdk7_syntax,
110*f585d8a3SJacky Wang    )
111*f585d8a3SJacky Wang
112*f585d8a3SJacky Wangdef GenJavaTests(
113*f585d8a3SJacky Wang        name,
114*f585d8a3SJacky Wang        srcs,
115*f585d8a3SJacky Wang        deps = None,
116*f585d8a3SJacky Wang        gen_library_deps = None,
117*f585d8a3SJacky Wang        test_only_deps = None,
118*f585d8a3SJacky Wang        plugins = None,
119*f585d8a3SJacky Wang        javacopts = None,
120*f585d8a3SJacky Wang        shard_count = None,
121*f585d8a3SJacky Wang        functional = True,
122*f585d8a3SJacky Wang        require_jdk7_syntax = True):
123*f585d8a3SJacky Wang    if any([src for src in srcs if src.endswith(".kt")]):
124*f585d8a3SJacky Wang        fail("GenJavaTests ':{0}' should not contain kotlin sources.".format(name))
125*f585d8a3SJacky Wang    _GenTestsWithVariants(
126*f585d8a3SJacky Wang        library_rule_type = java_library,
127*f585d8a3SJacky Wang        test_rule_type = java_test,
128*f585d8a3SJacky Wang        name = name,
129*f585d8a3SJacky Wang        srcs = srcs,
130*f585d8a3SJacky Wang        deps = deps,
131*f585d8a3SJacky Wang        gen_library_deps = gen_library_deps,
132*f585d8a3SJacky Wang        test_only_deps = test_only_deps,
133*f585d8a3SJacky Wang        plugins = plugins,
134*f585d8a3SJacky Wang        javacopts = javacopts,
135*f585d8a3SJacky Wang        shard_count = shard_count,
136*f585d8a3SJacky Wang        functional = functional,
137*f585d8a3SJacky Wang        require_jdk7_syntax = require_jdk7_syntax,
138*f585d8a3SJacky Wang    )
139*f585d8a3SJacky Wang
140*f585d8a3SJacky Wangdef GenRobolectricTests(
141*f585d8a3SJacky Wang        name,
142*f585d8a3SJacky Wang        srcs,
143*f585d8a3SJacky Wang        deps = None,
144*f585d8a3SJacky Wang        test_only_deps = None,
145*f585d8a3SJacky Wang        plugins = None,
146*f585d8a3SJacky Wang        javacopts = None,
147*f585d8a3SJacky Wang        shard_count = None,
148*f585d8a3SJacky Wang        functional = True,
149*f585d8a3SJacky Wang        require_jdk7_syntax = True,
150*f585d8a3SJacky Wang        manifest_values = None):
151*f585d8a3SJacky Wang    deps = (deps or []) + ["//:android_local_test_exports"]
152*f585d8a3SJacky Wang    _GenTestsWithVariants(
153*f585d8a3SJacky Wang        library_rule_type = native.android_library,
154*f585d8a3SJacky Wang        test_rule_type = native.android_local_test,
155*f585d8a3SJacky Wang        name = name,
156*f585d8a3SJacky Wang        srcs = srcs,
157*f585d8a3SJacky Wang        deps = deps,
158*f585d8a3SJacky Wang        gen_library_deps = None,
159*f585d8a3SJacky Wang        test_only_deps = test_only_deps,
160*f585d8a3SJacky Wang        plugins = plugins,
161*f585d8a3SJacky Wang        javacopts = javacopts,
162*f585d8a3SJacky Wang        shard_count = shard_count,
163*f585d8a3SJacky Wang        functional = functional,
164*f585d8a3SJacky Wang        require_jdk7_syntax = require_jdk7_syntax,
165*f585d8a3SJacky Wang        test_kwargs = {"manifest_values": manifest_values},
166*f585d8a3SJacky Wang    )
167*f585d8a3SJacky Wang
168*f585d8a3SJacky Wangdef _GenTestsWithVariants(
169*f585d8a3SJacky Wang        library_rule_type,
170*f585d8a3SJacky Wang        test_rule_type,
171*f585d8a3SJacky Wang        name,
172*f585d8a3SJacky Wang        srcs,
173*f585d8a3SJacky Wang        deps,
174*f585d8a3SJacky Wang        gen_library_deps,
175*f585d8a3SJacky Wang        test_only_deps,
176*f585d8a3SJacky Wang        plugins,
177*f585d8a3SJacky Wang        javacopts,
178*f585d8a3SJacky Wang        shard_count,
179*f585d8a3SJacky Wang        functional,
180*f585d8a3SJacky Wang        require_jdk7_syntax,
181*f585d8a3SJacky Wang        test_kwargs = None):
182*f585d8a3SJacky Wang    test_files = [src for src in srcs if _is_test(src)]
183*f585d8a3SJacky Wang    supporting_files = [src for src in srcs if not _is_test(src)]
184*f585d8a3SJacky Wang
185*f585d8a3SJacky Wang    if test_rule_type and not test_files:
186*f585d8a3SJacky Wang        fail("':{0}' should contain at least 1 test source.".format(name))
187*f585d8a3SJacky Wang
188*f585d8a3SJacky Wang    if not test_rule_type and test_files:
189*f585d8a3SJacky Wang        fail("':{0}' should not contain any test sources.".format(name))
190*f585d8a3SJacky Wang
191*f585d8a3SJacky Wang    if test_kwargs == None:
192*f585d8a3SJacky Wang        test_kwargs = {}
193*f585d8a3SJacky Wang
194*f585d8a3SJacky Wang    if deps == None:
195*f585d8a3SJacky Wang        deps = []
196*f585d8a3SJacky Wang
197*f585d8a3SJacky Wang    if gen_library_deps == None:
198*f585d8a3SJacky Wang        gen_library_deps = []
199*f585d8a3SJacky Wang
200*f585d8a3SJacky Wang    if test_only_deps == None:
201*f585d8a3SJacky Wang        test_only_deps = []
202*f585d8a3SJacky Wang
203*f585d8a3SJacky Wang    if plugins == None:
204*f585d8a3SJacky Wang        plugins = []
205*f585d8a3SJacky Wang
206*f585d8a3SJacky Wang    if javacopts == None:
207*f585d8a3SJacky Wang        javacopts = []
208*f585d8a3SJacky Wang
209*f585d8a3SJacky Wang    build_variants = _FUNCTIONAL_BUILD_VARIANTS if functional else _NON_FUNCTIONAL_BUILD_VARIANTS
210*f585d8a3SJacky Wang    for (variant_name, variant_javacopts) in build_variants.items():
211*f585d8a3SJacky Wang        for is_ksp in (True, False):
212*f585d8a3SJacky Wang            if variant_name:
213*f585d8a3SJacky Wang                suffix = "_" + variant_name
214*f585d8a3SJacky Wang                tags = [variant_name]
215*f585d8a3SJacky Wang
216*f585d8a3SJacky Wang                # Add jvm_flags so that the mode can be accessed from within tests.
217*f585d8a3SJacky Wang                jvm_flags = ["-Ddagger.mode=" + variant_name]
218*f585d8a3SJacky Wang            else:
219*f585d8a3SJacky Wang                suffix = ""
220*f585d8a3SJacky Wang                tags = []
221*f585d8a3SJacky Wang                jvm_flags = []
222*f585d8a3SJacky Wang
223*f585d8a3SJacky Wang            if is_ksp:
224*f585d8a3SJacky Wang                continue # KSP not yet supported in Bazel
225*f585d8a3SJacky Wang
226*f585d8a3SJacky Wang            variant_deps = [canonical_dep_name(dep) + suffix for dep in gen_library_deps]
227*f585d8a3SJacky Wang            test_deps = deps + test_only_deps
228*f585d8a3SJacky Wang            if supporting_files:
229*f585d8a3SJacky Wang                supporting_files_name = name + suffix + ("_lib" if test_files else "")
230*f585d8a3SJacky Wang                _GenLibraryWithVariant(
231*f585d8a3SJacky Wang                    library_rule_type = library_rule_type,
232*f585d8a3SJacky Wang                    name = supporting_files_name,
233*f585d8a3SJacky Wang                    srcs = supporting_files,
234*f585d8a3SJacky Wang                    tags = tags,
235*f585d8a3SJacky Wang                    deps = deps + variant_deps,
236*f585d8a3SJacky Wang                    plugins = plugins,
237*f585d8a3SJacky Wang                    javacopts = javacopts + variant_javacopts,
238*f585d8a3SJacky Wang                    functional = functional,
239*f585d8a3SJacky Wang                    require_jdk7_syntax = require_jdk7_syntax,
240*f585d8a3SJacky Wang                )
241*f585d8a3SJacky Wang                test_deps.append(supporting_files_name)
242*f585d8a3SJacky Wang
243*f585d8a3SJacky Wang            for test_file in test_files:
244*f585d8a3SJacky Wang                test_name = test_file.rsplit(".", 1)[0]
245*f585d8a3SJacky Wang                _GenTestWithVariant(
246*f585d8a3SJacky Wang                    library_rule_type = library_rule_type,
247*f585d8a3SJacky Wang                    test_rule_type = test_rule_type,
248*f585d8a3SJacky Wang                    name = test_name + suffix,
249*f585d8a3SJacky Wang                    srcs = [test_file],
250*f585d8a3SJacky Wang                    tags = tags,
251*f585d8a3SJacky Wang                    deps = test_deps + variant_deps,
252*f585d8a3SJacky Wang                    plugins = plugins,
253*f585d8a3SJacky Wang                    javacopts = javacopts + variant_javacopts,
254*f585d8a3SJacky Wang                    shard_count = shard_count,
255*f585d8a3SJacky Wang                    jvm_flags = jvm_flags,
256*f585d8a3SJacky Wang                    functional = functional,
257*f585d8a3SJacky Wang                    test_kwargs = test_kwargs,
258*f585d8a3SJacky Wang                )
259*f585d8a3SJacky Wang
260*f585d8a3SJacky Wangdef _GenLibraryWithVariant(
261*f585d8a3SJacky Wang        library_rule_type,
262*f585d8a3SJacky Wang        name,
263*f585d8a3SJacky Wang        srcs,
264*f585d8a3SJacky Wang        tags,
265*f585d8a3SJacky Wang        deps,
266*f585d8a3SJacky Wang        plugins,
267*f585d8a3SJacky Wang        javacopts,
268*f585d8a3SJacky Wang        functional,
269*f585d8a3SJacky Wang        require_jdk7_syntax):
270*f585d8a3SJacky Wang    if functional and require_jdk7_syntax:
271*f585d8a3SJacky Wang        # TODO(b/261894425): Decide if we still want to apply JAVA_RELEASE_MIN by default.
272*f585d8a3SJacky Wang        # Note: Technically, we should also apply JAVA_RELEASE_MIN to tests too, since we have
273*f585d8a3SJacky Wang        # Dagger code in there as well, but we keep it only on libraries for legacy reasons, and
274*f585d8a3SJacky Wang        # fixing tests to be jdk7 compatible would require a bit of work. We should decide on
275*f585d8a3SJacky Wang        # b/261894425 before committing to that work.
276*f585d8a3SJacky Wang        library_javacopts_kwargs = {"javacopts": javacopts + JAVA_RELEASE_MIN}
277*f585d8a3SJacky Wang    else:
278*f585d8a3SJacky Wang        library_javacopts_kwargs = {"javacopts": javacopts}
279*f585d8a3SJacky Wang
280*f585d8a3SJacky Wang    # TODO(bcorso): Add javacopts explicitly once kt_jvm_test supports them.
281*f585d8a3SJacky Wang    if library_rule_type in [kt_jvm_library]:
282*f585d8a3SJacky Wang       library_javacopts_kwargs = {}
283*f585d8a3SJacky Wang    library_rule_type(
284*f585d8a3SJacky Wang        name = name,
285*f585d8a3SJacky Wang        testonly = 1,
286*f585d8a3SJacky Wang        srcs = srcs,
287*f585d8a3SJacky Wang        plugins = plugins,
288*f585d8a3SJacky Wang        tags = tags,
289*f585d8a3SJacky Wang        deps = deps,
290*f585d8a3SJacky Wang        **library_javacopts_kwargs
291*f585d8a3SJacky Wang    )
292*f585d8a3SJacky Wang    if functional and _is_hjar_test_supported(library_rule_type):
293*f585d8a3SJacky Wang        _hjar_test(name, tags)
294*f585d8a3SJacky Wang
295*f585d8a3SJacky Wangdef _GenTestWithVariant(
296*f585d8a3SJacky Wang        library_rule_type,
297*f585d8a3SJacky Wang        test_rule_type,
298*f585d8a3SJacky Wang        name,
299*f585d8a3SJacky Wang        srcs,
300*f585d8a3SJacky Wang        tags,
301*f585d8a3SJacky Wang        deps,
302*f585d8a3SJacky Wang        plugins,
303*f585d8a3SJacky Wang        javacopts,
304*f585d8a3SJacky Wang        shard_count,
305*f585d8a3SJacky Wang        jvm_flags,
306*f585d8a3SJacky Wang        functional,
307*f585d8a3SJacky Wang        test_kwargs):
308*f585d8a3SJacky Wang    test_files = [src for src in srcs if _is_test(src)]
309*f585d8a3SJacky Wang    if len(test_files) != 1:
310*f585d8a3SJacky Wang        fail("Expected 1 test source but found multiples: {0}".format(test_files))
311*f585d8a3SJacky Wang
312*f585d8a3SJacky Wang    should_add_goldens = not functional and (test_rule_type == java_test)
313*f585d8a3SJacky Wang    test_name = test_files[0].rsplit(".", 1)[0]
314*f585d8a3SJacky Wang    prefix_path = "src/test/java/"
315*f585d8a3SJacky Wang    package_name = native.package_name()
316*f585d8a3SJacky Wang    if package_name.find("javatests/") != -1:
317*f585d8a3SJacky Wang        prefix_path = "javatests/"
318*f585d8a3SJacky Wang    if should_add_goldens:
319*f585d8a3SJacky Wang        test_kwargs["resources"] = native.glob(["goldens/%s_*" % test_name])
320*f585d8a3SJacky Wang    test_class = (package_name + "/" + test_name).rpartition(prefix_path)[2].replace("/", ".")
321*f585d8a3SJacky Wang    test_kwargs_with_javacopts = {"javacopts": javacopts}
322*f585d8a3SJacky Wang
323*f585d8a3SJacky Wang    # TODO(bcorso): Add javacopts explicitly once kt_jvm_test supports them.
324*f585d8a3SJacky Wang    if test_rule_type == kt_jvm_test:
325*f585d8a3SJacky Wang       test_kwargs_with_javacopts = {}
326*f585d8a3SJacky Wang    test_kwargs_with_javacopts.update(test_kwargs)
327*f585d8a3SJacky Wang    test_rule_type(
328*f585d8a3SJacky Wang        name = name,
329*f585d8a3SJacky Wang        srcs = srcs,
330*f585d8a3SJacky Wang        jvm_flags = jvm_flags,
331*f585d8a3SJacky Wang        plugins = plugins,
332*f585d8a3SJacky Wang        tags = tags,
333*f585d8a3SJacky Wang        shard_count = shard_count,
334*f585d8a3SJacky Wang        test_class = test_class,
335*f585d8a3SJacky Wang        deps = deps,
336*f585d8a3SJacky Wang        **test_kwargs_with_javacopts
337*f585d8a3SJacky Wang    )
338*f585d8a3SJacky Wang
339*f585d8a3SJacky Wangdef _is_hjar_test_supported(bazel_rule):
340*f585d8a3SJacky Wang    return bazel_rule not in (
341*f585d8a3SJacky Wang        kt_jvm_library,
342*f585d8a3SJacky Wang        kt_jvm_test,
343*f585d8a3SJacky Wang        native.android_library,
344*f585d8a3SJacky Wang        native.android_local_test,
345*f585d8a3SJacky Wang    )
346*f585d8a3SJacky Wang
347*f585d8a3SJacky Wangdef _hjar_test(name, tags):
348*f585d8a3SJacky Wang    pass
349*f585d8a3SJacky Wang
350*f585d8a3SJacky Wangdef _is_test(src):
351*f585d8a3SJacky Wang    return src.endswith("Test.java") or src.endswith("Test.kt")
352*f585d8a3SJacky Wang
353*f585d8a3SJacky Wangdef canonical_dep_name(dep):
354*f585d8a3SJacky Wang    if dep.startswith(":"):
355*f585d8a3SJacky Wang        dep = "//" + native.package_name() + dep
356*f585d8a3SJacky Wang    dep_label = Label(dep)
357*f585d8a3SJacky Wang    return "//" + dep_label.package + ":" + dep_label.name
358