diff --git a/android/allowlists/allowlists.go b/android/allowlists/allowlists.go index 9c657964c..a00ac98af 100644 --- a/android/allowlists/allowlists.go +++ b/android/allowlists/allowlists.go @@ -1690,6 +1690,9 @@ var ( "MtsTimeZoneDataTestCases", "NanoAndroidTest", "MtsLibnativehelperTestCases", + + // android_test_helper_app from allowlisted packages, but with unconverted deps + "SharedLibraryInfoTestApp", } // Bazel prod-mode allowlist. Modules in this list are built by Bazel diff --git a/bp2build/Android.bp b/bp2build/Android.bp index 755b7a34a..e30e53d86 100644 --- a/bp2build/Android.bp +++ b/bp2build/Android.bp @@ -44,6 +44,7 @@ bootstrap_go_package { "aidl_library_conversion_test.go", "android_app_certificate_conversion_test.go", "android_app_conversion_test.go", + "android_test_conversion_test.go", "apex_conversion_test.go", "apex_key_conversion_test.go", "build_conversion_test.go", diff --git a/bp2build/android_test_conversion_test.go b/bp2build/android_test_conversion_test.go new file mode 100644 index 000000000..52413fad5 --- /dev/null +++ b/bp2build/android_test_conversion_test.go @@ -0,0 +1,103 @@ +// Copyright 2023 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 ( + "android/soong/android" + "android/soong/java" + + "testing" +) + +func runAndroidTestTestCase(t *testing.T, tc Bp2buildTestCase) { + t.Helper() + RunBp2BuildTestCase(t, registerAndroidTestModuleTypes, tc) +} + +func registerAndroidTestModuleTypes(ctx android.RegistrationContext) { + ctx.RegisterModuleType("filegroup", android.FileGroupFactory) + ctx.RegisterModuleType("java_library", java.LibraryFactory) +} + +func TestMinimalAndroidTest(t *testing.T) { + runAndroidAppTestCase(t, Bp2buildTestCase{ + Description: "Android test - simple example", + ModuleTypeUnderTest: "android_test", + ModuleTypeUnderTestFactory: java.AndroidTestFactory, + Filesystem: map[string]string{ + "app.java": "", + "res/res.png": "", + "AndroidManifest.xml": "", + "assets/asset.png": "", + }, + Blueprint: ` +android_test { + name: "TestApp", + srcs: ["app.java"], + sdk_version: "current", + optimize: { + shrink: true, + optimize: true, + obfuscate: true, + }, +} +`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("android_test", "TestApp", AttrNameToString{ + "srcs": `["app.java"]`, + "manifest": `"AndroidManifest.xml"`, + "resource_files": `["res/res.png"]`, + "sdk_version": `"current"`, + "assets": `["assets/asset.png"]`, + "assets_dir": `"assets"`, + }), + }}) +} + +func TestMinimalAndroidTestHelperApp(t *testing.T) { + runAndroidAppTestCase(t, Bp2buildTestCase{ + Description: "Android test helper app - simple example", + ModuleTypeUnderTest: "android_test_helper_app", + ModuleTypeUnderTestFactory: java.AndroidTestHelperAppFactory, + Filesystem: map[string]string{ + "app.java": "", + "res/res.png": "", + "AndroidManifest.xml": "", + "assets/asset.png": "", + }, + Blueprint: ` +android_test_helper_app { + name: "TestApp", + srcs: ["app.java"], + sdk_version: "current", + optimize: { + shrink: true, + optimize: true, + obfuscate: true, + }, +} +`, + ExpectedBazelTargets: []string{ + MakeBazelTarget("android_binary", "TestApp", AttrNameToString{ + "srcs": `["app.java"]`, + "manifest": `"AndroidManifest.xml"`, + "resource_files": `["res/res.png"]`, + "sdk_version": `"current"`, + "assets": `["assets/asset.png"]`, + "assets_dir": `"assets"`, + "testonly": `True`, + }), + }}) +} diff --git a/java/app.go b/java/app.go index e55295030..3ab814ab2 100755 --- a/java/app.go +++ b/java/app.go @@ -1258,6 +1258,8 @@ type AndroidTestHelperApp struct { AndroidApp appTestHelperAppProperties appTestHelperAppProperties + + android.BazelModuleBase } func (a *AndroidTestHelperApp) InstallInTestcases() bool { @@ -1289,6 +1291,7 @@ func AndroidTestHelperAppFactory() android.Module { android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon) android.InitDefaultableModule(module) android.InitApexModule(module) + android.InitBazelModule(module) return module } @@ -1799,3 +1802,27 @@ func (at *AndroidTest) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { } } + +func (atha *AndroidTestHelperApp) ConvertWithBp2build(ctx android.Bp2buildMutatorContext) { + if ok, commonAttrs, appAttrs := convertWithBp2build(ctx, &atha.AndroidApp); ok { + // an android_test_helper_app is an android_binary with testonly = True + commonAttrs.Testonly = proptools.BoolPtr(true) + + // additionally, it sets default values differently to android_app, + // https://cs.android.com/android/platform/superproject/main/+/main:build/soong/java/app.go;l=1273-1279;drc=e12c083198403ec694af6c625aed11327eb2bf7f + // + // installable: true (settable prop) + // use_embedded_native_libs: true (settable prop) + // lint.test: true (settable prop) + // optimize EnabledByDefault: true (blueprint mutated prop) + // AlwaysPackageNativeLibs: true (blueprint mutated prop) + // dexpreopt isTest: true (not prop) + + props := bazel.BazelTargetModuleProperties{ + Rule_class: "android_binary", + Bzl_load_location: "//build/bazel/rules/android:android_binary.bzl", + } + + ctx.CreateBazelTargetModule(props, commonAttrs, appAttrs) + } +}