Loading cc/cc_test.go +14 −3 Original line number Diff line number Diff line Loading @@ -730,9 +730,16 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { gtest: false, } cc_binary { name: "test_bin", relative_install_path: "foo/bar/baz", compile_multilib: "both", } cc_test { name: "main_test", data_libs: ["test_lib"], data_bins: ["test_bin"], gtest: false, } ` Loading @@ -750,10 +757,10 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { t.Fatalf("Expected cc_test to produce output files, error: %s", err) } if len(outputFiles) != 1 { t.Errorf("expected exactly one output file. output files: [%s]", outputFiles) t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) } if len(testBinary.dataPaths()) != 1 { t.Errorf("expected exactly one test data file. test data files: [%s]", testBinary.dataPaths()) if len(testBinary.dataPaths()) != 2 { t.Fatalf("expected exactly one test data file. test data files: [%s]", testBinary.dataPaths()) } outputPath := outputFiles[0].String() Loading @@ -766,6 +773,10 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { 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], ":test_bin:foo/bar/baz") { t.Errorf("expected LOCAL_TEST_DATA to end with `:test_bin:foo/bar/baz`,"+ " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][1]) } } func TestVndkWhenVndkVersionIsNotSet(t *testing.T) { Loading cc/test.go +10 −15 Original line number Diff line number Diff line Loading @@ -378,31 +378,26 @@ func (test *testBinary) install(ctx ModuleContext, file android.Path) { ctx.VisitDirectDepsWithTag(dataLibDepTag, func(dep android.Module) { depName := ctx.OtherModuleName(dep) ccDep, ok := dep.(LinkableInterface) if !ok { ctx.ModuleErrorf("data_lib %q is not a linkable cc module", depName) } ccModule, ok := dep.(*Module) linkableDep, ok := dep.(LinkableInterface) if !ok { ctx.ModuleErrorf("data_lib %q is not a cc module", depName) ctx.ModuleErrorf("data_lib %q is not a LinkableInterface module", depName) } if ccDep.OutputFile().Valid() { if linkableDep.OutputFile().Valid() { test.data = append(test.data, android.DataPath{SrcPath: ccDep.OutputFile().Path(), RelativeInstallPath: ccModule.installer.relativeInstallPath()}) android.DataPath{SrcPath: linkableDep.OutputFile().Path(), RelativeInstallPath: linkableDep.RelativeInstallPath()}) } }) ctx.VisitDirectDepsWithTag(dataBinDepTag, func(dep android.Module) { depName := ctx.OtherModuleName(dep) ccModule, ok := dep.(*Module) linkableDep, ok := dep.(LinkableInterface) if !ok { ctx.ModuleErrorf("data_bin %q is not a cc module", depName) ctx.ModuleErrorf("data_bin %q is not a LinkableInterface module", depName) } if ccModule.OutputFile().Valid() { if linkableDep.OutputFile().Valid() { test.data = append(test.data, android.DataPath{SrcPath: ccModule.OutputFile().Path(), RelativeInstallPath: ccModule.installer.relativeInstallPath()}) android.DataPath{SrcPath: linkableDep.OutputFile().Path(), RelativeInstallPath: linkableDep.RelativeInstallPath()}) } }) Loading rust/rust.go +12 −0 Original line number Diff line number Diff line Loading @@ -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 } Loading Loading @@ -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 { Loading Loading @@ -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...) } Loading rust/test.go +36 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" "android/soong/cc" "android/soong/tradefed" ) Loading Loading @@ -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. Loading Loading @@ -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}) } Loading Loading @@ -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 } Loading rust/test_test.go +126 −0 Original line number Diff line number Diff line Loading @@ -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]) } } Loading
cc/cc_test.go +14 −3 Original line number Diff line number Diff line Loading @@ -730,9 +730,16 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { gtest: false, } cc_binary { name: "test_bin", relative_install_path: "foo/bar/baz", compile_multilib: "both", } cc_test { name: "main_test", data_libs: ["test_lib"], data_bins: ["test_bin"], gtest: false, } ` Loading @@ -750,10 +757,10 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { t.Fatalf("Expected cc_test to produce output files, error: %s", err) } if len(outputFiles) != 1 { t.Errorf("expected exactly one output file. output files: [%s]", outputFiles) t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) } if len(testBinary.dataPaths()) != 1 { t.Errorf("expected exactly one test data file. test data files: [%s]", testBinary.dataPaths()) if len(testBinary.dataPaths()) != 2 { t.Fatalf("expected exactly one test data file. test data files: [%s]", testBinary.dataPaths()) } outputPath := outputFiles[0].String() Loading @@ -766,6 +773,10 @@ func TestDataLibsRelativeInstallPath(t *testing.T) { 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], ":test_bin:foo/bar/baz") { t.Errorf("expected LOCAL_TEST_DATA to end with `:test_bin:foo/bar/baz`,"+ " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][1]) } } func TestVndkWhenVndkVersionIsNotSet(t *testing.T) { Loading
cc/test.go +10 −15 Original line number Diff line number Diff line Loading @@ -378,31 +378,26 @@ func (test *testBinary) install(ctx ModuleContext, file android.Path) { ctx.VisitDirectDepsWithTag(dataLibDepTag, func(dep android.Module) { depName := ctx.OtherModuleName(dep) ccDep, ok := dep.(LinkableInterface) if !ok { ctx.ModuleErrorf("data_lib %q is not a linkable cc module", depName) } ccModule, ok := dep.(*Module) linkableDep, ok := dep.(LinkableInterface) if !ok { ctx.ModuleErrorf("data_lib %q is not a cc module", depName) ctx.ModuleErrorf("data_lib %q is not a LinkableInterface module", depName) } if ccDep.OutputFile().Valid() { if linkableDep.OutputFile().Valid() { test.data = append(test.data, android.DataPath{SrcPath: ccDep.OutputFile().Path(), RelativeInstallPath: ccModule.installer.relativeInstallPath()}) android.DataPath{SrcPath: linkableDep.OutputFile().Path(), RelativeInstallPath: linkableDep.RelativeInstallPath()}) } }) ctx.VisitDirectDepsWithTag(dataBinDepTag, func(dep android.Module) { depName := ctx.OtherModuleName(dep) ccModule, ok := dep.(*Module) linkableDep, ok := dep.(LinkableInterface) if !ok { ctx.ModuleErrorf("data_bin %q is not a cc module", depName) ctx.ModuleErrorf("data_bin %q is not a LinkableInterface module", depName) } if ccModule.OutputFile().Valid() { if linkableDep.OutputFile().Valid() { test.data = append(test.data, android.DataPath{SrcPath: ccModule.OutputFile().Path(), RelativeInstallPath: ccModule.installer.relativeInstallPath()}) android.DataPath{SrcPath: linkableDep.OutputFile().Path(), RelativeInstallPath: linkableDep.RelativeInstallPath()}) } }) Loading
rust/rust.go +12 −0 Original line number Diff line number Diff line Loading @@ -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 } Loading Loading @@ -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 { Loading Loading @@ -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...) } Loading
rust/test.go +36 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" "android/soong/cc" "android/soong/tradefed" ) Loading Loading @@ -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. Loading Loading @@ -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}) } Loading Loading @@ -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 } Loading
rust/test_test.go +126 −0 Original line number Diff line number Diff line Loading @@ -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]) } }