add multilib data_device_bins properties

Some targets need to be able to specify the specific architecture for a
data_device_bin module. This commit adds new properties to allow
specification of first, both, 32, or 64 multilib properties.

Bug: 231448797
Bug: 232408185
Test: go test ./java -run TestDataDeviceBinsBuildsDeviceBinary
Change-Id: I457cf4b1a9ccb28b46042f874c96bd0a87009fab
Merged-In: I457cf4b1a9ccb28b46042f874c96bd0a87009fab
This commit is contained in:
Sam Delmerico
2022-06-01 15:45:02 +00:00
parent 8e8ef9fe66
commit b706b4efef
4 changed files with 284 additions and 59 deletions

View File

@@ -1498,62 +1498,172 @@ func TestErrorproneEnabledOnlyByEnvironmentVariable(t *testing.T) {
}
func TestDataDeviceBinsBuildsDeviceBinary(t *testing.T) {
bp := `
testCases := []struct {
dataDeviceBinType string
depCompileMultilib string
variants []string
expectedError string
}{
{
dataDeviceBinType: "first",
depCompileMultilib: "first",
variants: []string{"android_arm64_armv8-a"},
},
{
dataDeviceBinType: "first",
depCompileMultilib: "both",
variants: []string{"android_arm64_armv8-a"},
},
{
// this is true because our testing framework is set up with
// Targets ~ [<64bit target>, <32bit target>], where 64bit is "first"
dataDeviceBinType: "first",
depCompileMultilib: "32",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
{
dataDeviceBinType: "first",
depCompileMultilib: "64",
variants: []string{"android_arm64_armv8-a"},
},
{
dataDeviceBinType: "both",
depCompileMultilib: "both",
variants: []string{
"android_arm_armv7-a-neon",
"android_arm64_armv8-a",
},
},
{
dataDeviceBinType: "both",
depCompileMultilib: "32",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
{
dataDeviceBinType: "both",
depCompileMultilib: "64",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
{
dataDeviceBinType: "both",
depCompileMultilib: "first",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
{
dataDeviceBinType: "32",
depCompileMultilib: "32",
variants: []string{"android_arm_armv7-a-neon"},
},
{
dataDeviceBinType: "32",
depCompileMultilib: "first",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
{
dataDeviceBinType: "32",
depCompileMultilib: "both",
variants: []string{"android_arm_armv7-a-neon"},
},
{
dataDeviceBinType: "32",
depCompileMultilib: "64",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
{
dataDeviceBinType: "64",
depCompileMultilib: "64",
variants: []string{"android_arm64_armv8-a"},
},
{
dataDeviceBinType: "64",
depCompileMultilib: "both",
variants: []string{"android_arm64_armv8-a"},
},
{
dataDeviceBinType: "64",
depCompileMultilib: "first",
variants: []string{"android_arm64_armv8-a"},
},
{
dataDeviceBinType: "64",
depCompileMultilib: "32",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
{
dataDeviceBinType: "prefer32",
depCompileMultilib: "32",
variants: []string{"android_arm_armv7-a-neon"},
},
{
dataDeviceBinType: "prefer32",
depCompileMultilib: "both",
variants: []string{"android_arm_armv7-a-neon"},
},
{
dataDeviceBinType: "prefer32",
depCompileMultilib: "first",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
{
dataDeviceBinType: "prefer32",
depCompileMultilib: "64",
expectedError: `Android.bp:2:3: dependency "bar" of "foo" missing variant`,
},
}
bpTemplate := `
java_test_host {
name: "foo",
srcs: ["test.java"],
data_device_bins: ["bar"],
data_device_bins_%s: ["bar"],
}
cc_binary {
name: "bar",
compile_multilib: "%s",
}
`
ctx := android.GroupFixturePreparers(
PrepareForIntegrationTestWithJava,
).RunTestWithBp(t, bp)
for _, tc := range testCases {
bp := fmt.Sprintf(bpTemplate, tc.dataDeviceBinType, tc.depCompileMultilib)
buildOS := ctx.Config.BuildOS.String()
fooVariant := ctx.ModuleForTests("foo", buildOS+"_common")
barVariant := ctx.ModuleForTests("bar", "android_arm64_armv8-a")
fooMod := fooVariant.Module().(*TestHost)
relocated := barVariant.Output("bar")
expectedInput := "out/soong/.intermediates/bar/android_arm64_armv8-a/unstripped/bar"
android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input)
entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0]
expectedData := []string{
"out/soong/.intermediates/bar/android_arm64_armv8-a/bar:bar",
}
actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData)
}
func TestDataDeviceBinsAutogenTradefedConfig(t *testing.T) {
bp := `
java_test_host {
name: "foo",
srcs: ["test.java"],
data_device_bins: ["bar"],
errorHandler := android.FixtureExpectsNoErrors
if tc.expectedError != "" {
errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(tc.expectedError)
}
cc_binary {
name: "bar",
}
`
testName := fmt.Sprintf(`data_device_bins_%s with compile_multilib:"%s"`, tc.dataDeviceBinType, tc.depCompileMultilib)
t.Run(testName, func(t *testing.T) {
ctx := android.GroupFixturePreparers(PrepareForIntegrationTestWithJava).
ExtendWithErrorHandler(errorHandler).
RunTestWithBp(t, bp)
if tc.expectedError != "" {
return
}
ctx := android.GroupFixturePreparers(
PrepareForIntegrationTestWithJava,
).RunTestWithBp(t, bp)
buildOS := ctx.Config.BuildOS.String()
fooVariant := ctx.ModuleForTests("foo", buildOS+"_common")
fooMod := fooVariant.Module().(*TestHost)
entries := android.AndroidMkEntriesForTest(t, ctx.TestContext, fooMod)[0]
buildOS := ctx.Config.BuildOS.String()
fooModule := ctx.ModuleForTests("foo", buildOS+"_common")
expectedAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />`
expectedAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />`
autogen := fooVariant.Rule("autogen")
if !strings.Contains(autogen.Args["extraConfigs"], expectedAutogenConfig) {
t.Errorf("foo extraConfigs %v does not contain %q", autogen.Args["extraConfigs"], expectedAutogenConfig)
}
autogen := fooModule.Rule("autogen")
if !strings.Contains(autogen.Args["extraConfigs"], expectedAutogenConfig) {
t.Errorf("foo extraConfigs %v does not contain %q", autogen.Args["extraConfigs"], expectedAutogenConfig)
expectedData := []string{}
for _, variant := range tc.variants {
barVariant := ctx.ModuleForTests("bar", variant)
relocated := barVariant.Output("bar")
expectedInput := fmt.Sprintf("out/soong/.intermediates/bar/%s/unstripped/bar", variant)
android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input)
expectedData = append(expectedData, fmt.Sprintf("out/soong/.intermediates/bar/%s/bar:bar", variant))
}
actualData := entries.EntryMap["LOCAL_COMPATIBILITY_SUPPORT_FILES"]
android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", ctx.Config, expectedData, actualData)
})
}
}