From cee7e66b07cdea5d37fbdd94bb1a34cc8caa448f Mon Sep 17 00:00:00 2001 From: Paul Duffin Date: Thu, 9 Jul 2020 17:32:57 +0100 Subject: [PATCH] Ensure that sdk/module_exports depends on source members Previously, preferring a prebuilt of an sdk/module_exports's member would cause the sdk/module_exports to depend on the prebuilt instead of the source and cause problems with the build. This chance prevents the dependency from an sdk/module_exports to its members from being replaced with prebuilts. Bug: 160785918 Test: m nothing Change-Id: Iee4bcd438c11929e30fb5766701b05a0e89956d9 --- android/sdk.go | 9 ++++++++ java/java_test.go | 27 ++++++----------------- java/testing.go | 18 ++++++++++++++++ sdk/java_sdk_test.go | 51 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 21 deletions(-) diff --git a/android/sdk.go b/android/sdk.go index e823106e8..8115b690b 100644 --- a/android/sdk.go +++ b/android/sdk.go @@ -266,6 +266,9 @@ type SdkMemberTypeDependencyTag interface { SdkMemberType() SdkMemberType } +var _ SdkMemberTypeDependencyTag = (*sdkMemberDependencyTag)(nil) +var _ ReplaceSourceWithPrebuilt = (*sdkMemberDependencyTag)(nil) + type sdkMemberDependencyTag struct { blueprint.BaseDependencyTag memberType SdkMemberType @@ -275,6 +278,12 @@ func (t *sdkMemberDependencyTag) SdkMemberType() SdkMemberType { return t.memberType } +// Prevent dependencies from the sdk/module_exports onto their members from being +// replaced with a preferred prebuilt. +func (t *sdkMemberDependencyTag) ReplaceSourceWithPrebuilt() bool { + return false +} + func DependencyTagForSdkMemberType(memberType SdkMemberType) SdkMemberTypeDependencyTag { return &sdkMemberDependencyTag{memberType: memberType} } diff --git a/java/java_test.go b/java/java_test.go index 59a2ce7aa..fb003619f 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -25,7 +25,6 @@ import ( "strings" "testing" - "github.com/google/blueprint" "github.com/google/blueprint/proptools" "android/soong/android" @@ -173,20 +172,6 @@ func moduleToPath(name string) string { } } -func checkModuleDependencies(t *testing.T, ctx *android.TestContext, name, variant string, expected []string) { - t.Helper() - module := ctx.ModuleForTests(name, variant).Module() - deps := []string{} - ctx.VisitDirectDeps(module, func(m blueprint.Module) { - deps = append(deps, m.Name()) - }) - sort.Strings(deps) - - if actual := deps; !reflect.DeepEqual(expected, actual) { - t.Errorf("expected %#q, found %#q", expected, actual) - } -} - func TestJavaLinkType(t *testing.T) { testJava(t, ` java_library { @@ -647,7 +632,7 @@ func TestJavaSdkLibraryImport(t *testing.T) { } } - checkModuleDependencies(t, ctx, "sdklib", "android_common", []string{ + CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{ `prebuilt_sdklib.stubs`, `prebuilt_sdklib.stubs.source.test`, `prebuilt_sdklib.stubs.system`, @@ -675,7 +660,7 @@ func TestJavaSdkLibraryImport_WithSource(t *testing.T) { } `) - checkModuleDependencies(t, ctx, "sdklib", "android_common", []string{ + CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{ `dex2oatd`, `prebuilt_sdklib`, `sdklib.impl`, @@ -684,7 +669,7 @@ func TestJavaSdkLibraryImport_WithSource(t *testing.T) { `sdklib.xml`, }) - checkModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{ + CheckModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{ `prebuilt_sdklib.stubs`, `sdklib.impl`, // This should be prebuilt_sdklib.stubs but is set to sdklib.stubs because the @@ -715,7 +700,7 @@ func TestJavaSdkLibraryImport_Preferred(t *testing.T) { } `) - checkModuleDependencies(t, ctx, "sdklib", "android_common", []string{ + CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{ `dex2oatd`, `prebuilt_sdklib`, `sdklib.impl`, @@ -724,7 +709,7 @@ func TestJavaSdkLibraryImport_Preferred(t *testing.T) { `sdklib.xml`, }) - checkModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{ + CheckModuleDependencies(t, ctx, "prebuilt_sdklib", "android_common", []string{ `prebuilt_sdklib.stubs`, `sdklib.impl`, `sdklib.xml`, @@ -1491,7 +1476,7 @@ func TestJavaSdkLibrary_Deps(t *testing.T) { } `) - checkModuleDependencies(t, ctx, "sdklib", "android_common", []string{ + CheckModuleDependencies(t, ctx, "sdklib", "android_common", []string{ `dex2oatd`, `sdklib.impl`, `sdklib.stubs`, diff --git a/java/testing.go b/java/testing.go index f5688e627..94f054e67 100644 --- a/java/testing.go +++ b/java/testing.go @@ -16,9 +16,13 @@ package java import ( "fmt" + "reflect" + "sort" + "testing" "android/soong/android" "android/soong/cc" + "github.com/google/blueprint" ) func TestConfig(buildDir string, env map[string]string, bp string, fs map[string][]byte) android.Config { @@ -216,3 +220,17 @@ func GatherRequiredDepsForTest() string { return bp } + +func CheckModuleDependencies(t *testing.T, ctx *android.TestContext, name, variant string, expected []string) { + t.Helper() + module := ctx.ModuleForTests(name, variant).Module() + deps := []string{} + ctx.VisitDirectDeps(module, func(m blueprint.Module) { + deps = append(deps, m.Name()) + }) + sort.Strings(deps) + + if actual := deps; !reflect.DeepEqual(expected, actual) { + t.Errorf("expected %#q, found %#q", expected, actual) + } +} diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index 7496b207d..79da3f05f 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -16,6 +16,8 @@ package sdk import ( "testing" + + "android/soong/java" ) func testSdkWithJava(t *testing.T, bp string) *testSdkResult { @@ -26,6 +28,9 @@ func testSdkWithJava(t *testing.T, bp string) *testSdkResult { "resource.test": nil, "aidl/foo/bar/Test.aidl": nil, + // For java_import + "prebuilt.jar": nil, + // For java_sdk_library "api/current.txt": nil, "api/removed.txt": nil, @@ -85,6 +90,52 @@ java_import { // Contains tests for SDK members provided by the java package. +func TestSdkDependsOnSourceEvenWhenPrebuiltPreferred(t *testing.T) { + result := testSdkWithJava(t, ` + sdk { + name: "mysdk", + java_header_libs: ["sdkmember"], + } + + java_library { + name: "sdkmember", + srcs: ["Test.java"], + system_modules: "none", + sdk_version: "none", + } + + java_import { + name: "sdkmember", + prefer: true, + jars: ["prebuilt.jar"], + } + `) + + // Make sure that the mysdk module depends on "sdkmember" and not "prebuilt_sdkmember". + java.CheckModuleDependencies(t, result.ctx, "mysdk", "android_common", []string{"sdkmember"}) + + result.CheckSnapshot("mysdk", "", + checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT. + +java_import { + name: "mysdk_sdkmember@current", + sdk_member_name: "sdkmember", + jars: ["java/sdkmember.jar"], +} + +java_import { + name: "sdkmember", + prefer: false, + jars: ["java/sdkmember.jar"], +} + +sdk_snapshot { + name: "mysdk@current", + java_header_libs: ["mysdk_sdkmember@current"], +} +`)) +} + func TestBasicSdkWithJavaLibrary(t *testing.T) { result := testSdkWithJava(t, ` sdk {