blob: 79d385c1ac44ea6d189a02f4bb586a5c1278d648 [file] [log] [blame]
# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
load("@bazel_skylib//lib:unittest.bzl", "analysistest", "asserts")
load("@rules_fuchsia//fuchsia:defs.bzl", "fuchsia_package", "fuchsia_package_resource")
load("@rules_fuchsia//fuchsia/private:providers.bzl", "FuchsiaComponentInfo", "FuchsiaPackageInfo", "FuchsiaPackageResourcesInfo")
load("@rules_fuchsia//fuchsia/private:utils.bzl", "make_resource_struct")
## Name Tests
def _name_test_impl(ctx):
env = analysistest.begin(ctx)
target_under_test = analysistest.target_under_test(env)
package_info = target_under_test[FuchsiaPackageInfo]
if ctx.attr.package_name:
asserts.equals(
env,
ctx.attr.package_name,
package_info.package_name,
)
if ctx.attr.archive_name:
asserts.equals(
env,
ctx.attr.archive_name,
package_info.far_file.basename,
)
return analysistest.end(env)
name_test = analysistest.make(
_name_test_impl,
attrs = {
"package_name": attr.string(),
"archive_name": attr.string(),
},
)
def _test_package_and_archive_name():
fuchsia_package(
name = "empty",
tags = ["manual"],
)
fuchsia_package(
name = "foo_pkg",
package_name = "foo",
archive_name = "some_other_archive",
tags = ["manual"],
)
name_test(
name = "name_test_empty_package",
target_under_test = ":empty",
package_name = "empty",
archive_name = "empty.far",
)
name_test(
name = "name_test_names_provided",
target_under_test = ":foo_pkg",
package_name = "foo",
archive_name = "some_other_archive.far",
)
def _mock_component_impl(ctx):
manifest = ctx.actions.declare_file(ctx.attr.manifest_name)
ctx.actions.write(output = manifest, content = "{}")
return FuchsiaComponentInfo(
name = "foo",
manifest = manifest,
resources = [],
is_driver = ctx.attr.is_driver,
is_test = False,
)
_mock_component = rule(
implementation = _mock_component_impl,
attrs = {
"manifest_name": attr.string(),
"is_driver": attr.bool(),
},
)
def _dependencies_test_impl(ctx):
env = analysistest.begin(ctx)
target_under_test = analysistest.target_under_test(env)
package_info = target_under_test[FuchsiaPackageInfo]
asserts.equals(
env,
sorted(package_info.components),
sorted(ctx.attr.expected_components),
)
asserts.equals(
env,
sorted(package_info.drivers),
sorted(ctx.attr.expected_drivers),
)
return analysistest.end(env)
dependencies_test = analysistest.make(
_dependencies_test_impl,
attrs = {
"expected_components": attr.string_list(),
"expected_drivers": attr.string_list(),
},
)
def _test_package_deps():
for i in range(1, 3):
_mock_component(
name = "component_" + str(i),
manifest_name = "component_" + str(i) + ".cm",
is_driver = False,
)
_mock_component(
name = "driver_" + str(i),
manifest_name = "driver_" + str(i) + ".cm",
is_driver = True,
)
fuchsia_package(
name = "single_component",
tags = ["manual"],
components = [":component_1"],
)
fuchsia_package(
name = "single_driver",
tags = ["manual"],
components = [":driver_1"],
)
fuchsia_package(
name = "composite",
tags = ["manual"],
components = [
":component_1",
":component_2",
":driver_1",
":driver_2",
],
)
dependencies_test(
name = "dependencies_test_single_component",
target_under_test = ":single_component",
expected_components = ["meta/component_1.cm"],
)
dependencies_test(
name = "dependencies_test_single_driver",
target_under_test = ":single_driver",
expected_components = ["meta/driver_1.cm"],
expected_drivers = ["meta/driver_1.cm"],
)
dependencies_test(
name = "dependencies_test_composite",
target_under_test = ":composite",
expected_components = [
"meta/component_1.cm",
"meta/component_2.cm",
"meta/driver_1.cm",
"meta/driver_2.cm",
],
expected_drivers = [
"meta/driver_1.cm",
"meta/driver_2.cm",
],
)
# Entry point from the BUILD file; macro for running each test case's macro and
# declaring a test suite that wraps them together.
def fuchsia_package_test_suite(name):
# Call all test functions and wrap their targets in a suite.
_test_package_and_archive_name()
_test_package_deps()
native.test_suite(
name = name,
tests = [
":name_test_names_provided",
":name_test_empty_package",
":dependencies_test_single_component",
":dependencies_test_single_driver",
":dependencies_test_composite",
],
)