diff options
Diffstat (limited to 'kotlin/jvm/testing/jvm_library_analysis_test.bzl')
-rw-r--r-- | kotlin/jvm/testing/jvm_library_analysis_test.bzl | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/kotlin/jvm/testing/jvm_library_analysis_test.bzl b/kotlin/jvm/testing/jvm_library_analysis_test.bzl new file mode 100644 index 0000000..6e05b28 --- /dev/null +++ b/kotlin/jvm/testing/jvm_library_analysis_test.bzl @@ -0,0 +1,155 @@ +# Copyright 2022 Google LLC. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the License); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""kt_jvm_library_analysis_test""" + +load("//:visibility.bzl", "RULES_KOTLIN") +load("//kotlin/common/testing:analysis.bzl", "kt_analysis") +load("//kotlin/common/testing:asserts.bzl", "kt_asserts") +load("@bazel_skylib//lib:sets.bzl", "sets") +load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts") + +visibility(RULES_KOTLIN) + +kt_jvm_library_analysis_test = analysistest.make( + impl = lambda ctx: _kt_jvm_library_analysis_test_impl(ctx), + attrs = dict( + expected_al_ruleset_names = attr.string_list( + doc = "Android Lint rule JARs reported as run on the given target", + default = kt_analysis.DEFAULT_LIST, + ), + expected_compile_jar_names = attr.string_list( + doc = "Names of all JavaInfo::compile_jars for the given target", + default = kt_analysis.DEFAULT_LIST, + ), + expected_exported_processor_jar_names = attr.string_list( + doc = "Names of all JavaInfo::plugins JARs returned by the given target", + default = kt_analysis.DEFAULT_LIST, + ), + expected_exported_processor_classes = attr.string_list( + doc = "Annotation processors reported as to be run on depending targets", + ), + expected_processor_classes = attr.string_list( + doc = "Annotation processors reported as run on the given target", + ), + expected_kotlinc_plugin_jar_names = attr.string_list( + doc = "Names of all -Xplugin= JARs", + default = kt_analysis.DEFAULT_LIST, + ), + expected_friend_jar_names = attr.string_list( + doc = "Names of all -Xfriend-paths= JARs", + default = kt_analysis.DEFAULT_LIST, + ), + expected_runfile_names = attr.string_list( + doc = "Names of all runfiles", + default = kt_analysis.DEFAULT_LIST, + ), + expect_jdeps = attr.bool(default = True), + expect_processor_classpath = attr.bool(), + expect_neverlink = attr.bool(), + required_mnemonic_counts = attr.string_dict( + doc = "Expected mnemonics to expected action count; unlisted mnemonics are ignored", + ), + ), +) + +def _kt_jvm_library_analysis_test_impl(ctx): + kt_analysis.check_endswith_test(ctx) + + env = analysistest.begin(ctx) + actual = ctx.attr.target_under_test + + actions = analysistest.target_actions(env) + kt_al_action = kt_analysis.get_action(actions, "KtAndroidLint") + + asserts.true( + env, + JavaInfo in actual, + "kt_jvm_library did not produce JavaInfo provider.", + ) + asserts.true( + env, + ProguardSpecProvider in actual, + "Expected a ProguardSpecProvider provider.", + ) + + if ctx.attr.expected_runfile_names != kt_analysis.DEFAULT_LIST: + asserts.set_equals( + env, + sets.make(ctx.attr.expected_runfile_names), + sets.make([ + f.basename + for f in actual[DefaultInfo].data_runfiles.files.to_list() + ]), + ) + + if ctx.attr.expected_compile_jar_names != kt_analysis.DEFAULT_LIST: + asserts.set_equals( + env, + sets.make(ctx.attr.expected_compile_jar_names), + sets.make([f.basename for f in actual[JavaInfo].compile_jars.to_list()]), + "kt_jvm_library JavaInfo::compile_jars", + ) + + if ctx.attr.expected_exported_processor_jar_names != kt_analysis.DEFAULT_LIST: + asserts.set_equals( + env, + sets.make(ctx.attr.expected_exported_processor_jar_names), + sets.make([f.basename for f in actual[JavaInfo].plugins.processor_jars.to_list()]), + ) + + asserts.set_equals( + env, + sets.make(ctx.attr.expected_exported_processor_classes), + sets.make(actual[JavaInfo].plugins.processor_classes.to_list()), + ) + + kt_2_java_compile = kt_analysis.get_action(actions, "Kt2JavaCompile") + + if kt_2_java_compile: + asserts.true( + env, + kt_2_java_compile.outputs.to_list()[0].basename.endswith(".jar"), + "Expected first output to be a JAR (this affects the param file name).", + ) + + if ctx.attr.expected_friend_jar_names != kt_analysis.DEFAULT_LIST: + friend_paths_arg = kt_analysis.get_arg(kt_2_java_compile, "-Xfriend-paths=") + kt_asserts.list_matches( + env, + expected = ["/" + x for x in ctx.attr.expected_friend_jar_names], + actual = friend_paths_arg.split(",") if friend_paths_arg else [], + matcher = lambda expected, actual: actual.endswith(expected), + items_name = "friend JARs", + ) + + if ctx.attr.expected_kotlinc_plugin_jar_names != kt_analysis.DEFAULT_LIST: + kt_asserts.list_matches( + env, + expected = ["/" + x for x in ctx.attr.expected_kotlinc_plugin_jar_names], + actual = kt_analysis.get_all_args(kt_2_java_compile, "-Xplugin="), + matcher = lambda expected, actual: actual.endswith(expected), + items_name = "kotlinc plugin JARs", + ) + + asserts.equals( + env, + ctx.attr.expect_neverlink, + len(actual[JavaInfo].transitive_runtime_jars.to_list()) == 0, + "Mismatch: Expected transitive_runtime_jars iff (neverlink == False)", + ) + + kt_asserts.required_mnemonic_counts(env, ctx.attr.required_mnemonic_counts, actions) + + return analysistest.end(env) |