diff options
Diffstat (limited to 'java/java_test.go')
| -rw-r--r-- | java/java_test.go | 257 |
1 files changed, 196 insertions, 61 deletions
diff --git a/java/java_test.go b/java/java_test.go index 50c40c38c..7f5198211 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -20,7 +20,6 @@ import ( "path/filepath" "reflect" "regexp" - "sort" "strconv" "strings" "testing" @@ -30,7 +29,6 @@ import ( "android/soong/android" "android/soong/cc" "android/soong/dexpreopt" - "android/soong/genrule" "android/soong/python" ) @@ -71,9 +69,9 @@ func testConfig(env map[string]string, bp string, fs map[string][]byte) android. return config } -func testContext() *android.TestContext { +func testContext(config android.Config) *android.TestContext { - ctx := android.NewTestArchContext() + ctx := android.NewTestArchContext(config) RegisterJavaBuildComponents(ctx) RegisterAppBuildComponents(ctx) RegisterAARBuildComponents(ctx) @@ -81,7 +79,6 @@ func testContext() *android.TestContext { RegisterSystemModulesBuildComponents(ctx) ctx.RegisterModuleType("java_plugin", PluginFactory) ctx.RegisterModuleType("filegroup", android.FileGroupFactory) - ctx.RegisterModuleType("genrule", genrule.GenRuleFactory) ctx.RegisterModuleType("python_binary_host", python.PythonBinaryHostFactory) RegisterDocsBuildComponents(ctx) RegisterStubsBuildComponents(ctx) @@ -103,6 +100,10 @@ func testContext() *android.TestContext { dexpreopt.RegisterToolModulesForTest(ctx) + ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { + ctx.TopDown("propagate_rro_enforcement", propagateRROEnforcementMutator).Parallel() + }) + return ctx } @@ -112,7 +113,7 @@ func run(t *testing.T, ctx *android.TestContext, config android.Config) { pathCtx := android.PathContextForTesting(config) dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx)) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Android.bp") android.FailIfErrored(t, errs) _, errs = ctx.PrepareBuildActions(config) @@ -126,12 +127,12 @@ func testJavaError(t *testing.T, pattern string, bp string) (*android.TestContex func testJavaErrorWithConfig(t *testing.T, pattern string, config android.Config) (*android.TestContext, android.Config) { t.Helper() - ctx := testContext() + ctx := testContext(config) pathCtx := android.PathContextForTesting(config) dexpreopt.SetTestGlobalConfig(config, dexpreopt.GlobalConfigForTests(pathCtx)) - ctx.Register(config) + ctx.Register() _, errs := ctx.ParseBlueprintsFiles("Android.bp") if len(errs) > 0 { android.FailIfNoMatchingErrors(t, pattern, errs) @@ -160,7 +161,7 @@ func testJava(t *testing.T, bp string) (*android.TestContext, android.Config) { func testJavaWithConfig(t *testing.T, config android.Config) (*android.TestContext, android.Config) { t.Helper() - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) return ctx, config @@ -457,6 +458,14 @@ func TestBinary(t *testing.T) { name: "bar", srcs: ["b.java"], static_libs: ["foo"], + jni_libs: ["libjni"], + } + + cc_library_shared { + name: "libjni", + host_supported: true, + device_supported: false, + stl: "none", } `) @@ -467,10 +476,17 @@ func TestBinary(t *testing.T) { barWrapper := ctx.ModuleForTests("bar", buildOS+"_x86_64") barWrapperDeps := barWrapper.Output("bar").Implicits.Strings() + libjni := ctx.ModuleForTests("libjni", buildOS+"_x86_64_shared") + libjniSO := libjni.Rule("Cp").Output.String() + // Test that the install binary wrapper depends on the installed jar file - if len(barWrapperDeps) != 1 || barWrapperDeps[0] != barJar { - t.Errorf("expected binary wrapper implicits [%q], got %v", - barJar, barWrapperDeps) + if g, w := barWrapperDeps, barJar; !android.InList(w, g) { + t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g) + } + + // Test that the install binary wrapper depends on the installed JNI libraries + if g, w := barWrapperDeps, libjniSO; !android.InList(w, g) { + t.Errorf("expected binary wrapper implicits to contain %q, got %q", w, g) } } @@ -526,6 +542,8 @@ func TestPrebuilts(t *testing.T) { java_import { name: "baz", jars: ["b.jar"], + sdk_version: "current", + compile_dex: true, } dex_import { @@ -556,8 +574,10 @@ func TestPrebuilts(t *testing.T) { fooModule := ctx.ModuleForTests("foo", "android_common") javac := fooModule.Rule("javac") combineJar := ctx.ModuleForTests("foo", "android_common").Description("for javac") - barJar := ctx.ModuleForTests("bar", "android_common").Rule("combineJar").Output - bazJar := ctx.ModuleForTests("baz", "android_common").Rule("combineJar").Output + barModule := ctx.ModuleForTests("bar", "android_common") + barJar := barModule.Rule("combineJar").Output + bazModule := ctx.ModuleForTests("baz", "android_common") + bazJar := bazModule.Rule("combineJar").Output sdklibStubsJar := ctx.ModuleForTests("sdklib.stubs", "android_common").Rule("combineJar").Output fooLibrary := fooModule.Module().(*Library) @@ -572,6 +592,11 @@ func TestPrebuilts(t *testing.T) { t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], barJar.String()) } + barDexJar := barModule.Module().(*Import).DexJarBuildPath() + if barDexJar != nil { + t.Errorf("bar dex jar build path expected to be nil, got %q", barDexJar) + } + if !strings.Contains(javac.Args["classpath"], sdklibStubsJar.String()) { t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], sdklibStubsJar.String()) } @@ -580,6 +605,12 @@ func TestPrebuilts(t *testing.T) { t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, bazJar.String()) } + bazDexJar := bazModule.Module().(*Import).DexJarBuildPath().String() + expectedDexJar := buildDir + "/.intermediates/baz/android_common/dex/baz.jar" + if bazDexJar != expectedDexJar { + t.Errorf("baz dex jar build path expected %q, got %q", expectedDexJar, bazDexJar) + } + ctx.ModuleForTests("qux", "android_common").Rule("Cp") } @@ -1083,16 +1114,26 @@ func TestDroiddoc(t *testing.T) { srcs: ["bar-doc/IBar.aidl"], path: "bar-doc", } - droiddoc { - name: "bar-doc", + droidstubs { + name: "bar-stubs", srcs: [ "bar-doc/a.java", - "bar-doc/IFoo.aidl", - ":bar-doc-aidl-srcs", ], exclude_srcs: [ "bar-doc/b.java" ], + api_levels_annotations_dirs: [ + "droiddoc-templates-sdk", + ], + api_levels_annotations_enabled: true, + } + droiddoc { + name: "bar-doc", + srcs: [ + ":bar-stubs", + "bar-doc/IFoo.aidl", + ":bar-doc-aidl-srcs", + ], custom_template: "droiddoc-templates-sdk", hdf: [ "android.whichdoc offline", @@ -1109,23 +1150,29 @@ func TestDroiddoc(t *testing.T) { "bar-doc/a.java": nil, "bar-doc/b.java": nil, }) - barDocModule := ctx.ModuleForTests("bar-doc", "android_common") - barDoc := barDocModule.Rule("javadoc") - notExpected := " -stubs " - if strings.Contains(barDoc.RuleParams.Command, notExpected) { - t.Errorf("bar-doc command contains flag %q to create stubs, but should not", notExpected) + barStubs := ctx.ModuleForTests("bar-stubs", "android_common") + barStubsOutputs, err := barStubs.Module().(*Droidstubs).OutputFiles("") + if err != nil { + t.Errorf("Unexpected error %q retrieving \"bar-stubs\" output file", err) + } + if len(barStubsOutputs) != 1 { + t.Errorf("Expected one output from \"bar-stubs\" got %s", barStubsOutputs) } - var javaSrcs []string - for _, i := range barDoc.Inputs { - javaSrcs = append(javaSrcs, i.Base()) + barStubsOutput := barStubsOutputs[0] + barDoc := ctx.ModuleForTests("bar-doc", "android_common") + javaDoc := barDoc.Rule("javadoc") + if g, w := javaDoc.Implicits.Strings(), barStubsOutput.String(); !inList(w, g) { + t.Errorf("implicits of bar-doc must contain %q, but was %q.", w, g) } - if len(javaSrcs) != 1 || javaSrcs[0] != "a.java" { - t.Errorf("inputs of bar-doc must be []string{\"a.java\"}, but was %#v.", javaSrcs) + + expected := "-sourcepath " + buildDir + "/.intermediates/bar-doc/android_common/srcjars " + if !strings.Contains(javaDoc.RuleParams.Command, expected) { + t.Errorf("bar-doc command does not contain flag %q, but should\n%q", expected, javaDoc.RuleParams.Command) } - aidl := barDocModule.Rule("aidl") - if g, w := barDoc.Implicits.Strings(), aidl.Output.String(); !inList(w, g) { + aidl := barDoc.Rule("aidl") + if g, w := javaDoc.Implicits.Strings(), aidl.Output.String(); !inList(w, g) { t.Errorf("implicits of bar-doc must contain %q, but was %q.", w, g) } @@ -1145,16 +1192,26 @@ func TestDroiddocArgsAndFlagsCausesError(t *testing.T) { srcs: ["bar-doc/IBar.aidl"], path: "bar-doc", } - droiddoc { - name: "bar-doc", + droidstubs { + name: "bar-stubs", srcs: [ "bar-doc/a.java", - "bar-doc/IFoo.aidl", - ":bar-doc-aidl-srcs", ], exclude_srcs: [ "bar-doc/b.java" ], + api_levels_annotations_dirs: [ + "droiddoc-templates-sdk", + ], + api_levels_annotations_enabled: true, + } + droiddoc { + name: "bar-doc", + srcs: [ + ":bar-stubs", + "bar-doc/IFoo.aidl", + ":bar-doc-aidl-srcs", + ], custom_template: "droiddoc-templates-sdk", hdf: [ "android.whichdoc offline", @@ -1173,31 +1230,24 @@ func TestDroiddocArgsAndFlagsCausesError(t *testing.T) { func TestDroidstubs(t *testing.T) { ctx, _ := testJavaWithFS(t, ` droiddoc_exported_dir { - name: "droiddoc-templates-sdk", - path: ".", + name: "droiddoc-templates-sdk", + path: ".", } droidstubs { - name: "bar-stubs", - srcs: [ - "bar-doc/a.java", - ], - api_levels_annotations_dirs: [ - "droiddoc-templates-sdk", - ], - api_levels_annotations_enabled: true, + name: "bar-stubs", + srcs: ["bar-doc/a.java"], + api_levels_annotations_dirs: ["droiddoc-templates-sdk"], + api_levels_annotations_enabled: true, } droidstubs { - name: "bar-stubs-other", - srcs: [ - "bar-doc/a.java", - ], - api_levels_annotations_dirs: [ - "droiddoc-templates-sdk", - ], - api_levels_annotations_enabled: true, - api_levels_jar_filename: "android.other.jar", + name: "bar-stubs-other", + srcs: ["bar-doc/a.java"], + high_mem: true, + api_levels_annotations_dirs: ["droiddoc-templates-sdk"], + api_levels_annotations_enabled: true, + api_levels_jar_filename: "android.other.jar", } `, map[string][]byte{ @@ -1206,23 +1256,31 @@ func TestDroidstubs(t *testing.T) { testcases := []struct { moduleName string expectedJarFilename string + high_mem bool }{ { moduleName: "bar-stubs", expectedJarFilename: "android.jar", + high_mem: false, }, { moduleName: "bar-stubs-other", expectedJarFilename: "android.other.jar", + high_mem: true, }, } for _, c := range testcases { m := ctx.ModuleForTests(c.moduleName, "android_common") metalava := m.Rule("metalava") + rp := metalava.RuleParams expected := "--android-jar-pattern ./%/public/" + c.expectedJarFilename - if actual := metalava.RuleParams.Command; !strings.Contains(actual, expected) { + if actual := rp.Command; !strings.Contains(actual, expected) { t.Errorf("For %q, expected metalava argument %q, but was not found %q", c.moduleName, expected, actual) } + + if actual := rp.Pool != nil && strings.Contains(rp.Pool.String(), "highmem"); actual != c.high_mem { + t.Errorf("Expected %q high_mem to be %v, was %v", c.moduleName, c.high_mem, actual) + } } } @@ -1372,9 +1430,33 @@ func TestJavaLibrary(t *testing.T) { name: "core", sdk_version: "none", system_modules: "none", - }`), + } + + filegroup { + name: "core-jar", + srcs: [":core{.jar}"], + } +`), + }) + ctx := testContext(config) + run(t, ctx, config) +} + +func TestJavaImport(t *testing.T) { + config := testConfig(nil, "", map[string][]byte{ + "libcore/Android.bp": []byte(` + java_import { + name: "core", + sdk_version: "none", + } + + filegroup { + name: "core-jar", + srcs: [":core{.jar}"], + } +`), }) - ctx := testContext() + ctx := testContext(config) run(t, ctx, config) } @@ -1447,6 +1529,12 @@ func TestJavaSdkLibrary(t *testing.T) { libs: ["foo"], sdk_version: "system_29", } + java_library { + name: "baz-module-30", + srcs: ["c.java"], + libs: ["foo"], + sdk_version: "module_30", + } `) // check the existence of the internal modules @@ -1493,17 +1581,56 @@ func TestJavaSdkLibrary(t *testing.T) { "prebuilts/sdk/29/system/foo.jar") } + bazModule30Javac := ctx.ModuleForTests("baz-module-30", "android_common").Rule("javac") + // tests if "baz-module-30" is actually linked to the module 30 stubs lib + if !strings.Contains(bazModule30Javac.Args["classpath"], "prebuilts/sdk/30/module-lib/foo.jar") { + t.Errorf("baz-module-30 javac classpath %v does not contain %q", bazModule30Javac.Args["classpath"], + "prebuilts/sdk/30/module-lib/foo.jar") + } + // test if baz has exported SDK lib names foo and bar to qux qux := ctx.ModuleForTests("qux", "android_common") if quxLib, ok := qux.Module().(*Library); ok { - sdkLibs := quxLib.ExportedSdkLibs() - sort.Strings(sdkLibs) - if w := []string{"bar", "foo", "fred", "quuz"}; !reflect.DeepEqual(w, sdkLibs) { + sdkLibs := quxLib.ExportedSdkLibs().UsesLibs() + if w := []string{"foo", "bar", "fred", "quuz"}; !reflect.DeepEqual(w, sdkLibs) { t.Errorf("qux should export %q but exports %q", w, sdkLibs) } } } +func TestJavaSdkLibrary_StubOrImplOnlyLibs(t *testing.T) { + ctx, _ := testJava(t, ` + java_sdk_library { + name: "sdk_lib", + srcs: ["a.java"], + impl_only_libs: ["foo"], + stub_only_libs: ["bar"], + } + java_library { + name: "foo", + srcs: ["a.java"], + sdk_version: "current", + } + java_library { + name: "bar", + srcs: ["a.java"], + sdk_version: "current", + } + `) + + for _, implName := range []string{"sdk_lib", "sdk_lib.impl"} { + implJavacCp := ctx.ModuleForTests(implName, "android_common").Rule("javac").Args["classpath"] + if !strings.Contains(implJavacCp, "/foo.jar") || strings.Contains(implJavacCp, "/bar.jar") { + t.Errorf("%v javac classpath %v does not contain foo and not bar", implName, implJavacCp) + } + } + stubName := apiScopePublic.stubsLibraryModuleName("sdk_lib") + stubsJavacCp := ctx.ModuleForTests(stubName, "android_common").Rule("javac").Args["classpath"] + if strings.Contains(stubsJavacCp, "/foo.jar") || !strings.Contains(stubsJavacCp, "/bar.jar") { + t.Errorf("stubs javac classpath %v does not contain bar and not foo", stubsJavacCp) + } +} + func TestJavaSdkLibrary_DoNotAccessImplWhenItIsNotBuilt(t *testing.T) { ctx, _ := testJava(t, ` java_sdk_library { @@ -1917,7 +2044,14 @@ func TestPatchModule(t *testing.T) { java_library { name: "baz", - srcs: ["c.java"], + srcs: [ + "c.java", + // Tests for b/150878007 + "dir/d.java", + "dir2/e.java", + "dir2/f.java", + "nested/dir/g.java" + ], patch_module: "java.base", } ` @@ -1926,7 +2060,8 @@ func TestPatchModule(t *testing.T) { checkPatchModuleFlag(t, ctx, "foo", "") expected := "java.base=.:" + buildDir checkPatchModuleFlag(t, ctx, "bar", expected) - expected = "java.base=" + strings.Join([]string{".", buildDir, moduleToPath("ext"), moduleToPath("framework")}, ":") + expected = "java.base=" + strings.Join([]string{ + ".", buildDir, "dir", "dir2", "nested", moduleToPath("ext"), moduleToPath("framework")}, ":") checkPatchModuleFlag(t, ctx, "baz", expected) }) } |
