diff --git a/rules/android_library/rule.bzl b/rules/android_library/rule.bzl index e36bdd3b0..cd7af67d5 100644 --- a/rules/android_library/rule.bzl +++ b/rules/android_library/rule.bzl @@ -140,7 +140,8 @@ def make_rule( attrs = _ATTRS, implementation = _impl, outputs = _outputs, - additional_toolchains = []): + additional_toolchains = [], + additional_providers = []): """Makes the rule. Args: @@ -148,6 +149,7 @@ def make_rule( implementation: A function. The rule's implementation method. outputs: A dict, function, or None. The rule's outputs. additional_toolchains: A list. Additional toolchains passed to pass to rule(toolchains). + additional_providers: A list. Additional providers passed to pass to rule(providers). Returns: A rule. @@ -167,7 +169,7 @@ def make_rule( AndroidLibraryResourceClassJarProvider, AndroidNativeLibsInfo, JavaInfo, - ], + ] + additional_providers, outputs = outputs, toolchains = [ "//toolchains/android:toolchain_type", diff --git a/test/rules/android_library/BUILD b/test/rules/android_library/BUILD new file mode 100644 index 000000000..866a4549f --- /dev/null +++ b/test/rules/android_library/BUILD @@ -0,0 +1,23 @@ +load(":custom_android_library.bzl", "custom_android_library") +load(":test.bzl", "custom_android_library_test") +load("@bazel_skylib//:bzl_library.bzl", "bzl_library") + +licenses(["notice"]) + +custom_android_library( + name = "custom_android_library", + testonly = True, + key = "test_key", +) + +custom_android_library_test( + name = "custom_android_library_test", + lib = ":custom_android_library", +) + +test_suite( + name = "integration_tests", + tests = [ + ":custom_android_library_test", + ], +) diff --git a/test/rules/android_library/custom_android_library.bzl b/test/rules/android_library/custom_android_library.bzl new file mode 100644 index 000000000..465159536 --- /dev/null +++ b/test/rules/android_library/custom_android_library.bzl @@ -0,0 +1,83 @@ +# Copyright 2018 The Bazel Authors. 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. +load( + "//rules:attrs.bzl", + _attrs = "attrs", +) +load( + "//rules/android_library:rule.bzl", + _make_rule = "make_rule", +) +load( + "//rules/android_library:attrs.bzl", + _BASE_ATTRS = "ATTRS", +) +load( + "//rules:java.bzl", + _java = "java", +) +load( + "//rules:processing_pipeline.bzl", + _ProviderInfo = "ProviderInfo", + _processing_pipeline = "processing_pipeline", +) +load( + "//rules/android_library:impl.bzl", + _BASE_PROCESSORS = "PROCESSORS", + _finalize = "finalize", +) + +CustomProvider = provider( + doc = "Custom provider to provide", + fields = dict( + key = "Some key to provide", + ), +) + +def _process_custom_provider(ctx, **unused_sub_ctxs): + return _ProviderInfo( + name = "custom_provider_ctx", + value = struct( + providers = [ + CustomProvider( + key = ctx.attr.key, + ), + ], + ), + ) + +PROCESSORS = _processing_pipeline.append( + _BASE_PROCESSORS, + CustomProviderProcessor = _process_custom_provider, +) + +_PROCESSING_PIPELINE = _processing_pipeline.make_processing_pipeline( + processors = PROCESSORS, + finalize = _finalize, +) + +def _impl(ctx): + java_package = _java.resolve_package_from_label(ctx.label, ctx.attr.custom_package) + return _processing_pipeline.run(ctx, java_package, _PROCESSING_PIPELINE) + +custom_android_library = _make_rule( + implementation = _impl, + attrs = _attrs.add(_BASE_ATTRS, dict( + # Custom attribute to wrap in a provider + key = attr.string(), + )), + additional_providers = [ + CustomProvider, + ], +) diff --git a/test/rules/android_library/test.bzl b/test/rules/android_library/test.bzl new file mode 100644 index 000000000..b529b87f2 --- /dev/null +++ b/test/rules/android_library/test.bzl @@ -0,0 +1,25 @@ +load( + "//test/utils:lib.bzl", + "asserts", + "unittest", +) +load( + ":custom_android_library.bzl", + "CustomProvider", +) + +def custom_android_library_test_impl(ctx): + env = unittest.begin(ctx) + + # Assert that the custom provider exists + asserts.true(env, CustomProvider in ctx.attr.lib) + asserts.equals(env, ctx.attr.lib[CustomProvider].key, "test_key") + + return unittest.end(env) + +custom_android_library_test = unittest.make( + impl = custom_android_library_test_impl, + attrs = { + "lib": attr.label(providers = [CustomProvider]), + }, +)