2018-08-15 07:20:22 +02:00
// Copyright 2018 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.
2020-06-01 19:45:49 +02:00
package etc
2018-08-15 07:20:22 +02:00
import (
2021-07-19 04:38:04 +02:00
"fmt"
2020-06-01 19:45:49 +02:00
"os"
2019-02-23 00:47:57 +01:00
"path/filepath"
2018-08-15 07:20:22 +02:00
"testing"
2020-06-01 19:45:49 +02:00
2021-07-19 04:38:04 +02:00
"github.com/google/blueprint/proptools"
2020-06-01 19:45:49 +02:00
"android/soong/android"
2023-06-06 00:49:50 +02:00
"android/soong/bazel/cquery"
2021-07-19 04:38:04 +02:00
"android/soong/snapshot"
2018-08-15 07:20:22 +02:00
)
2020-06-01 19:45:49 +02:00
func TestMain ( m * testing . M ) {
2021-03-15 16:35:49 +01:00
os . Exit ( m . Run ( ) )
2020-06-01 19:45:49 +02:00
}
2021-03-20 01:36:55 +01:00
var prepareForPrebuiltEtcTest = android . GroupFixturePreparers (
2021-03-08 12:28:18 +01:00
android . PrepareForTestWithArchMutator ,
PrepareForTestWithPrebuiltEtc ,
android . FixtureMergeMockFs ( android . MockFS {
2019-12-14 05:41:13 +01:00
"foo.conf" : nil ,
"bar.conf" : nil ,
"baz.conf" : nil ,
2021-03-08 12:28:18 +01:00
} ) ,
)
2020-06-26 19:12:36 +02:00
2021-07-19 04:38:04 +02:00
var prepareForPrebuiltEtcSnapshotTest = android . GroupFixturePreparers (
prepareForPrebuiltEtcTest ,
android . FixtureRegisterWithContext ( func ( ctx android . RegistrationContext ) {
snapshot . VendorSnapshotImageSingleton . Init ( ctx )
snapshot . RecoverySnapshotImageSingleton . Init ( ctx )
} ) ,
android . FixtureModifyConfig ( func ( config android . Config ) {
config . TestProductVariables . DeviceVndkVersion = proptools . StringPtr ( "current" )
config . TestProductVariables . RecoverySnapshotVersion = proptools . StringPtr ( "current" )
} ) ,
)
2018-08-15 07:20:22 +02:00
func TestPrebuiltEtcVariants ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2018-08-15 07:20:22 +02:00
prebuilt_etc {
name : "foo.conf" ,
src : "foo.conf" ,
}
prebuilt_etc {
name : "bar.conf" ,
src : "bar.conf" ,
recovery_available : true ,
}
prebuilt_etc {
name : "baz.conf" ,
src : "baz.conf" ,
recovery : true ,
}
` )
2021-03-10 10:00:58 +01:00
foo_variants := result . ModuleVariantsForTests ( "foo.conf" )
2018-08-15 07:20:22 +02:00
if len ( foo_variants ) != 1 {
t . Errorf ( "expected 1, got %#v" , foo_variants )
}
2021-03-10 10:00:58 +01:00
bar_variants := result . ModuleVariantsForTests ( "bar.conf" )
2018-08-15 07:20:22 +02:00
if len ( bar_variants ) != 2 {
t . Errorf ( "expected 2, got %#v" , bar_variants )
}
2021-03-10 10:00:58 +01:00
baz_variants := result . ModuleVariantsForTests ( "baz.conf" )
2018-08-15 07:20:22 +02:00
if len ( baz_variants ) != 1 {
2023-09-02 01:11:47 +02:00
t . Errorf ( "expected 1, got %#v" , baz_variants )
2018-08-15 07:20:22 +02:00
}
}
2018-10-26 14:49:39 +02:00
func TestPrebuiltEtcOutputPath ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2018-10-26 14:49:39 +02:00
prebuilt_etc {
name : "foo.conf" ,
src : "foo.conf" ,
filename : "foo.installed.conf" ,
}
` )
2021-03-10 10:00:58 +01:00
p := result . Module ( "foo.conf" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
2021-03-12 12:59:43 +01:00
android . AssertStringEquals ( t , "output file path" , "foo.installed.conf" , p . outputFilePath . Base ( ) )
2018-10-26 14:49:39 +02:00
}
2018-11-13 03:59:12 +01:00
func TestPrebuiltEtcGlob ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2018-11-13 03:59:12 +01:00
prebuilt_etc {
name : "my_foo" ,
src : "foo.*" ,
}
prebuilt_etc {
name : "my_bar" ,
src : "bar.*" ,
filename_from_src : true ,
}
` )
2021-03-10 10:00:58 +01:00
p := result . Module ( "my_foo" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
2021-03-12 12:59:43 +01:00
android . AssertStringEquals ( t , "my_foo output file path" , "my_foo" , p . outputFilePath . Base ( ) )
2018-11-13 03:59:12 +01:00
2021-03-10 10:00:58 +01:00
p = result . Module ( "my_bar" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
2021-03-12 12:59:43 +01:00
android . AssertStringEquals ( t , "my_bar output file path" , "bar.conf" , p . outputFilePath . Base ( ) )
2018-11-13 03:59:12 +01:00
}
2019-02-04 15:19:27 +01:00
func TestPrebuiltEtcAndroidMk ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2019-02-04 15:19:27 +01:00
prebuilt_etc {
name : "foo" ,
src : "foo.conf" ,
owner : "abc" ,
filename_from_src : true ,
2019-04-04 00:47:29 +02:00
required : [ "modA" , "moduleB" ] ,
host_required : [ "hostModA" , "hostModB" ] ,
target_required : [ "targetModA" ] ,
2019-02-04 15:19:27 +01:00
}
` )
2019-04-04 00:47:29 +02:00
expected := map [ string ] [ ] string {
"LOCAL_MODULE" : { "foo" } ,
"LOCAL_MODULE_CLASS" : { "ETC" } ,
"LOCAL_MODULE_OWNER" : { "abc" } ,
"LOCAL_INSTALLED_MODULE_STEM" : { "foo.conf" } ,
"LOCAL_REQUIRED_MODULES" : { "modA" , "moduleB" } ,
"LOCAL_HOST_REQUIRED_MODULES" : { "hostModA" , "hostModB" } ,
"LOCAL_TARGET_REQUIRED_MODULES" : { "targetModA" } ,
2023-01-05 02:12:24 +01:00
"LOCAL_SOONG_MODULE_TYPE" : { "prebuilt_etc" } ,
2019-02-04 15:19:27 +01:00
}
2021-03-10 10:00:58 +01:00
mod := result . Module ( "foo" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
entries := android . AndroidMkEntriesForTest ( t , result . TestContext , mod ) [ 0 ]
2019-04-04 00:47:29 +02:00
for k , expectedValue := range expected {
if value , ok := entries . EntryMap [ k ] ; ok {
2021-03-12 12:59:43 +01:00
android . AssertDeepEquals ( t , k , expectedValue , value )
2019-04-04 00:47:29 +02:00
} else {
t . Errorf ( "No %s defined, saw %q" , k , entries . EntryMap )
2019-02-04 15:19:27 +01:00
}
}
}
2019-02-04 23:34:10 +01:00
2020-06-26 19:12:36 +02:00
func TestPrebuiltEtcRelativeInstallPathInstallDirPath ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2020-06-26 19:12:36 +02:00
prebuilt_etc {
name : "foo.conf" ,
src : "foo.conf" ,
relative_install_path : "bar" ,
}
` )
2021-03-10 10:00:58 +01:00
p := result . Module ( "foo.conf" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
2021-03-15 16:35:49 +01:00
expected := "out/soong/target/product/test_device/system/etc/bar"
android . AssertPathRelativeToTopEquals ( t , "install dir" , expected , p . installDirPath )
2020-06-26 19:12:36 +02:00
}
func TestPrebuiltEtcCannotSetRelativeInstallPathAndSubDir ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
prepareForPrebuiltEtcTest .
2021-03-08 12:28:18 +01:00
ExtendWithErrorHandler ( android . FixtureExpectsAtLeastOneErrorMatchingPattern ( "relative_install_path is set. Cannot set sub_dir" ) ) .
RunTestWithBp ( t , `
prebuilt_etc {
name : "foo.conf" ,
src : "foo.conf" ,
sub_dir : "bar" ,
relative_install_path : "bar" ,
}
` )
2020-06-26 19:12:36 +02:00
}
2019-02-04 23:34:10 +01:00
func TestPrebuiltEtcHost ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2019-02-04 23:34:10 +01:00
prebuilt_etc_host {
name : "foo.conf" ,
src : "foo.conf" ,
}
` )
2021-07-20 18:47:41 +02:00
buildOS := result . Config . BuildOS . String ( )
2021-03-10 10:00:58 +01:00
p := result . Module ( "foo.conf" , buildOS + "_common" ) . ( * PrebuiltEtc )
2019-02-04 23:34:10 +01:00
if ! p . Host ( ) {
t . Errorf ( "host bit is not set for a prebuilt_etc_host module." )
}
}
2019-02-13 14:50:33 +01:00
2022-10-04 00:31:29 +02:00
func TestPrebuiltEtcAllowMissingDependencies ( t * testing . T ) {
result := android . GroupFixturePreparers (
prepareForPrebuiltEtcTest ,
android . PrepareForTestDisallowNonExistentPaths ,
android . FixtureModifyConfig (
func ( config android . Config ) {
config . TestProductVariables . Allow_missing_dependencies = proptools . BoolPtr ( true )
} ) ,
) . RunTestWithBp ( t , `
prebuilt_etc {
name : "foo.conf" ,
filename_from_src : true ,
arch : {
x86 : {
src : "x86.conf" ,
} ,
} ,
}
` )
android . AssertStringEquals ( t , "expected error rule" , "android/soong/android.Error" ,
result . ModuleForTests ( "foo.conf" , "android_arm64_armv8-a" ) . Output ( "foo.conf" ) . Rule . String ( ) )
}
2021-04-06 14:00:17 +02:00
func TestPrebuiltRootInstallDirPath ( t * testing . T ) {
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
prebuilt_root {
name : "foo.conf" ,
src : "foo.conf" ,
filename : "foo.conf" ,
}
` )
p := result . Module ( "foo.conf" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
expected := "out/soong/target/product/test_device/system"
android . AssertPathRelativeToTopEquals ( t , "install dir" , expected , p . installDirPath )
}
func TestPrebuiltRootInstallDirPathValidate ( t * testing . T ) {
prepareForPrebuiltEtcTest . ExtendWithErrorHandler ( android . FixtureExpectsAtLeastOneErrorMatchingPattern ( "filename cannot contain separator" ) ) . RunTestWithBp ( t , `
prebuilt_root {
name : "foo.conf" ,
src : "foo.conf" ,
filename : "foo/bar.conf" ,
}
` )
}
2019-02-13 14:50:33 +01:00
func TestPrebuiltUserShareInstallDirPath ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2019-02-13 14:50:33 +01:00
prebuilt_usr_share {
name : "foo.conf" ,
src : "foo.conf" ,
sub_dir : "bar" ,
}
` )
2021-03-10 10:00:58 +01:00
p := result . Module ( "foo.conf" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
2021-03-15 16:35:49 +01:00
expected := "out/soong/target/product/test_device/system/usr/share/bar"
android . AssertPathRelativeToTopEquals ( t , "install dir" , expected , p . installDirPath )
2019-02-13 14:50:33 +01:00
}
2019-02-23 00:47:57 +01:00
func TestPrebuiltUserShareHostInstallDirPath ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2019-02-23 00:47:57 +01:00
prebuilt_usr_share_host {
name : "foo.conf" ,
src : "foo.conf" ,
sub_dir : "bar" ,
}
` )
2021-07-20 18:47:41 +02:00
buildOS := result . Config . BuildOS . String ( )
2021-03-10 10:00:58 +01:00
p := result . Module ( "foo.conf" , buildOS + "_common" ) . ( * PrebuiltEtc )
2021-03-15 16:35:49 +01:00
expected := filepath . Join ( "out/soong/host" , result . Config . PrebuiltOS ( ) , "usr" , "share" , "bar" )
android . AssertPathRelativeToTopEquals ( t , "install dir" , expected , p . installDirPath )
2019-02-23 00:47:57 +01:00
}
2019-05-14 17:20:45 +02:00
func TestPrebuiltFontInstallDirPath ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , `
2019-05-14 17:20:45 +02:00
prebuilt_font {
name : "foo.conf" ,
src : "foo.conf" ,
}
` )
2021-03-10 10:00:58 +01:00
p := result . Module ( "foo.conf" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
2021-03-15 16:35:49 +01:00
expected := "out/soong/target/product/test_device/system/fonts"
android . AssertPathRelativeToTopEquals ( t , "install dir" , expected , p . installDirPath )
2019-05-14 17:20:45 +02:00
}
2019-06-04 00:29:27 +02:00
func TestPrebuiltFirmwareDirPath ( t * testing . T ) {
2021-03-15 16:35:49 +01:00
targetPath := "out/soong/target/product/test_device"
2019-06-04 00:29:27 +02:00
tests := [ ] struct {
description string
config string
expectedPath string
} { {
description : "prebuilt: system firmware" ,
config : `
prebuilt_firmware {
name : "foo.conf" ,
src : "foo.conf" ,
} ` ,
expectedPath : filepath . Join ( targetPath , "system/etc/firmware" ) ,
} , {
description : "prebuilt: vendor firmware" ,
config : `
prebuilt_firmware {
name : "foo.conf" ,
src : "foo.conf" ,
soc_specific : true ,
sub_dir : "sub_dir" ,
} ` ,
expectedPath : filepath . Join ( targetPath , "vendor/firmware/sub_dir" ) ,
} }
for _ , tt := range tests {
t . Run ( tt . description , func ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , tt . config )
2021-03-10 10:00:58 +01:00
p := result . Module ( "foo.conf" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
2021-03-15 16:35:49 +01:00
android . AssertPathRelativeToTopEquals ( t , "install dir" , tt . expectedPath , p . installDirPath )
2019-06-04 00:29:27 +02:00
} )
}
}
2020-06-08 23:40:25 +02:00
func TestPrebuiltDSPDirPath ( t * testing . T ) {
2021-03-15 16:35:49 +01:00
targetPath := "out/soong/target/product/test_device"
2020-06-08 23:40:25 +02:00
tests := [ ] struct {
description string
config string
expectedPath string
} { {
description : "prebuilt: system dsp" ,
config : `
prebuilt_dsp {
name : "foo.conf" ,
src : "foo.conf" ,
} ` ,
expectedPath : filepath . Join ( targetPath , "system/etc/dsp" ) ,
} , {
description : "prebuilt: vendor dsp" ,
config : `
prebuilt_dsp {
name : "foo.conf" ,
src : "foo.conf" ,
soc_specific : true ,
sub_dir : "sub_dir" ,
} ` ,
expectedPath : filepath . Join ( targetPath , "vendor/dsp/sub_dir" ) ,
} }
for _ , tt := range tests {
t . Run ( tt . description , func ( t * testing . T ) {
2021-03-20 01:36:55 +01:00
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , tt . config )
2021-03-10 10:00:58 +01:00
p := result . Module ( "foo.conf" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
2021-03-15 16:35:49 +01:00
android . AssertPathRelativeToTopEquals ( t , "install dir" , tt . expectedPath , p . installDirPath )
2020-06-08 23:40:25 +02:00
} )
}
}
2021-04-09 18:41:23 +02:00
func TestPrebuiltRFSADirPath ( t * testing . T ) {
targetPath := "out/soong/target/product/test_device"
tests := [ ] struct {
description string
config string
expectedPath string
} { {
description : "prebuilt: system rfsa" ,
config : `
prebuilt_rfsa {
name : "foo.conf" ,
src : "foo.conf" ,
} ` ,
expectedPath : filepath . Join ( targetPath , "system/lib/rfsa" ) ,
} , {
description : "prebuilt: vendor rfsa" ,
config : `
prebuilt_rfsa {
name : "foo.conf" ,
src : "foo.conf" ,
soc_specific : true ,
sub_dir : "sub_dir" ,
} ` ,
expectedPath : filepath . Join ( targetPath , "vendor/lib/rfsa/sub_dir" ) ,
} }
for _ , tt := range tests {
t . Run ( tt . description , func ( t * testing . T ) {
result := prepareForPrebuiltEtcTest . RunTestWithBp ( t , tt . config )
p := result . Module ( "foo.conf" , "android_arm64_armv8-a" ) . ( * PrebuiltEtc )
android . AssertPathRelativeToTopEquals ( t , "install dir" , tt . expectedPath , p . installDirPath )
} )
}
}
2021-07-19 04:38:04 +02:00
func checkIfSnapshotTaken ( t * testing . T , result * android . TestResult , image string , moduleName string ) {
checkIfSnapshotExistAsExpected ( t , result , image , moduleName , true )
}
func checkIfSnapshotNotTaken ( t * testing . T , result * android . TestResult , image string , moduleName string ) {
checkIfSnapshotExistAsExpected ( t , result , image , moduleName , false )
}
func checkIfSnapshotExistAsExpected ( t * testing . T , result * android . TestResult , image string , moduleName string , expectToExist bool ) {
snapshotSingleton := result . SingletonForTests ( image + "-snapshot" )
archType := "arm64"
archVariant := "armv8-a"
archDir := fmt . Sprintf ( "arch-%s" , archType )
snapshotDir := fmt . Sprintf ( "%s-snapshot" , image )
snapshotVariantPath := filepath . Join ( snapshotDir , archType )
outputDir := filepath . Join ( snapshotVariantPath , archDir , "etc" )
imageVariant := ""
if image == "recovery" {
imageVariant = "recovery_"
}
mod := result . ModuleForTests ( moduleName , fmt . Sprintf ( "android_%s%s_%s" , imageVariant , archType , archVariant ) )
outputFiles := mod . OutputFiles ( t , "" )
if len ( outputFiles ) != 1 {
t . Errorf ( "%q must have single output\n" , moduleName )
return
}
snapshotPath := filepath . Join ( outputDir , moduleName )
if expectToExist {
out := snapshotSingleton . Output ( snapshotPath )
if out . Input . String ( ) != outputFiles [ 0 ] . String ( ) {
t . Errorf ( "The input of snapshot %q must be %q, but %q" , "prebuilt_vendor" , out . Input . String ( ) , outputFiles [ 0 ] )
}
snapshotJsonPath := snapshotPath + ".json"
if snapshotSingleton . MaybeOutput ( snapshotJsonPath ) . Rule == nil {
t . Errorf ( "%q expected but not found" , snapshotJsonPath )
}
} else {
out := snapshotSingleton . MaybeOutput ( snapshotPath )
if out . Rule != nil {
t . Errorf ( "There must be no rule for module %q output file %q" , moduleName , outputFiles [ 0 ] )
}
}
}
func TestPrebuiltTakeSnapshot ( t * testing . T ) {
var testBp = `
prebuilt_etc {
name : "prebuilt_vendor" ,
src : "foo.conf" ,
vendor : true ,
}
prebuilt_etc {
name : "prebuilt_vendor_indirect" ,
src : "foo.conf" ,
vendor : true ,
}
prebuilt_etc {
name : "prebuilt_recovery" ,
src : "bar.conf" ,
recovery : true ,
}
prebuilt_etc {
name : "prebuilt_recovery_indirect" ,
src : "bar.conf" ,
recovery : true ,
}
`
t . Run ( "prebuilt: vendor and recovery snapshot" , func ( t * testing . T ) {
result := prepareForPrebuiltEtcSnapshotTest . RunTestWithBp ( t , testBp )
checkIfSnapshotTaken ( t , result , "vendor" , "prebuilt_vendor" )
checkIfSnapshotTaken ( t , result , "vendor" , "prebuilt_vendor_indirect" )
checkIfSnapshotTaken ( t , result , "recovery" , "prebuilt_recovery" )
checkIfSnapshotTaken ( t , result , "recovery" , "prebuilt_recovery_indirect" )
} )
t . Run ( "prebuilt: directed snapshot" , func ( t * testing . T ) {
prepareForPrebuiltEtcDirectedSnapshotTest := android . GroupFixturePreparers (
prepareForPrebuiltEtcSnapshotTest ,
android . FixtureModifyConfig ( func ( config android . Config ) {
config . TestProductVariables . DirectedVendorSnapshot = true
config . TestProductVariables . VendorSnapshotModules = make ( map [ string ] bool )
config . TestProductVariables . VendorSnapshotModules [ "prebuilt_vendor" ] = true
config . TestProductVariables . DirectedRecoverySnapshot = true
config . TestProductVariables . RecoverySnapshotModules = make ( map [ string ] bool )
config . TestProductVariables . RecoverySnapshotModules [ "prebuilt_recovery" ] = true
} ) ,
)
result := prepareForPrebuiltEtcDirectedSnapshotTest . RunTestWithBp ( t , testBp )
checkIfSnapshotTaken ( t , result , "vendor" , "prebuilt_vendor" )
checkIfSnapshotNotTaken ( t , result , "vendor" , "prebuilt_vendor_indirect" )
checkIfSnapshotTaken ( t , result , "recovery" , "prebuilt_recovery" )
checkIfSnapshotNotTaken ( t , result , "recovery" , "prebuilt_recovery_indirect" )
} )
}
2023-06-06 00:49:50 +02:00
func TestPrebuiltEtcAndroidMkEntriesWithBazel ( t * testing . T ) {
t . Parallel ( )
bp := `
prebuilt_etc {
name : "myetc" ,
src : "prebuilt_etc.rc" , // filename in src tree
filename : "init.rc" , // target filename on device
sub_dir : "subdir" , // relative subdir for installation
bazel_module : { label : "//foo/bar:myetc" } ,
}
`
res := android . GroupFixturePreparers (
prepareForPrebuiltEtcTest ,
android . FixtureModifyConfig ( func ( cfg android . Config ) {
cfg . BazelContext = android . MockBazelContext {
LabelToPrebuiltFileInfo : map [ string ] cquery . PrebuiltFileInfo {
"//foo/bar:myetc" : cquery . PrebuiltFileInfo {
Src : "foo/bar/prebuilt_etc.rc" ,
Dir : "etc/subdir" ,
Filename : "init.rc" ,
Installable : true ,
} ,
} ,
}
} ) ,
) . RunTestWithBp ( t , bp )
ctx := res . ModuleForTests ( "myetc" , "android_arm64_armv8-a" )
mod := ctx . Module ( )
entries := android . AndroidMkEntriesForTest ( t , res . TestContext , mod ) [ 0 ]
// verify androidmk entries
android . AssertStringDoesContain ( t , "LOCAL_MODULE_PATH should contain" , entries . EntryMap [ "LOCAL_MODULE_PATH" ] [ 0 ] , "etc/subdir" )
android . AssertStringEquals ( t , "LOCAL_INSTALLED_MODULE_STEM is incorrect" , "init.rc" , entries . EntryMap [ "LOCAL_INSTALLED_MODULE_STEM" ] [ 0 ] )
// verify installation rules
install := ctx . Description ( "install" )
android . AssertStringEquals ( t , "Source location of prebuilt_etc installation" , "out/soong/.intermediates/myetc/android_arm64_armv8-a/init.rc" , install . Input . String ( ) )
android . AssertStringEquals ( t , "Target location of prebuilt_etc installation" , "out/soong/target/product/test_device/system/etc/subdir/init.rc" , install . Output . String ( ) )
}