2019-03-28 15:10:57 +01:00
package android
import (
2020-02-19 17:10:09 +01:00
"reflect"
2019-03-28 15:10:57 +01:00
"testing"
2019-05-21 13:18:38 +02:00
"github.com/google/blueprint"
2019-03-28 15:10:57 +01:00
)
var visibilityTests = [ ] struct {
2020-02-19 17:10:09 +01:00
name string
2021-02-27 12:59:02 +01:00
fs MockFS
2020-02-19 17:10:09 +01:00
expectedErrors [ ] string
effectiveVisibility map [ qualifiedModuleName ] [ ] string
2019-03-28 15:10:57 +01:00
} {
{
name : "invalid visibility: empty list" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` visibility: must contain at least one visibility rule ` } ,
} ,
{
name : "invalid visibility: empty rule" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` visibility: invalid visibility pattern "" ` } ,
} ,
{
name : "invalid visibility: unqualified" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "target" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` visibility: invalid visibility pattern "target" ` } ,
} ,
{
name : "invalid visibility: empty namespace" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` visibility: invalid visibility pattern "//" ` } ,
} ,
{
name : "invalid visibility: empty module" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ ":" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` visibility: invalid visibility pattern ":" ` } ,
} ,
{
name : "invalid visibility: empty namespace and module" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//:" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` visibility: invalid visibility pattern "//:" ` } ,
} ,
{
name : "//visibility:unknown" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//visibility:unknown" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` unrecognized visibility rule "//visibility:unknown" ` } ,
} ,
{
2019-05-17 23:42:02 +02:00
name : "//visibility:xxx mixed" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//visibility:public" , "//namespace" ] ,
}
mock_library {
name : "libother" ,
visibility : [ "//visibility:private" , "//namespace" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
2019-05-17 23:42:02 +02:00
` module "libother": visibility: cannot mix "//visibility:private" ` +
` with any other visibility rules ` ,
` module "libexample": visibility: cannot mix "//visibility:public" ` +
2019-03-28 15:10:57 +01:00
` with any other visibility rules ` ,
} ,
} ,
{
name : "//visibility:legacy_public" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//visibility:legacy_public" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
2019-05-17 23:42:02 +02:00
` module "libexample": visibility: //visibility:legacy_public must ` +
2019-03-28 15:10:57 +01:00
` not be used ` ,
} ,
} ,
{
// Verify that //visibility:public will allow the module to be referenced from anywhere, e.g.
// the current directory, a nested directory and a directory in a separate tree.
name : "//visibility:public" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//visibility:public" ] ,
}
2022-05-21 01:41:39 +02:00
2019-03-28 15:10:57 +01:00
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
2022-05-21 01:41:39 +02:00
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
2019-03-28 15:10:57 +01:00
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
2022-05-21 01:41:39 +02:00
}
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
2019-03-28 15:10:57 +01:00
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
2022-05-21 01:41:39 +02:00
}
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
2019-03-28 15:10:57 +01:00
} ` ) ,
} ,
} ,
{
// Verify that //visibility:private allows the module to be referenced from the current
// directory only.
name : "//visibility:private" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//visibility:private" ] ,
}
2022-05-21 01:41:39 +02:00
2019-03-28 15:10:57 +01:00
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2019-05-21 13:18:38 +02:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
2019-03-28 15:10:57 +01:00
} ,
expectedErrors : [ ] string {
` module "libnested" variant "android_common": depends on //top:libexample which is not ` +
2019-05-17 23:42:02 +02:00
` visible to this module ` ,
2019-05-21 13:18:38 +02:00
` module "libother" variant "android_common": depends on //top:libexample which is not ` +
2019-05-17 23:42:02 +02:00
` visible to this module ` ,
2019-03-28 15:10:57 +01:00
} ,
} ,
2022-05-21 01:41:39 +02:00
{
// Verify that //visibility:private allows the module to be referenced from the current
// directory only.
name : "//visibility:private (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_library {
name : "libexample" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "nested-notice" references "//top:libexample" which is not visible to this ` +
` module\nYou may need to add "//top/nested" to its visibility ` ,
` module "other-notice" references "//top:libexample" which is not visible to this module\n ` +
` You may need to add "//other" to its visibility ` ,
} ,
} ,
2019-03-28 15:10:57 +01:00
{
// Verify that :__pkg__ allows the module to be referenced from the current directory only.
name : ":__pkg__" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ ":__pkg__" ] ,
}
2022-05-21 01:41:39 +02:00
2019-03-28 15:10:57 +01:00
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2019-05-21 13:18:38 +02:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
2019-03-28 15:10:57 +01:00
} ,
expectedErrors : [ ] string {
` module "libnested" variant "android_common": depends on //top:libexample which is not ` +
2019-05-17 23:42:02 +02:00
` visible to this module ` ,
2019-05-21 13:18:38 +02:00
` module "libother" variant "android_common": depends on //top:libexample which is not ` +
2019-05-17 23:42:02 +02:00
` visible to this module ` ,
2019-03-28 15:10:57 +01:00
} ,
} ,
2022-05-21 01:41:39 +02:00
{
// Verify that :__pkg__ allows the module to be referenced from the current directory only.
name : ":__pkg__ (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_library {
name : "libexample" ,
visibility : [ ":__pkg__" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "nested-notice" references "//top:libexample" which is not visible to this module ` ,
` module "other-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-03-28 15:10:57 +01:00
{
// Verify that //top/nested allows the module to be referenced from the current directory and
// the top/nested directory only, not a subdirectory of top/nested and not peak directory.
name : "//top/nested" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//top/nested" ] ,
}
2022-05-21 01:41:39 +02:00
2019-03-28 15:10:57 +01:00
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/again/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libnestedagain" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"peak/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libother" variant "android_common": depends on //top:libexample which is not ` +
2019-05-17 23:42:02 +02:00
` visible to this module ` ,
2019-03-28 15:10:57 +01:00
` module "libnestedagain" variant "android_common": depends on //top:libexample which is not ` +
2019-05-17 23:42:02 +02:00
` visible to this module ` ,
2019-03-28 15:10:57 +01:00
} ,
} ,
2022-05-21 01:41:39 +02:00
{
// Verify that //top/nested allows the module to be referenced from the current directory and
// the top/nested directory only, not a subdirectory of top/nested and not peak directory.
name : "//top/nested (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_library {
name : "libexample" ,
visibility : [ "//top/nested" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/again/Android.bp" : [ ] byte ( `
gen_notice {
name : "nestedagain-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"peak/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "other-notice" references "//top:libexample" which is not visible to this module ` ,
` module "nestedagain-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-03-28 15:10:57 +01:00
{
// Verify that :__subpackages__ allows the module to be referenced from the current directory
// and sub directories but nowhere else.
name : ":__subpackages__" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ ":__subpackages__" ] ,
}
2022-05-21 01:41:39 +02:00
2019-03-28 15:10:57 +01:00
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"peak/other/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libother" variant "android_common": depends on //top:libexample which is not ` +
2019-05-17 23:42:02 +02:00
` visible to this module ` ,
2019-03-28 15:10:57 +01:00
} ,
} ,
2022-05-21 01:41:39 +02:00
{
// Verify that :__subpackages__ allows the module to be referenced from the current directory
// and sub directories but nowhere else.
name : ":__subpackages__ (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_library {
name : "libexample" ,
visibility : [ ":__subpackages__" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"peak/other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "other-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-03-28 15:10:57 +01:00
{
// Verify that //top/nested:__subpackages__ allows the module to be referenced from the current
// directory and sub directories but nowhere else.
name : "//top/nested:__subpackages__" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//top/nested:__subpackages__" , "//other" ] ,
}
2022-05-21 01:41:39 +02:00
2019-03-28 15:10:57 +01:00
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/other/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libother" variant "android_common": depends on //top:libexample which is not ` +
2019-05-17 23:42:02 +02:00
` visible to this module ` ,
2019-03-28 15:10:57 +01:00
} ,
} ,
2022-05-21 01:41:39 +02:00
{
// Verify that //top/nested:__subpackages__ allows the module to be referenced from the current
// directory and sub directories but nowhere else.
name : "//top/nested:__subpackages__ (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_library {
name : "libexample" ,
visibility : [ "//top/nested:__subpackages__" , "//other" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "other-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-03-28 15:10:57 +01:00
{
// Verify that ["//top/nested", "//peak:__subpackages"] allows the module to be referenced from
// the current directory, top/nested and peak and all its subpackages.
name : ` ["//top/nested", "//peak:__subpackages__"] ` ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//top/nested" , "//peak:__subpackages__" ] ,
}
2022-05-21 01:41:39 +02:00
2019-03-28 15:10:57 +01:00
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"peak/other/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
// Verify that ["//top/nested", "//peak:__subpackages"] allows the module to be referenced from
// the current directory, top/nested and peak and all its subpackages.
name : ` ["//top/nested", "//peak:__subpackages__ (notices)"] ` ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_library {
name : "libexample" ,
visibility : [ "//top/nested" , "//peak:__subpackages__" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"peak/other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2019-03-28 15:10:57 +01:00
{
// Verify that //vendor... cannot be used outside vendor apart from //vendor:__subpackages__
name : ` //vendor ` ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libexample" ,
visibility : [ "//vendor:__subpackages__" ] ,
}
2022-05-21 01:41:39 +02:00
2019-03-28 15:10:57 +01:00
mock_library {
name : "libsamepackage" ,
visibility : [ "//vendor/apps/AcmeSettings" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"vendor/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libvendorexample" ,
deps : [ "libexample" ] ,
visibility : [ "//vendor/nested" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"vendor/nested/Android.bp" : [ ] byte ( `
2019-03-28 15:10:57 +01:00
mock_library {
name : "libvendornested" ,
deps : [ "libexample" , "libvendorexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
2019-05-17 23:42:02 +02:00
` module "libsamepackage": visibility: "//vendor/apps/AcmeSettings" ` +
2019-03-28 15:10:57 +01:00
` is not allowed. Packages outside //vendor cannot make themselves visible to specific ` +
` targets within //vendor, they can only use //vendor:__subpackages__. ` ,
} ,
} ,
2019-05-17 23:42:02 +02:00
// Defaults propagation tests
{
// Check that visibility is the union of the defaults modules.
name : "defaults union, basic" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//other" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//top/nested" ] ,
defaults : [ "libexample_defaults" ] ,
}
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "liboutsider" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
// Check that visibility is the union of the defaults modules.
name : "defaults union, basic (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//other" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//top/nested" ] ,
defaults : [ "libexample_defaults" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "outsider-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-05-17 23:42:02 +02:00
{
name : "defaults union, multiple defaults" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults_1" ,
visibility : [ "//other" ] ,
}
mock_defaults {
name : "libexample_defaults_2" ,
visibility : [ "//top/nested" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults_1" , "libexample_defaults_2" ] ,
}
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "liboutsider" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "defaults union, multiple defaults (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults_1" ,
visibility : [ "//other" ] ,
}
mock_defaults {
name : "libexample_defaults_2" ,
visibility : [ "//top/nested" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults_1" , "libexample_defaults_2" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "outsider-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-05-17 23:42:02 +02:00
{
name : "//visibility:public mixed with other in defaults" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:public" , "//namespace" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libexample_defaults": visibility: cannot mix "//visibility:public" ` +
` with any other visibility rules ` ,
} ,
} ,
{
name : "//visibility:public overriding defaults" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//namespace" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:public" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
2020-02-19 17:10:09 +01:00
effectiveVisibility : map [ qualifiedModuleName ] [ ] string {
qualifiedModuleName { pkg : "top" , name : "libexample" } : { "//visibility:public" } ,
} ,
2019-05-17 23:42:02 +02:00
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:public overriding defaults (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//namespace" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:public" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
effectiveVisibility : map [ qualifiedModuleName ] [ ] string {
qualifiedModuleName { pkg : "top" , name : "libexample" } : { "//visibility:public" } ,
} ,
} ,
2019-05-17 23:42:02 +02:00
{
name : "//visibility:public mixed with other from different defaults 1" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults_1" ,
visibility : [ "//namespace" ] ,
}
mock_defaults {
name : "libexample_defaults_2" ,
visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults_1" , "libexample_defaults_2" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:public mixed with other from different defaults 1" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults_1" ,
visibility : [ "//namespace" ] ,
}
mock_defaults {
name : "libexample_defaults_2" ,
visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults_1" , "libexample_defaults_2" ] ,
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2019-05-17 23:42:02 +02:00
{
name : "//visibility:public mixed with other from different defaults 2" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults_1" ,
visibility : [ "//visibility:public" ] ,
}
mock_defaults {
name : "libexample_defaults_2" ,
visibility : [ "//namespace" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults_1" , "libexample_defaults_2" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:public mixed with other from different defaults 2 (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults_1" ,
visibility : [ "//visibility:public" ] ,
}
mock_defaults {
name : "libexample_defaults_2" ,
visibility : [ "//namespace" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults_1" , "libexample_defaults_2" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2019-05-17 23:42:02 +02:00
{
name : "//visibility:private in defaults" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults" ] ,
}
mock_library {
name : "libsamepackage" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libnested" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
` module "libother" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
} ,
} ,
{
2022-05-21 01:41:39 +02:00
name : "//visibility:private in defaults (notices)" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults" ,
2022-05-21 01:41:39 +02:00
visibility : [ "//visibility:private" ] ,
2019-05-17 23:42:02 +02:00
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults" ] ,
2022-05-21 01:41:39 +02:00
}
gen_notice {
name : "libexample-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
2019-05-17 23:42:02 +02:00
} ` ) ,
} ,
expectedErrors : [ ] string {
2022-05-21 01:41:39 +02:00
` module "nested-notice" references "//top:libexample" which is not visible to this module ` ,
` module "other-notice" references "//top:libexample" which is not visible to this module ` ,
2019-05-17 23:42:02 +02:00
} ,
} ,
{
2022-05-21 01:41:39 +02:00
name : "//visibility:private mixed with other in defaults" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:private" , "//namespace" ] ,
}
mock_library {
name : "libexample" ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libexample_defaults": visibility: cannot mix "//visibility:private" ` +
` with any other visibility rules ` ,
} ,
} ,
{
name : "//visibility:private overriding defaults" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//namespace" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:private" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libexample": visibility: cannot mix "//visibility:private" ` +
` with any other visibility rules ` ,
} ,
} ,
{
name : "//visibility:private in defaults overridden" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//namespace" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libexample": visibility: cannot mix "//visibility:private" ` +
` with any other visibility rules ` ,
} ,
} ,
2020-05-05 20:19:22 +02:00
{
name : "//visibility:private override //visibility:public" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:private" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libexample": visibility: cannot mix "//visibility:private" with any other visibility rules ` ,
} ,
} ,
{
name : "//visibility:public override //visibility:private" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:public" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libexample": visibility: cannot mix "//visibility:private" with any other visibility rules ` ,
} ,
} ,
{
name : "//visibility:override must be first in the list" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_library {
name : "libexample" ,
visibility : [ "//other" , "//visibility:override" , "//namespace" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libexample": visibility: "//visibility:override" may only be used at the start of the visibility rules ` ,
} ,
} ,
{
name : "//visibility:override discards //visibility:private" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
// Make this visibility to //other but not //visibility:private
visibility : [ "//visibility:override" , "//other" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:override discards //visibility:private (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
// Make this visibility to //other but not //visibility:private
visibility : [ "//visibility:override" , "//other" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
"other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2020-05-05 20:19:22 +02:00
{
name : "//visibility:override discards //visibility:public" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
// Make this visibility to //other but not //visibility:public
visibility : [ "//visibility:override" , "//other" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"namespace/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_library {
name : "libnamespace" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
2020-10-15 20:46:38 +02:00
` module "libnamespace" variant "android_common": depends on //top:libexample which is not visible to this module\nYou may need to add "//namespace" to its visibility ` ,
2020-05-05 20:19:22 +02:00
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:override discards //visibility:public (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
// Make this visibility to //other but not //visibility:public
visibility : [ "//visibility:override" , "//other" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
"other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"namespace/Android.bp" : [ ] byte ( `
gen_notice {
name : "namespace-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "namespace-notice" references "//top:libexample" which is not visible to this module\nYou may need to add "//namespace" to its visibility ` ,
} ,
} ,
2020-05-05 20:19:22 +02:00
{
name : "//visibility:override discards defaults supplied rules" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//namespace" ] ,
}
mock_library {
name : "libexample" ,
// Make this visibility to //other but not //namespace
visibility : [ "//visibility:override" , "//other" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"other/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_library {
name : "libother" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"namespace/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_library {
name : "libnamespace" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
2020-10-15 20:46:38 +02:00
` module "libnamespace" variant "android_common": depends on //top:libexample which is not visible to this module\nYou may need to add "//namespace" to its visibility ` ,
2020-05-05 20:19:22 +02:00
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:override discards defaults supplied rules (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//namespace" ] ,
}
mock_library {
name : "libexample" ,
// Make this visibility to //other but not //namespace
visibility : [ "//visibility:override" , "//other" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
"other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"namespace/Android.bp" : [ ] byte ( `
gen_notice {
name : "namespace-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "namespace-notice" references "//top:libexample" which is not visible to this module\nYou may need to add "//namespace" to its visibility ` ,
} ,
} ,
2020-05-05 20:19:22 +02:00
{
name : "//visibility:override can override //visibility:public with //visibility:private" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:override" , "//visibility:private" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"namespace/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_library {
name : "libnamespace" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "libnamespace" variant "android_common": depends on //top:libexample which is not visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:override can override //visibility:public with //visibility:private (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:override" , "//visibility:private" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
"namespace/Android.bp" : [ ] byte ( `
gen_notice {
name : "namespace-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "namespace-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2020-05-05 20:19:22 +02:00
{
name : "//visibility:override can override //visibility:private with //visibility:public" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:override" , "//visibility:public" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"namespace/Android.bp" : [ ] byte ( `
2020-05-05 20:19:22 +02:00
mock_library {
name : "libnamespace" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:override can override //visibility:private with //visibility:public (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:override" , "//visibility:public" ] ,
defaults : [ "libexample_defaults" ] ,
} ` ) ,
"namespace/Android.bp" : [ ] byte ( `
gen_notice {
name : "namespace-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2019-05-17 23:42:02 +02:00
{
name : "//visibility:private mixed with itself" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_defaults {
name : "libexample_defaults_1" ,
visibility : [ "//visibility:private" ] ,
}
mock_defaults {
name : "libexample_defaults_2" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:private" ] ,
defaults : [ "libexample_defaults_1" , "libexample_defaults_2" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-17 23:42:02 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "liboutsider" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "//visibility:private mixed with itself (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_defaults {
name : "libexample_defaults_1" ,
visibility : [ "//visibility:private" ] ,
}
mock_defaults {
name : "libexample_defaults_2" ,
visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:private" ] ,
defaults : [ "libexample_defaults_1" , "libexample_defaults_2" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "outsider-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-07-24 14:45:05 +02:00
// Defaults module's defaults_visibility tests
{
name : "defaults_visibility invalid" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-07-24 14:45:05 +02:00
mock_defaults {
name : "top_defaults" ,
defaults_visibility : [ "//visibility:invalid" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` defaults_visibility: unrecognized visibility rule "//visibility:invalid" ` ,
} ,
} ,
{
name : "defaults_visibility overrides package default" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-07-24 14:45:05 +02:00
package {
default_visibility : [ "//visibility:private" ] ,
}
mock_defaults {
name : "top_defaults" ,
defaults_visibility : [ "//visibility:public" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-07-24 14:45:05 +02:00
mock_library {
name : "liboutsider" ,
defaults : [ "top_defaults" ] ,
} ` ) ,
} ,
} ,
2019-05-31 15:00:04 +02:00
// Package default_visibility tests
{
name : "package default_visibility property is checked" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
package {
default_visibility : [ "//visibility:invalid" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` default_visibility: unrecognized visibility rule "//visibility:invalid" ` } ,
} ,
{
// This test relies on the default visibility being legacy_public.
name : "package default_visibility property used when no visibility specified" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
package {
default_visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "liboutsider" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
// This test relies on the default visibility being legacy_public.
name : "package default_visibility property used when no visibility specified (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
package {
default_visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "outsider-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-05-31 15:00:04 +02:00
{
name : "package default_visibility public does not override visibility private" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
package {
default_visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:private" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "liboutsider" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "package default_visibility public does not override visibility private (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
package {
default_visibility : [ "//visibility:public" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:private" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "outsider-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-05-31 15:00:04 +02:00
{
name : "package default_visibility private does not override visibility public" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
package {
default_visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:public" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "package default_visibility private does not override visibility public (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
package {
default_visibility : [ "//visibility:private" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ "//visibility:public" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
} ,
2019-05-31 15:00:04 +02:00
{
name : "package default_visibility :__subpackages__" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
package {
default_visibility : [ ":__subpackages__" ] ,
}
mock_library {
name : "libexample" ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-05-31 15:00:04 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "liboutsider" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "package default_visibility :__subpackages__ (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
package {
default_visibility : [ ":__subpackages__" ] ,
}
mock_library {
name : "libexample" ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "outsider-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-06-20 17:38:08 +02:00
{
name : "package default_visibility inherited to subpackages" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-06-20 17:38:08 +02:00
package {
default_visibility : [ "//outsider" ] ,
}
mock_library {
name : "libexample" ,
2022-05-21 01:41:39 +02:00
visibility : [ ":__subpackages__" ] ,
2019-06-20 17:38:08 +02:00
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-06-20 17:38:08 +02:00
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-06-20 17:38:08 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libexample" , "libnested" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "liboutsider" variant "android_common": depends on //top:libexample which is not ` +
` visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "package default_visibility inherited to subpackages (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
package {
default_visibility : [ "//outsider" ] ,
}
mock_library {
name : "libexample" ,
visibility : [ ":__subpackages__" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
mock_library {
name : "libnested" ,
deps : [ "libexample" ] ,
}
gen_notice {
name : "nested-notice" ,
for : [ "libexample" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libexample" , "libnested" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "outsider-notice" references "//top:libexample" which is not visible to this module ` ,
} ,
} ,
2019-06-20 17:38:08 +02:00
{
name : "package default_visibility inherited to subpackages" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2019-06-20 17:38:08 +02:00
package {
default_visibility : [ "//visibility:private" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2019-06-20 17:38:08 +02:00
package {
default_visibility : [ "//outsider" ] ,
}
mock_library {
name : "libnested" ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/other/Android.bp" : [ ] byte ( `
2019-06-20 17:38:08 +02:00
mock_library {
name : "libother" ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"outsider/Android.bp" : [ ] byte ( `
2019-06-20 17:38:08 +02:00
mock_library {
name : "liboutsider" ,
deps : [ "libother" , "libnested" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "liboutsider" variant "android_common": depends on //top/other:libother which is ` +
` not visible to this module ` ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "package default_visibility inherited to subpackages (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
package {
default_visibility : [ "//visibility:private" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
package {
default_visibility : [ "//outsider" ] ,
}
mock_library {
name : "libnested" ,
} ` ) ,
"top/other/Android.bp" : [ ] byte ( `
mock_library {
name : "libother" ,
}
gen_notice {
name : "other-notice" ,
for : [ "libother" ] ,
} ` ) ,
"outsider/Android.bp" : [ ] byte ( `
gen_notice {
name : "outsider-notice" ,
for : [ "libother" , "libnested" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "outsider-notice" references "//top/other:libother" which is not visible to this ` +
` module\nYou may need to add "//outsider" to its visibility ` ,
} ,
} ,
2020-01-14 13:42:08 +01:00
{
name : "verify that prebuilt dependencies are ignored for visibility reasons (not preferred)" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"prebuilts/Android.bp" : [ ] byte ( `
2020-01-14 13:42:08 +01:00
prebuilt {
name : "module" ,
visibility : [ "//top/other" ] ,
} ` ) ,
"top/sources/source_file" : nil ,
2021-09-02 11:46:24 +02:00
"top/sources/Android.bp" : [ ] byte ( `
2020-01-14 13:42:08 +01:00
source {
name : "module" ,
visibility : [ "//top/other" ] ,
} ` ) ,
"top/other/source_file" : nil ,
2021-09-02 11:46:24 +02:00
"top/other/Android.bp" : [ ] byte ( `
2020-01-14 13:42:08 +01:00
source {
name : "other" ,
deps : [ ":module" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "verify that prebuilt dependencies are ignored for visibility reasons (not preferred) (notices)" ,
fs : MockFS {
"prebuilts/Android.bp" : [ ] byte ( `
prebuilt {
name : "module" ,
visibility : [ "//top/other" ] ,
} ` ) ,
"top/sources/source_file" : nil ,
"top/sources/Android.bp" : [ ] byte ( `
source {
name : "module" ,
visibility : [ "//top/other" ] ,
} ` ) ,
"top/other/source_file" : nil ,
"top/other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "module" ] ,
} ` ) ,
} ,
} ,
2020-01-14 13:42:08 +01:00
{
name : "verify that prebuilt dependencies are ignored for visibility reasons (preferred)" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"prebuilts/Android.bp" : [ ] byte ( `
2020-01-14 13:42:08 +01:00
prebuilt {
name : "module" ,
visibility : [ "//top/other" ] ,
prefer : true ,
} ` ) ,
"top/sources/source_file" : nil ,
2021-09-02 11:46:24 +02:00
"top/sources/Android.bp" : [ ] byte ( `
2020-01-14 13:42:08 +01:00
source {
name : "module" ,
visibility : [ "//top/other" ] ,
} ` ) ,
"top/other/source_file" : nil ,
2021-09-02 11:46:24 +02:00
"top/other/Android.bp" : [ ] byte ( `
2020-01-14 13:42:08 +01:00
source {
name : "other" ,
deps : [ ":module" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "verify that prebuilt dependencies are ignored for visibility reasons (preferred) (notices)" ,
fs : MockFS {
"prebuilts/Android.bp" : [ ] byte ( `
prebuilt {
name : "module" ,
visibility : [ "//top/other" ] ,
prefer : true ,
} ` ) ,
"top/sources/source_file" : nil ,
"top/sources/Android.bp" : [ ] byte ( `
source {
name : "module" ,
visibility : [ "//top/other" ] ,
} ` ) ,
"top/other/source_file" : nil ,
"top/other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "module" ] ,
} ` ) ,
} ,
} ,
2020-04-29 17:47:28 +02:00
{
name : "ensure visibility properties are checked for correctness" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-04-29 17:47:28 +02:00
mock_parent {
name : "parent" ,
visibility : [ "//top/nested" ] ,
child : {
name : "libchild" ,
visibility : [ "top/other" ] ,
} ,
} ` ) ,
} ,
expectedErrors : [ ] string {
` module "parent": child.visibility: invalid visibility pattern "top/other" ` ,
} ,
} ,
{
name : "invalid visibility added to child detected during gather phase" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-04-29 17:47:28 +02:00
mock_parent {
name : "parent" ,
visibility : [ "//top/nested" ] ,
child : {
name : "libchild" ,
invalid_visibility : [ "top/other" ] ,
} ,
} ` ) ,
} ,
expectedErrors : [ ] string {
// That this error is reported against the child not the parent shows it was
// not being detected in the parent which is correct as invalid_visibility is
// purposely not added to the list of visibility properties to check, and was
// in fact detected in the child in the gather phase. Contrast this error message
// with the preceding one.
` module "libchild" \(created by module "parent"\): visibility: invalid visibility pattern "top/other" ` ,
} ,
} ,
{
name : "automatic visibility inheritance enabled" ,
2021-02-27 12:59:02 +01:00
fs : MockFS {
2021-09-02 11:46:24 +02:00
"top/Android.bp" : [ ] byte ( `
2020-04-29 17:47:28 +02:00
mock_parent {
name : "parent" ,
visibility : [ "//top/nested" ] ,
child : {
name : "libchild" ,
visibility : [ "//top/other" ] ,
} ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/nested/Android.bp" : [ ] byte ( `
2020-04-29 17:47:28 +02:00
mock_library {
name : "libnested" ,
deps : [ "libchild" ] ,
} ` ) ,
2021-09-02 11:46:24 +02:00
"top/other/Android.bp" : [ ] byte ( `
2020-04-29 17:47:28 +02:00
mock_library {
name : "libother" ,
deps : [ "libchild" ] ,
} ` ) ,
} ,
} ,
2022-05-21 01:41:39 +02:00
{
name : "automatic visibility inheritance enabled (notices)" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_parent {
name : "parent" ,
visibility : [ "//top/nested" ] ,
child : {
name : "libchild" ,
visibility : [ "//top/other" ] ,
} ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
gen_notice {
name : "nested-notice" ,
for : [ "libchild" ] ,
} ` ) ,
"top/other/Android.bp" : [ ] byte ( `
gen_notice {
name : "other-notice" ,
for : [ "libchild" ] ,
} ` ) ,
} ,
} ,
2024-02-07 20:28:26 +01:00
{
2024-03-18 23:38:12 +01:00
name : "any_system_partition visibility works" ,
2024-02-07 20:28:26 +01:00
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
android_filesystem {
name : "foo" ,
deps : [ "bar" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
package ( default_visibility = [ "//visibility:private" ] )
mock_library {
name : "bar" ,
2024-03-18 23:38:12 +01:00
visibility : [ "//visibility:any_system_partition" ] ,
2024-02-07 20:28:26 +01:00
} ` ) ,
} ,
} ,
2024-03-12 11:34:29 +01:00
{
2024-03-18 23:38:12 +01:00
name : "any_system_partition visibility works with the other visibility" ,
2024-03-12 11:34:29 +01:00
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
android_filesystem {
name : "foo" ,
deps : [ "bar" ] ,
} ` ) ,
"top2/Android.bp" : [ ] byte ( ` ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
package ( default_visibility = [ "//visibility:private" ] )
mock_library {
name : "bar" ,
visibility : [
"//top2" ,
2024-03-18 23:38:12 +01:00
"//visibility:any_system_partition"
2024-03-12 11:34:29 +01:00
] ,
} ` ) ,
} ,
} ,
2024-02-07 20:28:26 +01:00
{
2024-03-18 23:38:12 +01:00
name : "any_system_partition visibility doesn't work for non-partitions" ,
2024-02-07 20:28:26 +01:00
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
mock_library {
name : "foo" ,
deps : [ "bar" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
mock_library {
name : "bar" ,
2024-03-18 23:38:12 +01:00
visibility : [ "//visibility:any_system_partition" ] ,
2024-02-07 20:28:26 +01:00
} ` ) ,
} ,
expectedErrors : [ ] string { ` module "foo" variant "android_common": depends on //top/nested:bar which is not visible to this module ` } ,
} ,
2024-03-18 23:38:12 +01:00
{
name : "any_system_partition visibility doesn't work for vendor partitions" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
android_filesystem {
name : "foo" ,
partition_type : "vendor" ,
deps : [ "bar" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
package ( default_visibility = [ "//visibility:private" ] )
mock_library {
name : "bar" ,
visibility : [ "//visibility:any_system_partition" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` module "foo" variant "android_common": depends on //top/nested:bar which is not visible to this module ` } ,
} ,
{
name : "Vendor modules are visible to any vendor partition by default" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
android_filesystem {
name : "foo" ,
partition_type : "vendor" ,
deps : [ "bar" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
package ( default_visibility = [ "//visibility:private" ] )
mock_library {
name : "bar" ,
vendor : true ,
} ` ) ,
} ,
} ,
{
name : "Not visible to vendor partitions when using any_system_partiton, even if vendor: true" ,
fs : MockFS {
"top/Android.bp" : [ ] byte ( `
android_filesystem {
name : "foo" ,
partition_type : "vendor" ,
deps : [ "bar" ] ,
} ` ) ,
"top/nested/Android.bp" : [ ] byte ( `
package ( default_visibility = [ "//visibility:private" ] )
mock_library {
name : "bar" ,
vendor : true ,
visibility : [ "//visibility:any_system_partition" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` module "foo" variant "android_common": depends on //top/nested:bar which is not visible to this module ` } ,
} ,
{
name : "unknown any_partition specs throw errors" ,
fs : MockFS {
"top/nested/Android.bp" : [ ] byte ( `
package ( default_visibility = [ "//visibility:private" ] )
mock_library {
name : "bar" ,
visibility : [ "//visibility:any_unknown_partition" ] ,
} ` ) ,
} ,
expectedErrors : [ ] string { ` unrecognized visibility rule "//visibility:any_unknown_partition" ` } ,
} ,
2019-03-28 15:10:57 +01:00
}
func TestVisibility ( t * testing . T ) {
for _ , test := range visibilityTests {
t . Run ( test . name , func ( t * testing . T ) {
2021-03-20 01:36:14 +01:00
result := GroupFixturePreparers (
2021-03-07 14:20:38 +01:00
// General preparers in alphabetical order as test infrastructure will enforce correct
// registration order.
PrepareForTestWithArchMutator ,
PrepareForTestWithDefaults ,
2022-05-21 01:41:39 +02:00
PrepareForTestWithGenNotice ,
2021-03-07 14:20:38 +01:00
PrepareForTestWithOverrides ,
PrepareForTestWithPackageModule ,
PrepareForTestWithPrebuilts ,
PrepareForTestWithVisibility ,
// Additional test specific preparers.
2021-02-27 12:59:02 +01:00
FixtureRegisterWithContext ( func ( ctx RegistrationContext ) {
ctx . RegisterModuleType ( "mock_library" , newMockLibraryModule )
ctx . RegisterModuleType ( "mock_parent" , newMockParentFactory )
ctx . RegisterModuleType ( "mock_defaults" , defaultsFactory )
2024-03-18 23:38:12 +01:00
ctx . RegisterModuleType ( "android_filesystem" , newMockFilesystemModule )
2021-02-27 12:59:02 +01:00
} ) ,
prepareForTestWithFakePrebuiltModules ,
// Add additional files to the mock filesystem
test . fs . AddToFixture ( ) ,
) .
2021-03-09 12:55:20 +01:00
ExtendWithErrorHandler ( FixtureExpectsAllErrorsToMatchAPattern ( test . expectedErrors ) ) .
2021-02-27 12:59:02 +01:00
RunTest ( t )
2020-02-19 17:10:09 +01:00
if test . effectiveVisibility != nil {
2021-03-12 13:20:59 +01:00
checkEffectiveVisibility ( t , result , test . effectiveVisibility )
2020-02-19 17:10:09 +01:00
}
2019-03-28 15:10:57 +01:00
} )
}
}
2021-03-12 13:20:59 +01:00
func checkEffectiveVisibility ( t * testing . T , result * TestResult , effectiveVisibility map [ qualifiedModuleName ] [ ] string ) {
2020-02-19 17:10:09 +01:00
for moduleName , expectedRules := range effectiveVisibility {
2021-02-27 12:59:02 +01:00
rule := effectiveVisibilityRules ( result . Config , moduleName )
2020-02-19 17:10:09 +01:00
stringRules := rule . Strings ( )
2021-03-12 13:20:59 +01:00
AssertDeepEquals ( t , "effective rules mismatch" , expectedRules , stringRules )
2020-02-19 17:10:09 +01:00
}
}
2019-03-28 15:10:57 +01:00
type mockLibraryProperties struct {
Deps [ ] string
}
type mockLibraryModule struct {
ModuleBase
2019-05-17 23:42:02 +02:00
DefaultableModuleBase
2019-03-28 15:10:57 +01:00
properties mockLibraryProperties
}
func newMockLibraryModule ( ) Module {
m := & mockLibraryModule { }
m . AddProperties ( & m . properties )
InitAndroidArchModule ( m , HostAndDeviceSupported , MultilibCommon )
2019-05-17 23:42:02 +02:00
InitDefaultableModule ( m )
2019-03-28 15:10:57 +01:00
return m
}
type dependencyTag struct {
blueprint . BaseDependencyTag
name string
}
func ( j * mockLibraryModule ) DepsMutator ( ctx BottomUpMutatorContext ) {
ctx . AddVariationDependencies ( nil , dependencyTag { name : "mockdeps" } , j . properties . Deps ... )
}
func ( p * mockLibraryModule ) GenerateAndroidBuildActions ( ModuleContext ) {
}
2019-05-17 23:42:02 +02:00
2024-03-18 23:38:12 +01:00
type mockFilesystemModuleProperties struct {
Partition_type * string
Deps [ ] string
}
type mockFilesystemModule struct {
ModuleBase
properties mockFilesystemModuleProperties
}
func ( j * mockFilesystemModule ) DepsMutator ( ctx BottomUpMutatorContext ) {
ctx . AddVariationDependencies ( nil , dependencyTag { name : "mockdeps" } , j . properties . Deps ... )
}
func ( p * mockFilesystemModule ) GenerateAndroidBuildActions ( ModuleContext ) {
}
func ( p * mockFilesystemModule ) PartitionType ( ) string {
if p . properties . Partition_type == nil {
return "system"
}
return * p . properties . Partition_type
}
func newMockFilesystemModule ( ) Module {
m := & mockFilesystemModule { }
m . AddProperties ( & m . properties )
InitAndroidArchModule ( m , DeviceSupported , MultilibCommon )
return m
}
2019-05-17 23:42:02 +02:00
type mockDefaults struct {
ModuleBase
DefaultsModuleBase
}
func defaultsFactory ( ) Module {
m := & mockDefaults { }
InitDefaultsModule ( m )
return m
}
2020-04-29 17:47:28 +02:00
type mockParentProperties struct {
Child struct {
Name * string
// Visibility to pass to the child module.
Visibility [ ] string
// Purposely not validated visibility to pass to the child.
Invalid_visibility [ ] string
}
}
type mockParent struct {
ModuleBase
DefaultableModuleBase
properties mockParentProperties
}
func ( p * mockParent ) GenerateAndroidBuildActions ( ModuleContext ) {
}
func newMockParentFactory ( ) Module {
m := & mockParent { }
m . AddProperties ( & m . properties )
InitAndroidArchModule ( m , HostAndDeviceSupported , MultilibCommon )
InitDefaultableModule ( m )
AddVisibilityProperty ( m , "child.visibility" , & m . properties . Child . Visibility )
m . SetDefaultableHook ( func ( ctx DefaultableHookContext ) {
visibility := m . properties . Child . Visibility
visibility = append ( visibility , m . properties . Child . Invalid_visibility ... )
ctx . CreateModule ( newMockLibraryModule , & struct {
Name * string
Visibility [ ] string
} { m . properties . Child . Name , visibility } )
} )
return m
}
2020-09-29 17:01:08 +02:00
func testVisibilityRuleSet ( t * testing . T , rules , extra , expected [ ] string ) {
t . Helper ( )
set := & visibilityRuleSet { rules }
err := set . Widen ( extra )
if err != nil {
t . Error ( err )
return
}
actual := set . Strings ( )
if ! reflect . DeepEqual ( actual , expected ) {
t . Errorf ( "mismatching rules after extend: expected %#v, actual %#v" , expected , actual )
}
}
func TestVisibilityRuleSet ( t * testing . T ) {
t . Run ( "extend empty" , func ( t * testing . T ) {
testVisibilityRuleSet ( t , nil , [ ] string { "//foo" } , [ ] string { "//foo" } )
} )
t . Run ( "extend" , func ( t * testing . T ) {
testVisibilityRuleSet ( t , [ ] string { "//foo" } , [ ] string { "//bar" } , [ ] string { "//bar" , "//foo" } )
} )
t . Run ( "extend duplicate" , func ( t * testing . T ) {
testVisibilityRuleSet ( t , [ ] string { "//foo" } , [ ] string { "//bar" , "//foo" } , [ ] string { "//bar" , "//foo" } )
} )
t . Run ( "extend public" , func ( t * testing . T ) {
testVisibilityRuleSet ( t , [ ] string { "//visibility:public" } , [ ] string { "//foo" } , [ ] string { "//visibility:public" } )
} )
t . Run ( "extend private" , func ( t * testing . T ) {
testVisibilityRuleSet ( t , [ ] string { "//visibility:private" } , [ ] string { "//foo" } , [ ] string { "//foo" } )
} )
t . Run ( "extend with public" , func ( t * testing . T ) {
testVisibilityRuleSet ( t , [ ] string { "//foo" } , [ ] string { "//visibility:public" } , [ ] string { "//visibility:public" } )
} )
t . Run ( "extend with private" , func ( t * testing . T ) {
t . Helper ( )
set := & visibilityRuleSet { [ ] string { "//foo" } }
err := set . Widen ( [ ] string { "//visibility:private" } )
expectedError := ` "//visibility:private" does not widen the visibility `
if err == nil {
t . Errorf ( "missing error" )
} else if err . Error ( ) != expectedError {
t . Errorf ( "expected error %q found error %q" , expectedError , err )
}
} )
}