From e12c083198403ec694af6c625aed11327eb2bf7f Mon Sep 17 00:00:00 2001 From: Jingwen Chen Date: Fri, 25 Aug 2023 09:00:16 +0000 Subject: [PATCH] [bp2build] android_test bp2build. android_test is just an android_app, but the test bits are handled purely in Starlark (tradefed_test_impl). This enables building HelloWorldTests (android_test) with Bazel. Bug: 297030120 Bug: 297029612 Test: WIP Change-Id: I6d287c94b31698ea247da48e4cd6b5a75bc71e11 --- android/allowlists/allowlists.go | 29 +++++++++++++++++--- android/module.go | 14 ++++++++-- bp2build/aar_conversion_test.go | 2 -- java/aar.go | 5 +++- java/app.go | 47 ++++++++++++++++++++++---------- 5 files changed, 73 insertions(+), 24 deletions(-) diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index bfc9b9e2e..99041d3d2 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -65,6 +65,7 @@ var ( "build/bazel": Bp2BuildDefaultTrueRecursively, "build/make/target/product/security": Bp2BuildDefaultTrue, + "build/make/tools": Bp2BuildDefaultTrue, "build/make/tools/protos": Bp2BuildDefaultTrue, "build/make/tools/releasetools": Bp2BuildDefaultTrue, "build/make/tools/sbom": Bp2BuildDefaultTrue, @@ -79,7 +80,9 @@ var ( "build/soong/scripts": Bp2BuildDefaultTrueRecursively, "cts/common/device-side/nativetesthelper/jni": Bp2BuildDefaultTrueRecursively, - "cts/libs/json": Bp2BuildDefaultTrueRecursively, + "cts/libs/json": Bp2BuildDefaultTrueRecursively, + "cts/tests/tests/gesture": Bp2BuildDefaultTrueRecursively, + "platform_testing/libraries/annotations": Bp2BuildDefaultTrueRecursively, "dalvik/tools/dexdeps": Bp2BuildDefaultTrueRecursively, @@ -892,9 +895,6 @@ var ( "merge_annotation_zips_test", - // bouncycastle dep - "platform-test-annotations", - // java_resources with multiple resource_dirs "emma", @@ -904,6 +904,16 @@ var ( "ndk_libc++_static", "ndk_libc++_shared", "ndk_system", + + // allowlist //prebuilts/common/misc/androidx-test/... + "androidx.test.runner", + "androidx.test.runner-nodeps", + "androidx.test.services.storage", + "androidx.test.services.storage-nodeps", + "androidx.test.monitor", + "androidx.test.monitor-nodeps", + "androidx.test.annotation", + "androidx.test.annotation-nodeps", } Bp2buildModuleTypeAlwaysConvertList = []string{ @@ -1649,6 +1659,17 @@ var ( // TODO(b/299974637) Fix linking error "libbinder_rpc_unstable", + + // TODO(b/297356704) sdk_version is unset. + "VendorAtomCodeGenJavaTest", + + // android_test from allowlisted packages, but with unconverted deps + "MtsLibnativehelperLazyTestCases", + "ObjenesisTck", + "DevCodelabTest", + "MtsTimeZoneDataTestCases", + "NanoAndroidTest", + "MtsLibnativehelperTestCases", } // Bazel prod-mode allowlist. Modules in this list are built by Bazel diff --git a/android/module.go b/android/module.go index 516810fcb..e6e5918a5 100644 --- a/android/module.go +++ b/android/module.go @@ -1636,15 +1636,23 @@ func (b bp2buildInfo) BazelAttributes() []interface{} { } func (m *ModuleBase) addBp2buildInfo(info bp2buildInfo) { - if m.commonProperties.BazelConversionStatus.UnconvertedReason != nil { - panic(fmt.Errorf("bp2build: module '%s' marked unconvertible and also is converted", m.Name())) + reason := m.commonProperties.BazelConversionStatus.UnconvertedReason + if reason != nil { + panic(fmt.Errorf("bp2build: internal error trying to convert module '%s' marked unconvertible. Reason type %d: %s", + m.Name(), + reason.ReasonType, + reason.Detail)) } m.commonProperties.BazelConversionStatus.Bp2buildInfo = append(m.commonProperties.BazelConversionStatus.Bp2buildInfo, info) } func (m *ModuleBase) setBp2buildUnconvertible(reasonType bp2build_metrics_proto.UnconvertedReasonType, detail string) { if len(m.commonProperties.BazelConversionStatus.Bp2buildInfo) > 0 { - panic(fmt.Errorf("bp2build: module '%s' marked unconvertible and also is converted", m.Name())) + fmt.Println(m.commonProperties.BazelConversionStatus.Bp2buildInfo) + panic(fmt.Errorf("bp2build: internal error trying to mark converted module '%s' as unconvertible. Reason type %d: %s", + m.Name(), + reasonType, + detail)) } m.commonProperties.BazelConversionStatus.UnconvertedReason = &UnconvertedReason{ ReasonType: int(reasonType), diff --git a/bp2build/aar_conversion_test.go b/bp2build/aar_conversion_test.go index 13bb167c2..ce20721c9 100644 --- a/bp2build/aar_conversion_test.go +++ b/bp2build/aar_conversion_test.go @@ -17,7 +17,6 @@ package bp2build import ( "android/soong/android" "android/soong/java" - "fmt" "testing" ) @@ -91,7 +90,6 @@ android_library { sdk_version: "current", } `, - ExpectedErr: fmt.Errorf("Module has direct dependencies but no sources. Bazel will not allow this."), ExpectedBazelTargets: []string{}, }) } diff --git a/java/aar.go b/java/aar.go index 021619603..73f9ff174 100644 --- a/java/aar.go +++ b/java/aar.go @@ -1340,7 +1340,10 @@ func (a *AndroidLibrary) ConvertWithBp2build(ctx android.TopDownMutatorContext) if !commonAttrs.Srcs.IsEmpty() { deps.Append(depLabels.StaticDeps) // we should only append these if there are sources to use them } else if !depLabels.Deps.IsEmpty() { - ctx.ModuleErrorf("Module has direct dependencies but no sources. Bazel will not allow this.") + ctx.MarkBp2buildUnconvertible( + bp2build_metrics_proto.UnconvertedReasonType_UNSUPPORTED, + "Module has direct dependencies but no sources. Bazel will not allow this.") + return } name := a.Name() props := AndroidLibraryBazelTargetModuleProperties() diff --git a/java/app.go b/java/app.go index 7ee0e3857..1b4d279f7 100755 --- a/java/app.go +++ b/java/app.go @@ -1115,6 +1115,8 @@ type AndroidTest struct { testConfig android.Path extraTestConfigs android.Paths data android.Paths + + android.BazelModuleBase } func (a *AndroidTest) InstallInTestcases() bool { @@ -1232,6 +1234,8 @@ func AndroidTestFactory() android.Module { android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) android.InitOverridableModule(module, &module.overridableAppProperties.Overrides) + + android.InitBazelModule(module) return module } @@ -1630,11 +1634,10 @@ type bazelAndroidAppAttributes struct { Proguard_specs bazel.LabelListAttribute } -// ConvertWithBp2build is used to convert android_app to Bazel. -func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { +func convertWithBp2build(ctx android.TopDownMutatorContext, a *AndroidApp) (bool, android.CommonAttributes, *bazelAndroidAppAttributes) { aapt, supported := a.convertAaptAttrsWithBp2Build(ctx) if !supported { - return + return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{} } certificate, certificateName := android.BazelStringOrLabelFromProp(ctx, a.overridableAppProperties.Certificate) @@ -1706,18 +1709,13 @@ func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { commonAttrs, bp2BuildInfo, supported := a.convertLibraryAttrsBp2Build(ctx) if !supported { - return + return false, android.CommonAttributes{}, &bazelAndroidAppAttributes{} } depLabels := bp2BuildInfo.DepLabels deps := depLabels.Deps deps.Append(depLabels.StaticDeps) - props := bazel.BazelTargetModuleProperties{ - Rule_class: "android_binary", - Bzl_load_location: "//build/bazel/rules/android:android_binary.bzl", - } - if !bp2BuildInfo.hasKotlin { appAttrs.javaCommonAttributes = commonAttrs appAttrs.bazelAapt = aapt @@ -1743,10 +1741,31 @@ func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { } } - ctx.CreateBazelTargetModule( - props, - android.CommonAttributes{Name: a.Name(), SkipData: proptools.BoolPtr(true)}, - appAttrs, - ) + return true, android.CommonAttributes{Name: a.Name(), SkipData: proptools.BoolPtr(true)}, appAttrs +} + +// ConvertWithBp2build is used to convert android_app to Bazel. +func (a *AndroidApp) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + if ok, commonAttrs, appAttrs := convertWithBp2build(ctx, a); ok { + props := bazel.BazelTargetModuleProperties{ + Rule_class: "android_binary", + Bzl_load_location: "//build/bazel/rules/android:android_binary.bzl", + } + + ctx.CreateBazelTargetModule(props, commonAttrs, appAttrs) + } + +} + +// ConvertWithBp2build is used to convert android_test to Bazel. +func (at *AndroidTest) ConvertWithBp2build(ctx android.TopDownMutatorContext) { + if ok, commonAttrs, appAttrs := convertWithBp2build(ctx, &at.AndroidApp); ok { + props := bazel.BazelTargetModuleProperties{ + Rule_class: "android_test", + Bzl_load_location: "//build/bazel/rules/android:android_test.bzl", + } + + ctx.CreateBazelTargetModule(props, commonAttrs, appAttrs) + } }