aboutsummaryrefslogtreecommitdiff
path: root/java/app_test.go
diff options
context:
space:
mode:
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) {