diff options
| -rw-r--r-- | android/androidmk.go | 8 | ||||
| -rw-r--r-- | apex/Android.bp | 1 | ||||
| -rw-r--r-- | apex/apex_test.go | 88 | ||||
| -rw-r--r-- | apex/testing.go | 22 | ||||
| -rw-r--r-- | cc/cc_test.go | 146 | ||||
| -rw-r--r-- | cc/prebuilt_test.go | 37 | ||||
| -rw-r--r-- | filesystem/bootimg.go | 10 | ||||
| -rw-r--r-- | filesystem/logical_partition.go | 10 | ||||
| -rw-r--r-- | java/lint.go | 10 | ||||
| -rw-r--r-- | java/system_modules_test.go | 10 | ||||
| -rw-r--r-- | rust/testing.go | 24 | ||||
| -rw-r--r-- | sdk/cc_sdk_test.go | 18 | ||||
| -rw-r--r-- | sdk/java_sdk_test.go | 3 | ||||
| -rw-r--r-- | sdk/testing.go | 154 |
14 files changed, 292 insertions, 249 deletions
diff --git a/android/androidmk.go b/android/androidmk.go index 32d771200..93175670f 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -44,6 +44,14 @@ func RegisterAndroidMkBuildComponents(ctx RegistrationContext) { ctx.RegisterSingletonType("androidmk", AndroidMkSingleton) } +// Enable androidmk support. +// * Register the singleton +// * Configure that we are inside make +var PrepareForTestWithAndroidMk = GroupFixturePreparers( + FixtureRegisterWithContext(RegisterAndroidMkBuildComponents), + FixtureModifyConfig(SetKatiEnabledForTests), +) + // Deprecated: Use AndroidMkEntriesProvider instead, especially if you're not going to use the // Custom function. It's easier to use and test. type AndroidMkDataProvider interface { diff --git a/apex/Android.bp b/apex/Android.bp index 8a2edebdb..1890b89c3 100644 --- a/apex/Android.bp +++ b/apex/Android.bp @@ -25,6 +25,7 @@ bootstrap_go_package { "deapexer.go", "key.go", "prebuilt.go", + "testing.go", "vndk.go", ], testSrcs: [ diff --git a/apex/apex_test.go b/apex/apex_test.go index 08f54f724..3fde14458 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -127,6 +127,94 @@ func withUnbundledBuild(_ map[string][]byte, config android.Config) { config.TestProductVariables.Unbundled_build = proptools.BoolPtr(true) } +var apexFixtureFactory = android.NewFixtureFactory( + &buildDir, + // General preparers in alphabetical order as test infrastructure will enforce correct + // registration order. + android.PrepareForTestWithAndroidBuildComponents, + bpf.PrepareForTestWithBpf, + cc.PrepareForTestWithCcBuildComponents, + java.PrepareForTestWithJavaDefaultModules, + prebuilt_etc.PrepareForTestWithPrebuiltEtc, + rust.PrepareForTestWithRustDefaultModules, + sh.PrepareForTestWithShBuildComponents, + + PrepareForTestWithApexBuildComponents, + + // Additional apex test specific preparers. + android.FixtureAddTextFile("system/sepolicy/Android.bp", ` + filegroup { + name: "myapex-file_contexts", + srcs: [ + "apex/myapex-file_contexts", + ], + } + `), + android.FixtureMergeMockFs(android.MockFS{ + "a.java": nil, + "PrebuiltAppFoo.apk": nil, + "PrebuiltAppFooPriv.apk": nil, + "build/make/target/product/security": nil, + "apex_manifest.json": nil, + "AndroidManifest.xml": nil, + "system/sepolicy/apex/myapex-file_contexts": nil, + "system/sepolicy/apex/myapex.updatable-file_contexts": nil, + "system/sepolicy/apex/myapex2-file_contexts": nil, + "system/sepolicy/apex/otherapex-file_contexts": nil, + "system/sepolicy/apex/com.android.vndk-file_contexts": nil, + "system/sepolicy/apex/com.android.vndk.current-file_contexts": nil, + "mylib.cpp": nil, + "mytest.cpp": nil, + "mytest1.cpp": nil, + "mytest2.cpp": nil, + "mytest3.cpp": nil, + "myprebuilt": nil, + "my_include": nil, + "foo/bar/MyClass.java": nil, + "prebuilt.jar": nil, + "prebuilt.so": nil, + "vendor/foo/devkeys/test.x509.pem": nil, + "vendor/foo/devkeys/test.pk8": nil, + "testkey.x509.pem": nil, + "testkey.pk8": nil, + "testkey.override.x509.pem": nil, + "testkey.override.pk8": nil, + "vendor/foo/devkeys/testkey.avbpubkey": nil, + "vendor/foo/devkeys/testkey.pem": nil, + "NOTICE": nil, + "custom_notice": nil, + "custom_notice_for_static_lib": nil, + "testkey2.avbpubkey": nil, + "testkey2.pem": nil, + "myapex-arm64.apex": nil, + "myapex-arm.apex": nil, + "myapex.apks": nil, + "frameworks/base/api/current.txt": nil, + "framework/aidl/a.aidl": nil, + "build/make/core/proguard.flags": nil, + "build/make/core/proguard_basic_keeps.flags": nil, + "dummy.txt": nil, + "baz": nil, + "bar/baz": nil, + "testdata/baz": nil, + "AppSet.apks": nil, + "foo.rs": nil, + "libfoo.jar": nil, + "libbar.jar": nil, + }, + ), + + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.DeviceVndkVersion = proptools.StringPtr("current") + variables.DefaultAppCertificate = proptools.StringPtr("vendor/foo/devkeys/test") + variables.CertificateOverrides = []string{"myapex_keytest:myapex.certificate.override"} + variables.Platform_sdk_codename = proptools.StringPtr("Q") + variables.Platform_sdk_final = proptools.BoolPtr(false) + variables.Platform_version_active_codenames = []string{"Q"} + variables.Platform_vndk_version = proptools.StringPtr("VER") + }), +) + func testApexContext(_ *testing.T, bp string, handlers ...testCustomizer) (*android.TestContext, android.Config) { bp = bp + ` filegroup { diff --git a/apex/testing.go b/apex/testing.go new file mode 100644 index 000000000..e662cade3 --- /dev/null +++ b/apex/testing.go @@ -0,0 +1,22 @@ +// Copyright 2021 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 apex + +import "android/soong/android" + +var PrepareForTestWithApexBuildComponents = android.GroupFixturePreparers( + android.FixtureRegisterWithContext(registerApexBuildComponents), + android.FixtureRegisterWithContext(registerApexKeyBuildComponents), +) diff --git a/cc/cc_test.go b/cc/cc_test.go index cc1f7d082..7d9fa477b 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -55,7 +55,6 @@ func TestMain(m *testing.M) { var ccFixtureFactory = android.NewFixtureFactory( &buildDir, PrepareForTestWithCcIncludeVndk, - android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { variables.DeviceVndkVersion = StringPtr("current") variables.ProductVndkVersion = StringPtr("current") @@ -3421,24 +3420,16 @@ func TestProductVariableDefaults(t *testing.T) { } ` - config := TestConfig(buildDir, android.Android, nil, bp, nil) - config.TestProductVariables.Debuggable = BoolPtr(true) - - ctx := CreateTestContext(config) - ctx.PreDepsMutators(func(ctx android.RegisterMutatorsContext) { - ctx.BottomUp("variable", android.VariableMutator).Parallel() - }) - ctx.Register() + result := ccFixtureFactory.Extend( + android.PrepareForTestWithVariables, - _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) - android.FailIfErrored(t, errs) - _, errs = ctx.PrepareBuildActions(config) - android.FailIfErrored(t, errs) + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.Debuggable = BoolPtr(true) + }), + ).RunTestWithBp(t, bp) - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Module().(*Module) - if !android.InList("-DBAR", libfoo.flags.Local.CppFlags) { - t.Errorf("expected -DBAR in cppflags, got %q", libfoo.flags.Local.CppFlags) - } + libfoo := result.Module("libfoo", "android_arm64_armv8-a_static").(*Module) + result.AssertStringListContains("cppflags", libfoo.flags.Local.CppFlags, "-DBAR") } func TestEmptyWholeStaticLibsAllowMissingDependencies(t *testing.T) { @@ -3456,32 +3447,17 @@ func TestEmptyWholeStaticLibsAllowMissingDependencies(t *testing.T) { } ` - config := TestConfig(buildDir, android.Android, nil, bp, nil) - config.TestProductVariables.Allow_missing_dependencies = BoolPtr(true) - - ctx := CreateTestContext(config) - ctx.SetAllowMissingDependencies(true) - ctx.Register() - - _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) - android.FailIfErrored(t, errs) - _, errs = ctx.PrepareBuildActions(config) - android.FailIfErrored(t, errs) - - libbar := ctx.ModuleForTests("libbar", "android_arm64_armv8-a_static").Output("libbar.a") - if g, w := libbar.Rule, android.ErrorRule; g != w { - t.Fatalf("Expected libbar rule to be %q, got %q", w, g) - } + result := ccFixtureFactory.Extend( + android.PrepareForTestWithAllowMissingDependencies, + ).RunTestWithBp(t, bp) - if g, w := libbar.Args["error"], "missing dependencies: libmissing"; !strings.Contains(g, w) { - t.Errorf("Expected libbar error to contain %q, was %q", w, g) - } + libbar := result.ModuleForTests("libbar", "android_arm64_armv8-a_static").Output("libbar.a") + result.AssertDeepEquals("libbar rule", android.ErrorRule, libbar.Rule) - libfoo := ctx.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Output("libfoo.a") - if g, w := libfoo.Inputs.Strings(), libbar.Output.String(); !android.InList(w, g) { - t.Errorf("Expected libfoo.a to depend on %q, got %q", w, g) - } + result.AssertStringDoesContain("libbar error", libbar.Args["error"], "missing dependencies: libmissing") + libfoo := result.ModuleForTests("libfoo", "android_arm64_armv8-a_static").Output("libfoo.a") + result.AssertStringListContains("libfoo.a dependencies", libfoo.Inputs.Strings(), libbar.Output.String()) } func TestInstallSharedLibs(t *testing.T) { @@ -3671,8 +3647,9 @@ func checkHasMemtagNote(t *testing.T, m android.TestingModule, expected MemtagNo } } -func makeMemtagTestConfig(t *testing.T) android.Config { - templateBp := ` +var prepareForTestWithMemtagHeap = android.GroupFixturePreparers( + android.FixtureModifyMockFS(func(fs android.MockFS) { + templateBp := ` cc_test { name: "%[1]s_test", gtest: false, @@ -3726,35 +3703,30 @@ func makeMemtagTestConfig(t *testing.T) android.Config { sanitize: { memtag_heap: true, diag: { memtag_heap: true } }, } ` - subdirDefaultBp := fmt.Sprintf(templateBp, "default") - subdirExcludeBp := fmt.Sprintf(templateBp, "exclude") - subdirSyncBp := fmt.Sprintf(templateBp, "sync") - subdirAsyncBp := fmt.Sprintf(templateBp, "async") - - mockFS := map[string][]byte{ - "subdir_default/Android.bp": []byte(subdirDefaultBp), - "subdir_exclude/Android.bp": []byte(subdirExcludeBp), - "subdir_sync/Android.bp": []byte(subdirSyncBp), - "subdir_async/Android.bp": []byte(subdirAsyncBp), - } - - return TestConfig(buildDir, android.Android, nil, "", mockFS) -} + subdirDefaultBp := fmt.Sprintf(templateBp, "default") + subdirExcludeBp := fmt.Sprintf(templateBp, "exclude") + subdirSyncBp := fmt.Sprintf(templateBp, "sync") + subdirAsyncBp := fmt.Sprintf(templateBp, "async") + + fs.Merge(android.MockFS{ + "subdir_default/Android.bp": []byte(subdirDefaultBp), + "subdir_exclude/Android.bp": []byte(subdirExcludeBp), + "subdir_sync/Android.bp": []byte(subdirSyncBp), + "subdir_async/Android.bp": []byte(subdirAsyncBp), + }) + }), + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.MemtagHeapExcludePaths = []string{"subdir_exclude"} + variables.MemtagHeapSyncIncludePaths = []string{"subdir_sync"} + variables.MemtagHeapAsyncIncludePaths = []string{"subdir_async"} + }), +) func TestSanitizeMemtagHeap(t *testing.T) { variant := "android_arm64_armv8-a" - config := makeMemtagTestConfig(t) - config.TestProductVariables.MemtagHeapExcludePaths = []string{"subdir_exclude"} - config.TestProductVariables.MemtagHeapSyncIncludePaths = []string{"subdir_sync"} - config.TestProductVariables.MemtagHeapAsyncIncludePaths = []string{"subdir_async"} - ctx := CreateTestContext(config) - ctx.Register() - - _, errs := ctx.ParseFileList(".", []string{"Android.bp", "subdir_default/Android.bp", "subdir_exclude/Android.bp", "subdir_sync/Android.bp", "subdir_async/Android.bp"}) - android.FailIfErrored(t, errs) - _, errs = ctx.PrepareBuildActions(config) - android.FailIfErrored(t, errs) + result := ccFixtureFactory.Extend(prepareForTestWithMemtagHeap).RunTest(t) + ctx := result.TestContext checkHasMemtagNote(t, ctx.ModuleForTests("default_test", variant), Sync) checkHasMemtagNote(t, ctx.ModuleForTests("default_test_false", variant), None) @@ -3808,18 +3780,13 @@ func TestSanitizeMemtagHeap(t *testing.T) { func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) { variant := "android_arm64_armv8-a" - config := makeMemtagTestConfig(t) - config.TestProductVariables.MemtagHeapExcludePaths = []string{"subdir_exclude"} - config.TestProductVariables.MemtagHeapSyncIncludePaths = []string{"subdir_sync"} - config.TestProductVariables.MemtagHeapAsyncIncludePaths = []string{"subdir_async"} - config.TestProductVariables.SanitizeDevice = []string{"memtag_heap"} - ctx := CreateTestContext(config) - ctx.Register() - - _, errs := ctx.ParseFileList(".", []string{"Android.bp", "subdir_default/Android.bp", "subdir_exclude/Android.bp", "subdir_sync/Android.bp", "subdir_async/Android.bp"}) - android.FailIfErrored(t, errs) - _, errs = ctx.PrepareBuildActions(config) - android.FailIfErrored(t, errs) + result := ccFixtureFactory.Extend( + prepareForTestWithMemtagHeap, + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.SanitizeDevice = []string{"memtag_heap"} + }), + ).RunTest(t) + ctx := result.TestContext checkHasMemtagNote(t, ctx.ModuleForTests("default_test", variant), Sync) checkHasMemtagNote(t, ctx.ModuleForTests("default_test_false", variant), None) @@ -3873,19 +3840,14 @@ func TestSanitizeMemtagHeapWithSanitizeDevice(t *testing.T) { func TestSanitizeMemtagHeapWithSanitizeDeviceDiag(t *testing.T) { variant := "android_arm64_armv8-a" - config := makeMemtagTestConfig(t) - config.TestProductVariables.MemtagHeapExcludePaths = []string{"subdir_exclude"} - config.TestProductVariables.MemtagHeapSyncIncludePaths = []string{"subdir_sync"} - config.TestProductVariables.MemtagHeapAsyncIncludePaths = []string{"subdir_async"} - config.TestProductVariables.SanitizeDevice = []string{"memtag_heap"} - config.TestProductVariables.SanitizeDeviceDiag = []string{"memtag_heap"} - ctx := CreateTestContext(config) - ctx.Register() - - _, errs := ctx.ParseFileList(".", []string{"Android.bp", "subdir_default/Android.bp", "subdir_exclude/Android.bp", "subdir_sync/Android.bp", "subdir_async/Android.bp"}) - android.FailIfErrored(t, errs) - _, errs = ctx.PrepareBuildActions(config) - android.FailIfErrored(t, errs) + result := ccFixtureFactory.Extend( + prepareForTestWithMemtagHeap, + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.SanitizeDevice = []string{"memtag_heap"} + variables.SanitizeDeviceDiag = []string{"memtag_heap"} + }), + ).RunTest(t) + ctx := result.TestContext checkHasMemtagNote(t, ctx.ModuleForTests("default_test", variant), Sync) checkHasMemtagNote(t, ctx.ModuleForTests("default_test_false", variant), None) diff --git a/cc/prebuilt_test.go b/cc/prebuilt_test.go index ee4de6ee8..20274b2ba 100644 --- a/cc/prebuilt_test.go +++ b/cc/prebuilt_test.go @@ -23,27 +23,16 @@ import ( "github.com/google/blueprint" ) -func testPrebuilt(t *testing.T, bp string, fs map[string][]byte, handlers ...configCustomizer) *android.TestContext { - config := TestConfig(buildDir, android.Android, nil, bp, fs) - ctx := CreateTestContext(config) - - // Enable androidmk support. - // * Register the singleton - // * Configure that we are inside make - // * Add CommonOS to ensure that androidmk processing works. - android.RegisterAndroidMkBuildComponents(ctx) - android.SetKatiEnabledForTests(config) - - for _, handler := range handlers { - handler(config) - } +var prebuiltFixtureFactory = ccFixtureFactory.Extend( + android.PrepareForTestWithAndroidMk, +) - ctx.Register() - _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) - android.FailIfErrored(t, errs) - _, errs = ctx.PrepareBuildActions(config) - android.FailIfErrored(t, errs) - return ctx +func testPrebuilt(t *testing.T, bp string, fs android.MockFS, handlers ...android.FixturePreparer) *android.TestContext { + result := prebuiltFixtureFactory.Extend( + fs.AddToFixture(), + ).Extend(handlers...).RunTestWithBp(t, bp) + + return result.TestContext } type configCustomizer func(config android.Config) @@ -370,9 +359,11 @@ func TestPrebuiltLibrarySanitized(t *testing.T) { assertString(t, static2.OutputFile().Path().Base(), "libf.a") // With SANITIZE_TARGET=hwaddress - ctx = testPrebuilt(t, bp, fs, func(config android.Config) { - config.TestProductVariables.SanitizeDevice = []string{"hwaddress"} - }) + ctx = testPrebuilt(t, bp, fs, + android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { + variables.SanitizeDevice = []string{"hwaddress"} + }), + ) shared_rule = ctx.ModuleForTests("libtest", "android_arm64_armv8-a_shared_hwasan").Rule("android/soong/cc.strip") assertString(t, shared_rule.Input.String(), "hwasan/libf.so") diff --git a/filesystem/bootimg.go b/filesystem/bootimg.go index 764f0452b..8e2c55482 100644 --- a/filesystem/bootimg.go +++ b/filesystem/bootimg.go @@ -237,3 +237,13 @@ var _ Filesystem = (*bootimg)(nil) func (b *bootimg) OutputPath() android.Path { return b.output } + +var _ android.OutputFileProducer = (*bootimg)(nil) + +// Implements android.OutputFileProducer +func (b *bootimg) OutputFiles(tag string) (android.Paths, error) { + if tag == "" { + return []android.Path{b.output}, nil + } + return nil, fmt.Errorf("unsupported module reference tag %q", tag) +} diff --git a/filesystem/logical_partition.go b/filesystem/logical_partition.go index e547203bc..16b6037cf 100644 --- a/filesystem/logical_partition.go +++ b/filesystem/logical_partition.go @@ -208,3 +208,13 @@ var _ Filesystem = (*logicalPartition)(nil) func (l *logicalPartition) OutputPath() android.Path { return l.output } + +var _ android.OutputFileProducer = (*logicalPartition)(nil) + +// Implements android.OutputFileProducer +func (l *logicalPartition) OutputFiles(tag string) (android.Paths, error) { + if tag == "" { + return []android.Path{l.output}, nil + } + return nil, fmt.Errorf("unsupported module reference tag %q", tag) +} diff --git a/java/lint.go b/java/lint.go index 5940eac61..9f677db3a 100644 --- a/java/lint.go +++ b/java/lint.go @@ -189,6 +189,10 @@ type lintPaths struct { remoteRSPInputs android.Paths } +func lintRBEExecStrategy(ctx android.ModuleContext) string { + return ctx.Config().GetenvWithDefault("RBE_LINT_EXEC_STRATEGY", remoteexec.LocalExecStrategy) +} + func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.RuleBuilder) lintPaths { var deps android.Paths var remoteInputs android.Paths @@ -280,7 +284,8 @@ func (l *linter) writeLintProjectXML(ctx android.ModuleContext, rule *android.Ru cmd.FlagForEachArg("--extra_checks_jar ", l.extraLintCheckJars.Strings()) trackInputDependency(l.extraLintCheckJars...) - if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_LINT") { + if ctx.Config().UseRBE() && ctx.Config().IsEnvTrue("RBE_LINT") && + lintRBEExecStrategy(ctx) != remoteexec.LocalExecStrategy { // TODO(b/181912787): remove these and use "." instead. cmd.FlagWithArg("--root_dir ", "/b/f/w") } else { @@ -391,7 +396,7 @@ func (l *linter) lint(ctx android.ModuleContext) { pool := ctx.Config().GetenvWithDefault("RBE_LINT_POOL", "java16") // TODO(b/181912787): this should be local fallback once the hack that passes /b/f/w in project.xml // is removed. - execStrategy := ctx.Config().GetenvWithDefault("RBE_LINT_EXEC_STRATEGY", remoteexec.RemoteExecStrategy) + execStrategy := lintRBEExecStrategy(ctx) labels := map[string]string{"type": "tool", "name": "lint"} rule.Remoteable(android.RemoteRuleSupports{RBE: true}) remoteInputs := lintPaths.remoteInputs @@ -417,6 +422,7 @@ func (l *linter) lint(ctx android.ModuleContext) { "ANDROID_SDK_HOME", "SDK_ANNOTATIONS", "LINT_OPTS", + "LANG", }, Platform: map[string]string{remoteexec.PoolKey: pool}, }).NoVarTemplate(ctx.Config())) diff --git a/java/system_modules_test.go b/java/system_modules_test.go index 44049ee6b..abcd186f1 100644 --- a/java/system_modules_test.go +++ b/java/system_modules_test.go @@ -20,7 +20,7 @@ import ( "android/soong/android" ) -func normalizedPathsToHeaderJars(result *android.TestResult, moduleNames ...string) []string { +func getModuleHeaderJarsAsNormalizedPaths(result *android.TestResult, moduleNames ...string) []string { paths := []string{} for _, moduleName := range moduleNames { module := result.Module(moduleName, "android_common") @@ -57,7 +57,7 @@ func TestJavaSystemModules(t *testing.T) { sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs // The expected paths are the header jars from the source input modules. - expectedSourcePaths := normalizedPathsToHeaderJars(result, "system-module1", "system-module2") + expectedSourcePaths := getModuleHeaderJarsAsNormalizedPaths(result, "system-module1", "system-module2") result.AssertArrayString("source system modules inputs", expectedSourcePaths, result.NormalizePathsForTesting(sourceInputs)) } @@ -84,7 +84,7 @@ func TestJavaSystemModulesImport(t *testing.T) { prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs // The expected paths are the header jars from the renamed prebuilt input modules. - expectedPrebuiltPaths := normalizedPathsToHeaderJars(result, "system-module1", "system-module2") + expectedPrebuiltPaths := getModuleHeaderJarsAsNormalizedPaths(result, "system-module1", "system-module2") result.AssertArrayString("renamed prebuilt system modules inputs", expectedPrebuiltPaths, result.NormalizePathsForTesting(prebuiltInputs)) } @@ -99,7 +99,7 @@ func TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) { sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs // The expected paths are the header jars from the source input modules. - expectedSourcePaths := normalizedPathsToHeaderJars(result, "system-module1", "system-module2") + expectedSourcePaths := getModuleHeaderJarsAsNormalizedPaths(result, "system-module1", "system-module2") result.AssertArrayString("source system modules inputs", expectedSourcePaths, result.NormalizePathsForTesting(sourceInputs)) // check the existence of the renamed prebuilt module @@ -107,6 +107,6 @@ func TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) { prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs // The expected paths are the header jars from the renamed prebuilt input modules. - expectedPrebuiltPaths := normalizedPathsToHeaderJars(result, "prebuilt_system-module1", "prebuilt_system-module2") + expectedPrebuiltPaths := getModuleHeaderJarsAsNormalizedPaths(result, "prebuilt_system-module1", "prebuilt_system-module2") result.AssertArrayString("prebuilt system modules inputs", expectedPrebuiltPaths, result.NormalizePathsForTesting(prebuiltInputs)) } diff --git a/rust/testing.go b/rust/testing.go index 9534ab580..5be71c90e 100644 --- a/rust/testing.go +++ b/rust/testing.go @@ -20,6 +20,30 @@ import ( "android/soong/genrule" ) +// Preparer that will define all cc module types and a limited set of mutators and singletons that +// make those module types usable. +var PrepareForTestWithRustBuildComponents = android.GroupFixturePreparers( + android.FixtureRegisterWithContext(RegisterRequiredBuildComponentsForTest), +) + +// The directory in which rust test default modules will be defined. +// +// Placing them here ensures that their location does not conflict with default test modules +// defined by other packages. +const rustDefaultsDir = "defaults/rust/" + +// Preparer that will define default rust modules, e.g. standard prebuilt modules. +var PrepareForTestWithRustDefaultModules = android.GroupFixturePreparers( + cc.PrepareForTestWithCcDefaultModules, + PrepareForTestWithRustBuildComponents, + android.FixtureAddTextFile(rustDefaultsDir+"Android.bp", GatherRequiredDepsForTest()), +) + +// Preparer that will allow use of all rust modules fully. +var PrepareForIntegrationTestWithRust = android.GroupFixturePreparers( + PrepareForTestWithRustDefaultModules, +) + func GatherRequiredDepsForTest() string { bp := ` rust_prebuilt_library { diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index 6da135a32..28c9e9e28 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -21,7 +21,7 @@ import ( "android/soong/cc" ) -var ccTestFs = map[string][]byte{ +var ccTestFs = android.MockFS{ "Test.cpp": nil, "myinclude/Test.h": nil, "myinclude-android/AndroidTest.h": nil, @@ -32,7 +32,7 @@ var ccTestFs = map[string][]byte{ "some/where/stubslib.map.txt": nil, } -func testSdkWithCc(t *testing.T, bp string) *testSdkResult { +func testSdkWithCc(t *testing.T, bp string) *android.TestResult { t.Helper() return testSdkWithFs(t, bp, ccTestFs) } @@ -808,7 +808,15 @@ module_exports_snapshot { } func TestSnapshotWithSingleHostOsType(t *testing.T) { - ctx, config := testSdkContext(` + result := sdkFixtureFactory.Extend( + ccTestFs.AddToFixture(), + cc.PrepareForTestOnLinuxBionic, + android.FixtureModifyConfig(func(config android.Config) { + config.Targets[android.LinuxBionic] = []android.Target{ + {android.LinuxBionic, android.Arch{ArchType: android.X86_64}, android.NativeBridgeDisabled, "", "", false}, + } + }), + ).RunTestWithBp(t, ` cc_defaults { name: "mydefaults", device_supported: false, @@ -849,9 +857,7 @@ func TestSnapshotWithSingleHostOsType(t *testing.T) { ], stl: "none", } - `, ccTestFs, []android.OsType{android.LinuxBionic}) - - result := runTests(t, ctx, config) + `) CheckSnapshot(result, "myexports", "", checkUnversionedAndroidBpContents(` diff --git a/sdk/java_sdk_test.go b/sdk/java_sdk_test.go index ef8e4a00d..40f276919 100644 --- a/sdk/java_sdk_test.go +++ b/sdk/java_sdk_test.go @@ -17,10 +17,11 @@ package sdk import ( "testing" + "android/soong/android" "android/soong/java" ) -func testSdkWithJava(t *testing.T, bp string) *testSdkResult { +func testSdkWithJava(t *testing.T, bp string) *android.TestResult { t.Helper() fs := map[string][]byte{ diff --git a/sdk/testing.go b/sdk/testing.go index fac2f8e8a..41280fc5c 100644 --- a/sdk/testing.go +++ b/sdk/testing.go @@ -29,10 +29,15 @@ import ( "android/soong/java" ) -func testSdkContext(bp string, fs map[string][]byte, extraOsTypes []android.OsType) (*android.TestContext, android.Config) { - extraOsTypes = append(extraOsTypes, android.Android, android.Windows) - - bp = bp + ` +var sdkFixtureFactory = android.NewFixtureFactory( + &buildDir, + apex.PrepareForTestWithApexBuildComponents, + cc.PrepareForTestWithCcDefaultModules, + genrule.PrepareForTestWithGenRuleBuildComponents, + java.PrepareForTestWithJavaBuildComponents, + PrepareForTestWithSdkBuildComponents, + + android.FixtureAddTextFile("sdk/tests/Android.bp", ` apex_key { name: "myapex.key", public_key: "myapex.avbpubkey", @@ -43,9 +48,9 @@ func testSdkContext(bp string, fs map[string][]byte, extraOsTypes []android.OsTy name: "myapex.cert", certificate: "myapex", } - ` + cc.GatherRequiredDepsForTest(extraOsTypes...) + `), - mockFS := map[string][]byte{ + android.FixtureMergeMockFs(map[string][]byte{ "build/make/target/product/security": nil, "apex_manifest.json": nil, "system/sepolicy/apex/myapex-file_contexts": nil, @@ -55,113 +60,33 @@ func testSdkContext(bp string, fs map[string][]byte, extraOsTypes []android.OsTy "myapex.pem": nil, "myapex.x509.pem": nil, "myapex.pk8": nil, - } - - cc.GatherRequiredFilesForTest(mockFS) - - for k, v := range fs { - mockFS[k] = v - } - - config := android.TestArchConfig(buildDir, nil, bp, mockFS) - - // Add windows as a default disable OS to test behavior when some OS variants - // are disabled. - config.Targets[android.Windows] = []android.Target{ - {android.Windows, android.Arch{ArchType: android.X86_64}, android.NativeBridgeDisabled, "", "", true}, - } - - for _, extraOsType := range extraOsTypes { - switch extraOsType { - case android.LinuxBionic: - config.Targets[android.LinuxBionic] = []android.Target{ - {android.LinuxBionic, android.Arch{ArchType: android.X86_64}, android.NativeBridgeDisabled, "", "", false}, - } + }), + + cc.PrepareForTestOnWindows, + android.FixtureModifyConfig(func(config android.Config) { + // Add windows as a default disable OS to test behavior when some OS variants + // are disabled. + config.Targets[android.Windows] = []android.Target{ + {android.Windows, android.Arch{ArchType: android.X86_64}, android.NativeBridgeDisabled, "", "", true}, } - } - - ctx := android.NewTestArchContext(config) - - // Enable androidmk support. - // * Register the singleton - // * Configure that we are inside make - // * Add CommonOS to ensure that androidmk processing works. - android.RegisterAndroidMkBuildComponents(ctx) - android.SetKatiEnabledForTests(config) - config.Targets[android.CommonOS] = []android.Target{ - {android.CommonOS, android.Arch{ArchType: android.Common}, android.NativeBridgeDisabled, "", "", true}, - } - - // from android package - android.RegisterPackageBuildComponents(ctx) - ctx.RegisterModuleType("filegroup", android.FileGroupFactory) - ctx.PreArchMutators(android.RegisterVisibilityRuleChecker) - ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators) - ctx.PreArchMutators(android.RegisterComponentsMutator) - - android.RegisterPrebuiltMutators(ctx) - - // Register these after the prebuilt mutators have been registered to match what - // happens at runtime. - ctx.PreArchMutators(android.RegisterVisibilityRuleGatherer) - ctx.PostDepsMutators(android.RegisterVisibilityRuleEnforcer) - - // from java package - java.RegisterRequiredBuildComponentsForTest(ctx) - - // from genrule package - genrule.RegisterGenruleBuildComponents(ctx) - - // from cc package - cc.RegisterRequiredBuildComponentsForTest(ctx) - - // from apex package - ctx.RegisterModuleType("apex", apex.BundleFactory) - ctx.RegisterModuleType("apex_key", apex.ApexKeyFactory) - ctx.PostDepsMutators(apex.RegisterPostDepsMutators) - - // from this package - registerModuleExportsBuildComponents(ctx) - registerSdkBuildComponents(ctx) - - ctx.Register() - - return ctx, config -} + }), +) -func runTests(t *testing.T, ctx *android.TestContext, config android.Config) *testSdkResult { - t.Helper() - _, errs := ctx.ParseBlueprintsFiles(".") - android.FailIfErrored(t, errs) - _, errs = ctx.PrepareBuildActions(config) - android.FailIfErrored(t, errs) - return &testSdkResult{ - TestHelper: android.TestHelper{T: t}, - TestContext: ctx, - } -} +var PrepareForTestWithSdkBuildComponents = android.GroupFixturePreparers( + android.FixtureRegisterWithContext(registerModuleExportsBuildComponents), + android.FixtureRegisterWithContext(registerSdkBuildComponents), +) -func testSdkWithFs(t *testing.T, bp string, fs map[string][]byte) *testSdkResult { +func testSdkWithFs(t *testing.T, bp string, fs android.MockFS) *android.TestResult { t.Helper() - ctx, config := testSdkContext(bp, fs, nil) - return runTests(t, ctx, config) + return sdkFixtureFactory.RunTest(t, fs.AddToFixture(), android.FixtureWithRootAndroidBp(bp)) } func testSdkError(t *testing.T, pattern, bp string) { t.Helper() - ctx, config := testSdkContext(bp, nil, nil) - _, errs := ctx.ParseFileList(".", []string{"Android.bp"}) - if len(errs) > 0 { - android.FailIfNoMatchingErrors(t, pattern, errs) - return - } - _, errs = ctx.PrepareBuildActions(config) - if len(errs) > 0 { - android.FailIfNoMatchingErrors(t, pattern, errs) - return - } - - t.Fatalf("missing expected error %q (0 errors are returned)", pattern) + sdkFixtureFactory. + ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(pattern)). + RunTestWithBp(t, bp) } func ensureListContains(t *testing.T, result []string, expected string) { @@ -179,22 +104,11 @@ func pathsToStrings(paths android.Paths) []string { return ret } -// Encapsulates result of processing an SDK definition. Provides support for -// checking the state of the build structures. -type testSdkResult struct { - android.TestHelper - *android.TestContext -} - -func (result *testSdkResult) Module(name string, variant string) android.Module { - return result.ModuleForTests(name, variant).Module() -} - // Analyse the sdk build rules to extract information about what it is doing. - +// // e.g. find the src/dest pairs from each cp command, the various zip files // generated, etc. -func getSdkSnapshotBuildInfo(result *testSdkResult, sdk *sdk) *snapshotBuildInfo { +func getSdkSnapshotBuildInfo(result *android.TestResult, sdk *sdk) *snapshotBuildInfo { info := &snapshotBuildInfo{ r: result, androidBpContents: sdk.GetAndroidBpContentsForTests(), @@ -263,7 +177,7 @@ func getSdkSnapshotBuildInfo(result *testSdkResult, sdk *sdk) *snapshotBuildInfo // Takes a list of functions which check different facets of the snapshot build rules. // Allows each test to customize what is checked without duplicating lots of code // or proliferating check methods of different flavors. -func CheckSnapshot(result *testSdkResult, name string, dir string, checkers ...snapshotBuildInfoChecker) { +func CheckSnapshot(result *android.TestResult, name string, dir string, checkers ...snapshotBuildInfoChecker) { result.Helper() // The sdk CommonOS variant is always responsible for generating the snapshot. @@ -373,7 +287,7 @@ func checkMergeZips(expected ...string) snapshotBuildInfoChecker { // All source/input paths are relative either the build directory. All dest/output paths are // relative to the snapshot root directory. type snapshotBuildInfo struct { - r *testSdkResult + r *android.TestResult // The contents of the generated Android.bp file androidBpContents string |