aboutsummaryrefslogtreecommitdiff
path: root/java/app_test.go
diff options
context:
space:
mode:
authormosimchah <mosimchah@gmail.com>2025-12-02 09:27:38 -0500
committermosimchah <mosimchah@gmail.com>2025-12-02 09:27:38 -0500
commitc7bade461dc55726f62997d13a48582f7c4b4655 (patch)
treeea0588da76060a2038f54f67efd046ca77634b10 /java/app_test.go
parent0f5414d19317805e8bbbe7c4db5f0fd78769bad5 (diff)
parent89d78cff8b00d3b20a90074635c3fe5a2ee49474 (diff)
Merge branch 'lineage-23.1' of https://github.com/LineageOS/android_build_soong into HEADw16.1
* 'lineage-23.1' of https://github.com/LineageOS/android_build_soong: (528 commits) Revert "install_symlink: Make symlink target configurable" Reapply "Clear as much of cc.Module as possible after GenerateBuildActions" Revert "rust: config: Fix missing CPU variant LD flags in Rust" Rename build-flag in outdir Revert^4 "cipd: Default CIPD proxy server to on, add opt-out" Convert check-vintf-all to phony with actions Create a partial implementation of check-vintf-all for soong-only Configure RBE rust pool based on build variant Revert^3 "Add sdk version check to arr" Add jdk.internal.invoke to the allowlist Make droid always depend on symbols zip Import Device and Odm skus Don't install gob_gen in Soong Remove bazel reference from run_integration_tests.sh Fix bootstrap_test.sh Don't panic in aconfig libraries when AllowMissingDependencies is set Avoid returning nil paths from PathForModuleSrc Revert "Flag controled clang version" Rework module target dependencies on required deps Revert^2 "Add sdk version check to arr" ... Change-Id: I6e9a63fa14fda917a42e426e5dcebbad7f67e1de
Diffstat (limited to 'java/app_test.go')
-rw-r--r--java/app_test.go192
1 files changed, 185 insertions, 7 deletions
diff --git a/java/app_test.go b/java/app_test.go
index a8b39b7d1..a33c6b10c 100644
--- a/java/app_test.go
+++ b/java/app_test.go
@@ -15,6 +15,8 @@
package java
import (
+ "encoding/json"
+ "errors"
"fmt"
"path/filepath"
"reflect"
@@ -3475,9 +3477,6 @@ func TestUsesLibraries(t *testing.T) {
prepareForJavaTest,
PrepareForTestWithJavaSdkLibraryFiles,
FixtureWithLastReleaseApis("runtime-library", "foo", "quuz", "qux", "bar", "fred"),
- android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
- variables.BuildWarningBadOptionalUsesLibsAllowlist = []string{"app", "prebuilt"}
- }),
).RunTestWithBp(t, bp)
app := result.ModuleForTests(t, "app", "android_common")
@@ -3532,6 +3531,178 @@ func TestUsesLibraries(t *testing.T) {
"--product-packages=out/soong/.intermediates/app/android_common/dexpreopt/app/product_packages.txt")
}
+func extractContextJson(cmd string) (map[string]interface{}, error) {
+ var clc map[string]interface{}
+ for _, flag := range strings.Split(cmd, " ") {
+ if value, match := strings.CutPrefix(flag, "--context-json='"); match {
+ value = strings.TrimSuffix(value, "'")
+ if err := json.Unmarshal([]byte(value), &clc); err != nil {
+ return nil, err
+ }
+ return clc, nil
+ }
+ }
+ return nil, errors.New("--context-json not found")
+}
+
+func TestClassLoaderContext_SdkLibrary(t *testing.T) {
+ bp := `
+ java_sdk_library {
+ name: "foo",
+ srcs: ["a.java"],
+ api_packages: ["foo"],
+ sdk_version: "current",
+ uses_libs: ["bar"],
+ }
+
+ java_sdk_library {
+ name: "bar",
+ srcs: ["b.java"],
+ api_packages: ["bar"],
+ sdk_version: "current",
+ }
+
+ android_app {
+ name: "app",
+ srcs: ["app.java"],
+ libs: ["foo.stubs"],
+ uses_libs: ["foo"],
+ sdk_version: "current",
+ }
+
+ android_app {
+ name: "app2",
+ srcs: ["app.java"],
+ libs: ["foo.impl"],
+ uses_libs: ["foo"],
+ sdk_version: "current",
+ }
+ `
+
+ result := android.GroupFixturePreparers(
+ prepareForJavaTest,
+ PrepareForTestWithJavaSdkLibraryFiles,
+ FixtureWithLastReleaseApis("foo", "bar"),
+ ).RunTestWithBp(t, bp)
+
+ {
+ fooXml := result.ModuleForTests(t, "foo.xml", "android_common").Output("foo.xml")
+ fooXmlContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooXml)
+ android.AssertStringDoesContain(t, "", fooXmlContents, `dependency="bar"`)
+ }
+
+ {
+ fooImpl := result.ModuleForTests(t, "foo.impl", "android_common")
+ cmd := fooImpl.Rule("dexpreopt").RuleParams.Command
+
+ clc, err := extractContextJson(cmd)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ deps := clc["any"].([]interface{})
+ android.AssertIntEquals(t, "", 1, len(deps))
+ bar := deps[0].(map[string]interface{})
+ android.AssertStringEquals(t, "", "bar", bar["Name"].(string))
+ }
+
+ for _, name := range []string{"app", "app2"} {
+ app := result.ModuleForTests(t, name, "android_common")
+ cmd := app.Rule("dexpreopt").RuleParams.Command
+
+ clc, err := extractContextJson(cmd)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ deps := clc["any"].([]interface{})
+ android.AssertIntEquals(t, "", 1, len(deps))
+ foo := deps[0].(map[string]interface{})
+ android.AssertStringEquals(t, "", "foo", foo["Name"].(string))
+ fooDeps := foo["Subcontexts"].([]interface{})
+ android.AssertIntEquals(t, "", 1, len(fooDeps))
+ bar := fooDeps[0].(map[string]interface{})
+ android.AssertStringEquals(t, "", "bar", bar["Name"].(string))
+ }
+}
+
+func TestClassLoaderContext_SdkLibrary2(t *testing.T) {
+ bp := `
+ java_sdk_library {
+ name: "foo",
+ srcs: ["a.java"],
+ api_packages: ["foo"],
+ sdk_version: "current",
+ libs: ["bar.impl"],
+ }
+
+ java_sdk_library {
+ name: "bar",
+ srcs: ["b.java"],
+ api_packages: ["bar"],
+ sdk_version: "current",
+ }
+
+ android_app {
+ name: "app",
+ srcs: ["app.java"],
+ libs: ["foo.stubs"],
+ uses_libs: ["foo"],
+ sdk_version: "current",
+ }
+ `
+
+ result := android.GroupFixturePreparers(
+ prepareForJavaTest,
+ PrepareForTestWithJavaSdkLibraryFiles,
+ FixtureWithLastReleaseApis("foo", "bar"),
+ ).RunTestWithBp(t, bp)
+
+ {
+ fooXml := result.ModuleForTests(t, "foo.xml", "android_common").Output("foo.xml")
+ fooXmlContents := android.ContentFromFileRuleForTests(t, result.TestContext, fooXml)
+ android.AssertStringDoesContain(t, "", fooXmlContents, `dependency="bar"`)
+ }
+
+ {
+ fooImpl := result.ModuleForTests(t, "foo.impl", "android_common")
+ cmd := fooImpl.Rule("dexpreopt").RuleParams.Command
+
+ clc, err := extractContextJson(cmd)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ deps := clc["any"].([]interface{})
+ android.AssertIntEquals(t, "", 1, len(deps))
+ bar := deps[0].(map[string]interface{})
+ android.AssertStringEquals(t, "", "bar", bar["Name"].(string))
+ }
+
+ {
+ app := result.ModuleForTests(t, "app", "android_common")
+ cmd := app.Rule("dexpreopt").RuleParams.Command
+
+ clc, err := extractContextJson(cmd)
+ if err != nil {
+ t.Error(err)
+ return
+ }
+
+ deps := clc["any"].([]interface{})
+ android.AssertIntEquals(t, "", 1, len(deps))
+ foo := deps[0].(map[string]interface{})
+ android.AssertStringEquals(t, "", "foo", foo["Name"].(string))
+ fooDeps := foo["Subcontexts"].([]interface{})
+ android.AssertIntEquals(t, "", 1, len(fooDeps))
+ bar := fooDeps[0].(map[string]interface{})
+ android.AssertStringEquals(t, "", "bar", bar["Name"].(string))
+ }
+}
+
func TestDexpreoptBcp(t *testing.T) {
t.Parallel()
bp := `
@@ -4578,7 +4749,7 @@ func TestAppFlagsPackages(t *testing.T) {
android.AssertStringDoesContain(t,
"aapt2 link command expected to pass feature flags arguments",
linkInFlags,
- "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
+ "--feature-flags @out/soong/.intermediates/bar/aconfig-flags.txt --feature-flags @out/soong/.intermediates/baz/aconfig-flags.txt",
)
aapt2CompileRule := foo.Rule("android/soong/java.aapt2Compile")
@@ -4586,7 +4757,7 @@ func TestAppFlagsPackages(t *testing.T) {
android.AssertStringDoesContain(t,
"aapt2 compile command expected to pass feature flags arguments",
compileFlags,
- "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
+ "--feature-flags @out/soong/.intermediates/bar/aconfig-flags.txt --feature-flags @out/soong/.intermediates/baz/aconfig-flags.txt",
)
}
@@ -4658,12 +4829,12 @@ func TestAppFlagsPackagesPropagation(t *testing.T) {
android.AssertStringDoesContain(t,
"aapt2 link command expected to pass feature flags arguments of flags_packages and that of its static libs",
linkInFlags,
- "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
+ "--feature-flags @out/soong/.intermediates/bar/aconfig-flags.txt --feature-flags @out/soong/.intermediates/baz/aconfig-flags.txt",
)
android.AssertStringDoesNotContain(t,
"aapt2 link command expected to not pass feature flags arguments of flags_packages of its libs",
linkInFlags,
- "--feature-flags @out/soong/.intermediates/foo/intermediate.txt",
+ "--feature-flags @out/soong/.intermediates/foo/aconfig-flags.txt",
)
}
@@ -4902,6 +5073,7 @@ func TestResourcesWithFlagDirectories(t *testing.T) {
"res/flag(!test.package.flag2)/values/bools.xml": nil,
"res/flag(test.package.flag1)/values-config/strings_google_services.xml": nil,
"res/flags(test.package.flag1)/values/strings.xml": nil,
+ "res/drawable/flag(test.package.flag1)/qs_flashlight_icon_off.xml": nil,
}),
).RunTestWithBp(t, `
android_library {
@@ -4940,6 +5112,12 @@ func TestResourcesWithFlagDirectories(t *testing.T) {
compileOutputPaths,
"out/soong/.intermediates/foo/android_common/aapt2/res/values_strings.(test.package.flag1).arsc.flat",
)
+ android.AssertStringListContains(
+ t,
+ "Expected to generate flag path when it is a subdirectory of resource type subdirectory",
+ compileOutputPaths,
+ "out/soong/.intermediates/foo/android_common/aapt2/res/drawable_qs_flashlight_icon_off.(test.package.flag1).xml.flat",
+ )
}
func TestAutogeneratedStaticRro(t *testing.T) {