From 9da4aa8166efe67d6c4ab1fe7911224d94493cc9 Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Fri, 29 Jan 2021 12:48:05 -0500 Subject: [PATCH] rust: Allow rust_tests to include data files. Adds the ability to define data files that should be installed alongside the test. This also fixes a bug wherein rust_test properties were duplicated. Bug: 171710847 Test: rust_test module with "data" property installs files to device. Change-Id: I091489afaf7e76b751a33a28049590d9fb39fe5f --- cc/androidmk.go | 6 +++--- rust/androidmk.go | 7 +++++-- rust/rust_test.go | 1 + rust/test.go | 17 ++++++++++++++++- rust/test_test.go | 7 +++++++ 5 files changed, 32 insertions(+), 6 deletions(-) diff --git a/cc/androidmk.go b/cc/androidmk.go index 040aa0b9f..934572844 100644 --- a/cc/androidmk.go +++ b/cc/androidmk.go @@ -168,7 +168,7 @@ func androidMkWriteExtraTestConfigs(extraTestConfigs android.Paths, entries *and } } -func androidMkWriteTestData(data []android.DataPath, ctx AndroidMkContext, entries *android.AndroidMkEntries) { +func AndroidMkWriteTestData(data []android.DataPath, entries *android.AndroidMkEntries) { testFiles := android.AndroidMkDataPaths(data) if len(testFiles) > 0 { entries.ExtraEntries = append(entries.ExtraEntries, func(entries *android.AndroidMkEntries) { @@ -353,7 +353,7 @@ func (benchmark *benchmarkDecorator) AndroidMkEntries(ctx AndroidMkContext, entr for _, srcPath := range benchmark.data { dataPaths = append(dataPaths, android.DataPath{SrcPath: srcPath}) } - androidMkWriteTestData(dataPaths, ctx, entries) + AndroidMkWriteTestData(dataPaths, entries) } func (test *testBinary) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { @@ -378,7 +378,7 @@ func (test *testBinary) AndroidMkEntries(ctx AndroidMkContext, entries *android. } }) - androidMkWriteTestData(test.data, ctx, entries) + AndroidMkWriteTestData(test.data, entries) androidMkWriteExtraTestConfigs(test.extraTestConfigs, entries) } diff --git a/rust/androidmk.go b/rust/androidmk.go index 030772722..1a286f738 100644 --- a/rust/androidmk.go +++ b/rust/androidmk.go @@ -18,6 +18,7 @@ import ( "path/filepath" "android/soong/android" + "android/soong/cc" ) type AndroidMkContext interface { @@ -85,7 +86,8 @@ func (binary *binaryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.Andr } func (test *testDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { - test.binaryDecorator.AndroidMk(ctx, ret) + ctx.SubAndroidMk(ret, test.binaryDecorator) + ret.Class = "NATIVE_TESTS" ret.ExtraEntries = append(ret.ExtraEntries, func(entries *android.AndroidMkEntries) { entries.AddCompatibilityTestSuites(test.Properties.Test_suites...) @@ -95,7 +97,8 @@ func (test *testDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidM entries.SetBoolIfTrue("LOCAL_DISABLE_AUTO_GENERATE_TEST_CONFIG", !BoolDefault(test.Properties.Auto_gen_config, true)) entries.SetBoolIfTrue("LOCAL_IS_UNIT_TEST", Bool(test.Properties.Test_options.Unit_test)) }) - // TODO(chh): add test data with androidMkWriteTestData(test.data, ctx, ret) + + cc.AndroidMkWriteTestData(test.data, ret) } func (library *libraryDecorator) AndroidMk(ctx AndroidMkContext, ret *android.AndroidMkEntries) { diff --git a/rust/rust_test.go b/rust/rust_test.go index fc7f47e08..abc9af9b1 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -116,6 +116,7 @@ func (tctx *testRustCtx) useMockedFs() { "foo.proto": nil, "liby.so": nil, "libz.so": nil, + "data.txt": nil, } } diff --git a/rust/test.go b/rust/test.go index 35e04fff6..92b486070 100644 --- a/rust/test.go +++ b/rust/test.go @@ -43,6 +43,10 @@ type TestProperties struct { // installed into. Test_suites []string `android:"arch_variant"` + // list of files or filegroup modules that provide data that should be installed alongside + // the test + Data []string `android:"path,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. @@ -62,6 +66,12 @@ type testDecorator struct { *binaryDecorator Properties TestProperties testConfig android.Path + + data []android.DataPath +} + +func (test *testDecorator) dataPaths() []android.DataPath { + return test.data } func (test *testDecorator) nativeCoverage() bool { @@ -89,7 +99,6 @@ func NewRustTest(hod android.HostOrDeviceSupported) (*Module, *testDecorator) { } module.compiler = test - module.AddProperties(&test.Properties) return module, test } @@ -105,6 +114,12 @@ func (test *testDecorator) install(ctx ModuleContext) { nil, test.Properties.Auto_gen_config) + dataSrcPaths := android.PathsForModuleSrc(ctx, test.Properties.Data) + + for _, dataSrcPath := range dataSrcPaths { + test.data = append(test.data, android.DataPath{SrcPath: dataSrcPath}) + } + // default relative install path is module name if !Bool(test.Properties.No_named_install_directory) { test.baseCompiler.relative = ctx.ModuleName() diff --git a/rust/test_test.go b/rust/test_test.go index fea2ad059..892761a07 100644 --- a/rust/test_test.go +++ b/rust/test_test.go @@ -26,6 +26,7 @@ func TestRustTest(t *testing.T) { rust_test_host { name: "my_test", srcs: ["foo.rs"], + data: ["data.txt"], }`) testingModule := ctx.ModuleForTests("my_test", "linux_glibc_x86_64") @@ -34,6 +35,12 @@ func TestRustTest(t *testing.T) { if !strings.Contains(outPath, expectedOut) { t.Errorf("wrong output path: %v; expected: %v", outPath, expectedOut) } + + dataPaths := testingModule.Module().(*Module).compiler.(*testDecorator).dataPaths() + if len(dataPaths) != 1 { + t.Errorf("expected exactly one test data file. test data files: [%s]", dataPaths) + return + } } func TestRustTestLinkage(t *testing.T) {