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