# Copyright 2019 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.
#

group("deprecated_misc_storage_allowlist") {
  #  ________  _________  ________  ________
  # |\   ____\|\___   ___\\   __  \|\   __  \
  # \ \  \___|\|___ \  \_\ \  \|\  \ \  \|\  \
  #  \ \_____  \   \ \  \ \ \  \\\  \ \   ____\
  #   \|____|\  \   \ \  \ \ \  \\\  \ \  \___|
  #     ____\_\  \   \ \__\ \ \_______\ \__\
  #    |\_________\   \|__|  \|_______|\|__|
  #    \|_________|
  # This is an allowlist of packages that have components manifests that include
  # the "deprecated-misc-storage" feature. This is only intended to be used as
  # a temporary hack for OTAs. Do not add to this list.
  visibility = [
    "//garnet/go/src/amber:amber",
    "//garnet/bin/system-update-checker",
  ]
}

group("deprecated_bare_tests_allowlist") {
  #  ________  _________  ________  ________
  # |\   ____\|\___   ___\\   __  \|\   __  \
  # \ \  \___|\|___ \  \_\ \  \|\  \ \  \|\  \
  #  \ \_____  \   \ \  \ \ \  \\\  \ \   ____\
  #   \|____|\  \   \ \  \ \ \  \\\  \ \  \___|
  #     ____\_\  \   \ \__\ \ \_______\ \__\
  #    |\_________\   \|__|  \|_______|\|__|
  #    \|_________|
  # This is an allowlist of packages that have bare tests which haven't been converted to components yet.
  # This is only intended to be used as a temporary allowlist. Do not add to this list.
  visibility = [
    "//src/ledger/cloud_provider_memory_diff:cloud_provider_memory_diff_tests",
    "//peridot/bin/sessionmgr/entity_provider_runner:entity_provider_runner_unittests",
    "//topaz/runtime/dart_runner/examples/goodbye_dart:goodbye_dart_test",
    "//src/connectivity/wlan/drivers/third_party/intel/iwlwifi/test:iwlwifi_test",
    "//src/ledger:ledger_tests",
    "//third_party/leveldb:leveldb_tests",
    "//peridot/tests:modular_tests",
    "//topaz/runtime/dart/utils:run_vmservice_object_tests",
    "//src/connectivity/wlan/wlanstack:wlanstack-tests",
    "//garnet/bin/zircon_benchmarks:zircon_benchmarks",
    "//src/graphics/lib/compute/spinel-rs:spinel-rs-tests",
    "//src/lib/ui/input-synthesis:input-synthesis-tests",
    "//garnet/tests/zircon/bringup:bringup_bootfs_test",
    "//garnet/drivers/video/amlogic-decoder:test_amlogic_codec_factory_package",
    "//src/lib/rust_backtrace:rust_backtrace_tests",
  ]
}

