|  | // Copyright 2021 Google Inc. 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. | 
|  |  | 
|  | package bp2build | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "testing" | 
|  |  | 
|  | "android/soong/android" | 
|  | "android/soong/etc" | 
|  | ) | 
|  |  | 
|  | func runPrebuiltEtcTestCase(t *testing.T, tc Bp2buildTestCase) { | 
|  | t.Helper() | 
|  | (&tc).ModuleTypeUnderTest = "prebuilt_etc" | 
|  | (&tc).ModuleTypeUnderTestFactory = etc.PrebuiltEtcFactory | 
|  | RunBp2BuildTestCase(t, registerPrebuiltModuleTypes, tc) | 
|  | } | 
|  |  | 
|  | func runPrebuiltRootHostTestCase(t *testing.T, tc Bp2buildTestCase) { | 
|  | t.Helper() | 
|  | (&tc).ModuleTypeUnderTest = "prebuilt_root_host" | 
|  | (&tc).ModuleTypeUnderTestFactory = etc.PrebuiltRootHostFactory | 
|  | RunBp2BuildTestCase(t, registerPrebuiltModuleTypes, tc) | 
|  | } | 
|  |  | 
|  | func registerPrebuiltModuleTypes(ctx android.RegistrationContext) { | 
|  | } | 
|  |  | 
|  | func TestPrebuiltEtcSimple(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_etc - simple example", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "apex_tz_version", | 
|  | src: "version/tz_version", | 
|  | filename: "tz_version", | 
|  | sub_dir: "tz", | 
|  | installable: false, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ | 
|  | "filename":    `"tz_version"`, | 
|  | "installable": `False`, | 
|  | "src":         `"version/tz_version"`, | 
|  | "dir":         `"etc/tz"`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestPrebuiltEtcArchVariant(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_etc - arch variant", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "apex_tz_version", | 
|  | src: "version/tz_version", | 
|  | filename: "tz_version", | 
|  | sub_dir: "tz", | 
|  | installable: false, | 
|  | arch: { | 
|  | arm: { | 
|  | src: "arm", | 
|  | }, | 
|  | arm64: { | 
|  | src: "arm64", | 
|  | }, | 
|  | } | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ | 
|  | "filename":    `"tz_version"`, | 
|  | "installable": `False`, | 
|  | "src": `select({ | 
|  | "//build/bazel_common_rules/platforms/arch:arm": "arm", | 
|  | "//build/bazel_common_rules/platforms/arch:arm64": "arm64", | 
|  | "//conditions:default": "version/tz_version", | 
|  | })`, | 
|  | "dir": `"etc/tz"`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestPrebuiltEtcArchAndTargetVariant(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_etc - arch variant", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "apex_tz_version", | 
|  | src: "version/tz_version", | 
|  | filename: "tz_version", | 
|  | sub_dir: "tz", | 
|  | installable: false, | 
|  | arch: { | 
|  | arm: { | 
|  | src: "arm", | 
|  | }, | 
|  | arm64: { | 
|  | src: "darwin_or_arm64", | 
|  | }, | 
|  | }, | 
|  | target: { | 
|  | darwin: { | 
|  | src: "darwin_or_arm64", | 
|  | } | 
|  | }, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ | 
|  | "filename":    `"tz_version"`, | 
|  | "installable": `False`, | 
|  | "src": `select({ | 
|  | "//build/bazel_common_rules/platforms/os_arch:android_arm": "arm", | 
|  | "//build/bazel_common_rules/platforms/os_arch:android_arm64": "darwin_or_arm64", | 
|  | "//build/bazel_common_rules/platforms/os_arch:darwin_arm64": "darwin_or_arm64", | 
|  | "//build/bazel_common_rules/platforms/os_arch:darwin_x86_64": "darwin_or_arm64", | 
|  | "//build/bazel_common_rules/platforms/os_arch:linux_bionic_arm64": "darwin_or_arm64", | 
|  | "//conditions:default": "version/tz_version", | 
|  | })`, | 
|  | "dir": `"etc/tz"`, | 
|  | })}}) | 
|  | } | 
|  | func TestPrebuiltEtcProductVariables(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt etc - product variables", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "apex_tz_version", | 
|  | src: "version/tz_version", | 
|  | filename: "tz_version", | 
|  | product_variables: { | 
|  | native_coverage: { | 
|  | src: "src1", | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ | 
|  | "filename": `"tz_version"`, | 
|  | "src": `select({ | 
|  | "//build/bazel/product_config/config_settings:native_coverage": "src1", | 
|  | "//conditions:default": "version/tz_version", | 
|  | })`, | 
|  | "dir": `"etc"`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func runPrebuiltUsrShareTestCase(t *testing.T, tc Bp2buildTestCase) { | 
|  | t.Helper() | 
|  | (&tc).ModuleTypeUnderTest = "prebuilt_usr_share" | 
|  | (&tc).ModuleTypeUnderTestFactory = etc.PrebuiltUserShareFactory | 
|  | RunBp2BuildTestCase(t, registerPrebuiltModuleTypes, tc) | 
|  | } | 
|  |  | 
|  | func registerPrebuiltUsrShareModuleTypes(ctx android.RegistrationContext) { | 
|  | } | 
|  |  | 
|  | func TestPrebuiltUsrShareSimple(t *testing.T) { | 
|  | runPrebuiltUsrShareTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_usr_share - simple example", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_usr_share { | 
|  | name: "apex_tz_version", | 
|  | src: "version/tz_version", | 
|  | filename: "tz_version", | 
|  | sub_dir: "tz", | 
|  | installable: false, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ | 
|  | "filename":    `"tz_version"`, | 
|  | "installable": `False`, | 
|  | "src":         `"version/tz_version"`, | 
|  | "dir":         `"usr/share/tz"`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestPrebuiltEtcNoSubdir(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_etc - no subdir", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "apex_tz_version", | 
|  | src: "version/tz_version", | 
|  | filename: "tz_version", | 
|  | installable: false, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "apex_tz_version", AttrNameToString{ | 
|  | "filename":    `"tz_version"`, | 
|  | "installable": `False`, | 
|  | "src":         `"version/tz_version"`, | 
|  | "dir":         `"etc"`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestFilenameAsProperty(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_etc - filename is specified as a property ", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "foo", | 
|  | src: "fooSrc", | 
|  | filename: "fooFileName", | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ | 
|  | "filename": `"fooFileName"`, | 
|  | "src":      `"fooSrc"`, | 
|  | "dir":      `"etc"`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestFileNameFromSrc(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_etc - filename_from_src is true  ", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "foo", | 
|  | filename_from_src: true, | 
|  | src: "fooSrc", | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ | 
|  | "filename": `"fooSrc"`, | 
|  | "src":      `"fooSrc"`, | 
|  | "dir":      `"etc"`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestFileNameFromSrcMultipleSrcs(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_etc - filename_from_src is true but there are multiple srcs", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "foo", | 
|  | filename_from_src: true, | 
|  | arch: { | 
|  | arm: { | 
|  | src: "barSrc", | 
|  | }, | 
|  | arm64: { | 
|  | src: "bazSrc", | 
|  | }, | 
|  | } | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ | 
|  | "filename_from_src": `True`, | 
|  | "dir":               `"etc"`, | 
|  | "src": `select({ | 
|  | "//build/bazel_common_rules/platforms/arch:arm": "barSrc", | 
|  | "//build/bazel_common_rules/platforms/arch:arm64": "bazSrc", | 
|  | "//conditions:default": None, | 
|  | })`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestFilenameFromModuleName(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_etc - neither filename nor filename_from_src are specified ", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "foo", | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ | 
|  | "filename": `"foo"`, | 
|  | "dir":      `"etc"`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestPrebuiltEtcProductVariableArchSrcs(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt etc- SRcs from arch variant product variables", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "foo", | 
|  | filename: "fooFilename", | 
|  | arch: { | 
|  | arm: { | 
|  | src: "armSrc", | 
|  | product_variables: { | 
|  | native_coverage: { | 
|  | src: "nativeCoverageArmSrc", | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "foo", AttrNameToString{ | 
|  | "filename": `"fooFilename"`, | 
|  | "dir":      `"etc"`, | 
|  | "src": `select({ | 
|  | "//build/bazel/product_config/config_settings:native_coverage-arm": "nativeCoverageArmSrc", | 
|  | "//build/bazel_common_rules/platforms/arch:arm": "armSrc", | 
|  | "//conditions:default": None, | 
|  | })`, | 
|  | })}}) | 
|  | } | 
|  |  | 
|  | func TestPrebuiltEtcProductVariableError(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "foo", | 
|  | filename: "fooFilename", | 
|  | arch: { | 
|  | arm: { | 
|  | src: "armSrc", | 
|  | }, | 
|  | }, | 
|  | product_variables: { | 
|  | native_coverage: { | 
|  | src: "nativeCoverageArmSrc", | 
|  | }, | 
|  | }, | 
|  | }`, | 
|  | ExpectedErr: fmt.Errorf("label attribute could not be collapsed"), | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestPrebuiltEtcNoConversionIfSrcEqualsName(t *testing.T) { | 
|  | runPrebuiltEtcTestCase(t, Bp2buildTestCase{ | 
|  | Description: "", | 
|  | Filesystem:  map[string]string{}, | 
|  | Blueprint: ` | 
|  | prebuilt_etc { | 
|  | name: "foo", | 
|  | filename: "fooFilename", | 
|  | src: "foo", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{}, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestPrebuiltRootHostWithWildCardInSrc(t *testing.T) { | 
|  | runPrebuiltRootHostTestCase(t, Bp2buildTestCase{ | 
|  | Description: "prebuilt_root_host - src string has wild card", | 
|  | Filesystem: map[string]string{ | 
|  | "prh.dat": "", | 
|  | }, | 
|  | Blueprint: ` | 
|  | prebuilt_root_host { | 
|  | name: "prh_test", | 
|  | src: "*.dat", | 
|  | filename_from_src: true, | 
|  | relative_install_path: "test/install/path", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("prebuilt_file", "prh_test", AttrNameToString{ | 
|  | "filename": `"prh.dat"`, | 
|  | "src":      `"prh.dat"`, | 
|  | "dir":      `"./test/install/path"`, | 
|  | "target_compatible_with": `select({ | 
|  | "//build/bazel_common_rules/platforms/os:android": ["@platforms//:incompatible"], | 
|  | "//conditions:default": [], | 
|  | })`, | 
|  | })}}) | 
|  | } |