diff options
author | 2021-11-16 13:46:49 +0000 | |
---|---|---|
committer | 2021-11-16 13:46:49 +0000 | |
commit | b993a835c3cb5925d0c58b6c069f0742794d63a1 (patch) | |
tree | a23409b8c7ab35135c566128e3b62c180ddd9d03 /rust | |
parent | a10ebe60ab750bbb5dccdf2aee2a06740ce7911e (diff) | |
parent | 4e5f07d27ba2e8ae460457a5a977478b9b2c96eb (diff) |
Merge "rust: Add data_libs and data_bins to rust_test"
Diffstat (limited to 'rust')
-rw-r--r-- | rust/rust.go | 12 | ||||
-rw-r--r-- | rust/test.go | 36 | ||||
-rw-r--r-- | rust/test_test.go | 126 |
3 files changed, 174 insertions, 0 deletions
diff --git a/rust/rust.go b/rust/rust.go index 3cc786878..0fd781ea7 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -393,6 +393,10 @@ type Deps struct { WholeStaticLibs []string HeaderLibs []string + // Used for data dependencies adjacent to tests + DataLibs []string + DataBins []string + CrtBegin, CrtEnd string } @@ -982,6 +986,8 @@ var ( procMacroDepTag = dependencyTag{name: "procMacro", procMacro: true} testPerSrcDepTag = dependencyTag{name: "rust_unit_tests"} sourceDepTag = dependencyTag{name: "source"} + dataLibDepTag = dependencyTag{name: "data lib"} + dataBinDepTag = dependencyTag{name: "data bin"} ) func IsDylibDepTag(depTag blueprint.DependencyTag) bool { @@ -1428,6 +1434,12 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { } } + actx.AddVariationDependencies([]blueprint.Variation{ + {Mutator: "link", Variation: "shared"}, + }, dataLibDepTag, deps.DataLibs...) + + actx.AddVariationDependencies(nil, dataBinDepTag, deps.DataBins...) + // proc_macros are compiler plugins, and so we need the host arch variant as a dependendcy. actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), procMacroDepTag, deps.ProcMacros...) } diff --git a/rust/test.go b/rust/test.go index bb877a9a5..3eea0ada4 100644 --- a/rust/test.go +++ b/rust/test.go @@ -18,6 +18,7 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" + "android/soong/cc" "android/soong/tradefed" ) @@ -49,6 +50,12 @@ type TestProperties struct { // the test Data []string `android:"path,arch_variant"` + // list of shared library modules that should be installed alongside the test + Data_libs []string `android:"arch_variant"` + + // list of binary modules that should be installed alongside the test + Data_bins []string `android:"arch_variant"` + // Flag to indicate whether or not to create test config automatically. If AndroidTest.xml // doesn't exist next to the Android.bp, this attribute doesn't need to be set to true // explicitly. @@ -137,6 +144,32 @@ func (test *testDecorator) install(ctx ModuleContext) { dataSrcPaths := android.PathsForModuleSrc(ctx, test.Properties.Data) + ctx.VisitDirectDepsWithTag(dataLibDepTag, func(dep android.Module) { + depName := ctx.OtherModuleName(dep) + linkableDep, ok := dep.(cc.LinkableInterface) + if !ok { + ctx.ModuleErrorf("data_lib %q is not a linkable module", depName) + } + if linkableDep.OutputFile().Valid() { + test.data = append(test.data, + android.DataPath{SrcPath: linkableDep.OutputFile().Path(), + RelativeInstallPath: linkableDep.RelativeInstallPath()}) + } + }) + + ctx.VisitDirectDepsWithTag(dataBinDepTag, func(dep android.Module) { + depName := ctx.OtherModuleName(dep) + linkableDep, ok := dep.(cc.LinkableInterface) + if !ok { + ctx.ModuleErrorf("data_bin %q is not a linkable module", depName) + } + if linkableDep.OutputFile().Valid() { + test.data = append(test.data, + android.DataPath{SrcPath: linkableDep.OutputFile().Path(), + RelativeInstallPath: linkableDep.RelativeInstallPath()}) + } + }) + for _, dataSrcPath := range dataSrcPaths { test.data = append(test.data, android.DataPath{SrcPath: dataSrcPath}) } @@ -194,6 +227,9 @@ func (test *testDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { deps.Rustlibs = append(deps.Rustlibs, "libtest") + deps.DataLibs = append(deps.DataLibs, test.Properties.Data_libs...) + deps.DataBins = append(deps.DataBins, test.Properties.Data_bins...) + return deps } diff --git a/rust/test_test.go b/rust/test_test.go index 892761a07..112417673 100644 --- a/rust/test_test.go +++ b/rust/test_test.go @@ -74,3 +74,129 @@ func TestRustTestLinkage(t *testing.T) { t.Errorf("Device rust_test module 'my_test' does not link libstd as an rlib") } } + +func TestDataLibs(t *testing.T) { + bp := ` + cc_library { + name: "test_lib", + srcs: ["test_lib.cpp"], + } + + rust_binary { + name: "rusty", + srcs: ["foo.rs"], + compile_multilib: "both", + } + + rust_ffi { + name: "librust_test_lib", + crate_name: "rust_test_lib", + srcs: ["test_lib.rs"], + relative_install_path: "foo/bar/baz", + compile_multilib: "64", + } + + rust_test { + name: "main_test", + srcs: ["foo.rs"], + data_libs: ["test_lib"], + data_bins: ["rusty"], + } + ` + + ctx := testRust(t, bp) + + module := ctx.ModuleForTests("main_test", "android_arm64_armv8-a").Module() + testBinary := module.(*Module).compiler.(*testDecorator) + outputFiles, err := module.(android.OutputFileProducer).OutputFiles("") + if err != nil { + t.Fatalf("Expected rust_test to produce output files, error: %s", err) + } + if len(outputFiles) != 1 { + t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) + } + if len(testBinary.dataPaths()) != 2 { + t.Fatalf("expected exactly two test data files. test data files: [%s]", testBinary.dataPaths()) + } + + outputPath := outputFiles[0].String() + dataLibraryPath := testBinary.dataPaths()[0].SrcPath.String() + dataBinaryPath := testBinary.dataPaths()[1].SrcPath.String() + + if !strings.HasSuffix(outputPath, "/main_test") { + t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath) + } + if !strings.HasSuffix(dataLibraryPath, "/test_lib.so") { + t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", dataLibraryPath) + } + if !strings.HasSuffix(dataBinaryPath, "/rusty") { + t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", dataBinaryPath) + } +} + +func TestDataLibsRelativeInstallPath(t *testing.T) { + bp := ` + cc_library { + name: "test_lib", + srcs: ["test_lib.cpp"], + relative_install_path: "foo/bar/baz", + compile_multilib: "64", + } + + rust_ffi { + name: "librust_test_lib", + crate_name: "rust_test_lib", + srcs: ["test_lib.rs"], + relative_install_path: "foo/bar/baz", + compile_multilib: "64", + } + + rust_binary { + name: "rusty", + srcs: ["foo.rs"], + relative_install_path: "foo/bar/baz", + compile_multilib: "64", + } + + rust_test { + name: "main_test", + srcs: ["foo.rs"], + data_libs: ["test_lib", "librust_test_lib"], + data_bins: ["rusty"], + compile_multilib: "64", + } + ` + + ctx := testRust(t, bp) + module := ctx.ModuleForTests("main_test", "android_arm64_armv8-a").Module() + testBinary := module.(*Module).compiler.(*testDecorator) + outputFiles, err := module.(android.OutputFileProducer).OutputFiles("") + if err != nil { + t.Fatalf("Expected rust_test to produce output files, error: %s", err) + } + if len(outputFiles) != 1 { + t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) + } + if len(testBinary.dataPaths()) != 3 { + t.Fatalf("expected exactly two test data files. test data files: [%s]", testBinary.dataPaths()) + } + + outputPath := outputFiles[0].String() + + if !strings.HasSuffix(outputPath, "/main_test") { + t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath) + } + entries := android.AndroidMkEntriesForTest(t, ctx, module)[0] + if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:foo/bar/baz") { + t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:foo/bar/baz`,"+ + " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0]) + } + if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][1], ":librust_test_lib.so:foo/bar/baz") { + t.Errorf("expected LOCAL_TEST_DATA to end with `:librust_test_lib.so:foo/bar/baz`,"+ + " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][1]) + } + if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][2], ":rusty:foo/bar/baz") { + t.Errorf("expected LOCAL_TEST_DATA to end with `:rusty:foo/bar/baz`,"+ + " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][2]) + } +} |