group("deprecated_shell_allowlist") {
  #  ________  _________  ________  ________
  # |\   ____\|\___   ___\\   __  \|\   __  \
  # \ \  \___|\|___ \  \_\ \  \|\  \ \  \|\  \
  #  \ \_____  \   \ \  \ \ \  \\\  \ \   ____\
  #   \|____|\  \   \ \  \ \ \  \\\  \ \  \___|
  #     ____\_\  \   \ \__\ \ \_______\ \__\
  #    |\_________\   \|__|  \|_______|\|__|
  #    \|_________|
  # This is an allowlist of packages that have components manifests that include
  # the "deprecated-shell" feature. Do not add to this list. If the manifest
  # does not otherwise include the feature you need, please file a feature
  # request for that fine-grained feature to help us support least-privileged
  # components.
  visibility = [
    "//garnet/bin/appmgr:appmgr_unittests",
    "//garnet/bin/appmgr/integration_tests:appmgr_integration_tests",
    "//garnet/bin/appmgr/integration_tests/components:components_binary_tests",
    "//garnet/bin/appmgr/integration_tests/inspect:inspect_integration_tests",
    "//garnet/bin/appmgr/integration_tests/inspect:inspect_vmo_integration_tests",
    "//garnet/bin/appmgr/integration_tests/sandbox/features/shell:has_deprecated_shell",
    "//garnet/bin/archivist:archivist",
    "//garnet/bin/chrealm/integration_tests:chrealm_integrationtests",
    "//garnet/bin/cpuperf_provider:cpuperf_provider_tests",
    "//garnet/bin/glob:glob",
    "//garnet/bin/iquery/testing:iquery_golden_test",
    "//garnet/bin/run/test:run_tests",
    "//garnet/bin/run_test_component/test:run_test_component_test",
    "//garnet/bin/sl4f:sl4f",
    "//garnet/bin/sshd-host:sshd-host",
    "//garnet/bin/system_monitor/harvester:system_monitor_harvester",
    "//garnet/bin/system_monitor/harvester:system_monitor_harvester_tests",
    "//garnet/bin/trace:trace",
    "//garnet/bin/trace/tests:trace_tests",
    "//garnet/go/src/amber:amber",
    "//garnet/go/src/amber/system_updater:system_updater_tests",
    "//garnet/public/lib/inspect_deprecated/integration:libinspect_integration_tests",
    "//garnet/tests/benchmarks/input_latency:garnet_input_latency_benchmarks",
    "//garnet/tests/zircon/libdriver-integration-test:libdriver-integration-test",
    "//peridot/bin/module_resolver/module_package_indexer:module_package_indexer",
    "//peridot/bin/sessionctl:sessionctl",
    "//peridot/public/lib/modular_test_harness/cpp:test_harness_fixture_test",
    "//src/modular/tests:modular_integration_tests",
    "//peridot/tests/sessionctl:sessionctl_integration_tests",
    "//src/connectivity/network/netstack:netstack_gotests",
    "//src/connectivity/network/testing/netemul/runner:netemul_devmgr",
    "//src/developer/debug/debug_agent:debug_agent",
    "//src/developer/debug/debug_agent:debug_agent_tests",
    "//src/developer/feedback/feedback_agent:feedback_agent",
    "//src/developer/feedback/feedback_agent:fake_feedback_agent_valid_override_config",
    "//src/developer/feedback/feedback_agent:fake_feedback_agent_invalid_override_config",
    "//src/developer/feedback/feedback_agent/tests:feedback_agent_tests",
    "//src/developer/memory/monitor/tests:memory_monitor_inspect_integration_tests",
    "//src/recovery/factory_reset:factory_reset_tests",
    "//sdk/lib/sys/inspect/cpp/tests:sys_inspect_cpp_tests",
  ]
}

group("rootresource_svc_allowlist") {
  #  ________  _________  ________  ________
  # |\   ____\|\___   ___\\   __  \|\   __  \
  # \ \  \___|\|___ \  \_\ \  \|\  \ \  \|\  \
  #  \ \_____  \   \ \  \ \ \  \\\  \ \   ____\
  #   \|____|\  \   \ \  \ \ \  \\\  \ \  \___|
  #     ____\_\  \   \ \__\ \ \_______\ \__\
  #    |\_________\   \|__|  \|_______|\|__|
  #    \|_________|
  # This is an allowlist of packages that have components manifests that include
  # the "fuchsia.boot.RootResource" service. This is a highly privileged service that vends
  # out a very powerful capability. Do not add yourself to this unless this is the only
  # way to accomplish your goal and you have talked to the security team about this.
  visibility = [
    "//garnet/bin/scpi:scpi",
    "//garnet/bin/system_monitor/harvester:system_monitor_harvester",
    "//garnet/bin/system_monitor/harvester:system_monitor_harvester_tests",
    "//garnet/bin/thermd:thermd",
    "//src/cobalt/bin/system-metrics:cobalt_system_metrics",
    "//src/developer/memory/monitor/tests:memory_monitor_tests",
    "//src/developer/memory/monitor:monitor",
    "//src/developer/memory/monitor/tests:memory_monitor_inspect_integration_tests",
    "//src/virtualization/bin/vmm:vmm",
  ]
}

group("rootjob_svc_allowlist") {
  #  ________  _________  ________  ________
  # |\   ____\|\___   ___\\   __  \|\   __  \
  # \ \  \___|\|___ \  \_\ \  \|\  \ \  \|\  \
  #  \ \_____  \   \ \  \ \ \  \\\  \ \   ____\
  #   \|____|\  \   \ \  \ \ \  \\\  \ \  \___|
  #     ____\_\  \   \ \__\ \ \_______\ \__\
  #    |\_________\   \|__|  \|_______|\|__|
  #    \|_________|
  # This is an allowlist of packages that have components manifests that include
  # the "fuchsia.boot.RootJob" service. This is a highly privileged service that vends
  # out a very powerful capability. Do not add yourself to this unless this is the only
  # way to accomplish your goal and you have talked to the security team about this.
  visibility = []
}
