1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 The Android Open Source Project 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage rust 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "strings" 19*333d2b36SAndroid Build Coastguard Worker "testing" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workerfunc TestRustTest(t *testing.T) { 25*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 26*333d2b36SAndroid Build Coastguard Worker rust_test_host { 27*333d2b36SAndroid Build Coastguard Worker name: "my_test", 28*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 29*333d2b36SAndroid Build Coastguard Worker data: ["data.txt"], 30*333d2b36SAndroid Build Coastguard Worker }`) 31*333d2b36SAndroid Build Coastguard Worker 32*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("my_test", "linux_glibc_x86_64") 33*333d2b36SAndroid Build Coastguard Worker expectedOut := "my_test/linux_glibc_x86_64/my_test" 34*333d2b36SAndroid Build Coastguard Worker outPath := testingModule.Output("my_test").Output.String() 35*333d2b36SAndroid Build Coastguard Worker if !strings.Contains(outPath, expectedOut) { 36*333d2b36SAndroid Build Coastguard Worker t.Errorf("wrong output path: %v; expected: %v", outPath, expectedOut) 37*333d2b36SAndroid Build Coastguard Worker } 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Worker dataPaths := testingModule.Module().(*Module).compiler.(*testDecorator).dataPaths() 40*333d2b36SAndroid Build Coastguard Worker if len(dataPaths) != 1 { 41*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected exactly one test data file. test data files: [%v]", dataPaths) 42*333d2b36SAndroid Build Coastguard Worker return 43*333d2b36SAndroid Build Coastguard Worker } 44*333d2b36SAndroid Build Coastguard Worker} 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Workerfunc TestRustTestLinkage(t *testing.T) { 47*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, ` 48*333d2b36SAndroid Build Coastguard Worker rust_test { 49*333d2b36SAndroid Build Coastguard Worker name: "my_test", 50*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 51*333d2b36SAndroid Build Coastguard Worker rustlibs: ["libfoo"], 52*333d2b36SAndroid Build Coastguard Worker rlibs: ["libbar"], 53*333d2b36SAndroid Build Coastguard Worker } 54*333d2b36SAndroid Build Coastguard Worker rust_library { 55*333d2b36SAndroid Build Coastguard Worker name: "libfoo", 56*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 57*333d2b36SAndroid Build Coastguard Worker crate_name: "foo", 58*333d2b36SAndroid Build Coastguard Worker } 59*333d2b36SAndroid Build Coastguard Worker rust_library { 60*333d2b36SAndroid Build Coastguard Worker name: "libbar", 61*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 62*333d2b36SAndroid Build Coastguard Worker crate_name: "bar", 63*333d2b36SAndroid Build Coastguard Worker }`) 64*333d2b36SAndroid Build Coastguard Worker 65*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("my_test", "android_arm64_armv8-a").Module().(*Module) 66*333d2b36SAndroid Build Coastguard Worker 67*333d2b36SAndroid Build Coastguard Worker if !android.InList("libfoo.rlib-std", testingModule.Properties.AndroidMkRlibs) { 68*333d2b36SAndroid Build Coastguard Worker t.Errorf("rlib-std variant for libfoo not detected as a rustlib-defined rlib dependency for device rust_test module") 69*333d2b36SAndroid Build Coastguard Worker } 70*333d2b36SAndroid Build Coastguard Worker if !android.InList("libbar.rlib-std", testingModule.Properties.AndroidMkRlibs) { 71*333d2b36SAndroid Build Coastguard Worker t.Errorf("rlib-std variant for libbar not detected as an rlib dependency for device rust_test module") 72*333d2b36SAndroid Build Coastguard Worker } 73*333d2b36SAndroid Build Coastguard Worker if !android.InList("libstd", testingModule.Properties.AndroidMkRlibs) { 74*333d2b36SAndroid Build Coastguard Worker t.Errorf("Device rust_test module 'my_test' does not link libstd as an rlib") 75*333d2b36SAndroid Build Coastguard Worker } 76*333d2b36SAndroid Build Coastguard Worker} 77*333d2b36SAndroid Build Coastguard Worker 78*333d2b36SAndroid Build Coastguard Workerfunc TestDataLibs(t *testing.T) { 79*333d2b36SAndroid Build Coastguard Worker bp := ` 80*333d2b36SAndroid Build Coastguard Worker cc_library { 81*333d2b36SAndroid Build Coastguard Worker name: "test_lib", 82*333d2b36SAndroid Build Coastguard Worker srcs: ["test_lib.cpp"], 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker 85*333d2b36SAndroid Build Coastguard Worker rust_binary { 86*333d2b36SAndroid Build Coastguard Worker name: "rusty", 87*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 88*333d2b36SAndroid Build Coastguard Worker compile_multilib: "both", 89*333d2b36SAndroid Build Coastguard Worker } 90*333d2b36SAndroid Build Coastguard Worker 91*333d2b36SAndroid Build Coastguard Worker rust_ffi { 92*333d2b36SAndroid Build Coastguard Worker name: "librust_test_lib", 93*333d2b36SAndroid Build Coastguard Worker crate_name: "rust_test_lib", 94*333d2b36SAndroid Build Coastguard Worker srcs: ["test_lib.rs"], 95*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar/baz", 96*333d2b36SAndroid Build Coastguard Worker compile_multilib: "64", 97*333d2b36SAndroid Build Coastguard Worker } 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Worker rust_test { 100*333d2b36SAndroid Build Coastguard Worker name: "main_test", 101*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 102*333d2b36SAndroid Build Coastguard Worker data_libs: ["test_lib"], 103*333d2b36SAndroid Build Coastguard Worker data_bins: ["rusty"], 104*333d2b36SAndroid Build Coastguard Worker } 105*333d2b36SAndroid Build Coastguard Worker ` 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, bp) 108*333d2b36SAndroid Build Coastguard Worker 109*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a") 110*333d2b36SAndroid Build Coastguard Worker testBinary := testingModule.Module().(*Module).compiler.(*testDecorator) 111*333d2b36SAndroid Build Coastguard Worker outputFiles := testingModule.OutputFiles(ctx, t, "") 112*333d2b36SAndroid Build Coastguard Worker if len(outputFiles) != 1 { 113*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) 114*333d2b36SAndroid Build Coastguard Worker } 115*333d2b36SAndroid Build Coastguard Worker if len(testBinary.dataPaths()) != 2 { 116*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected exactly two test data files. test data files: [%v]", testBinary.dataPaths()) 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker outputPath := outputFiles[0].String() 120*333d2b36SAndroid Build Coastguard Worker dataLibraryPath := testBinary.dataPaths()[0].SrcPath.String() 121*333d2b36SAndroid Build Coastguard Worker dataBinaryPath := testBinary.dataPaths()[1].SrcPath.String() 122*333d2b36SAndroid Build Coastguard Worker 123*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(outputPath, "/main_test") { 124*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath) 125*333d2b36SAndroid Build Coastguard Worker } 126*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(dataLibraryPath, "/test_lib.so") { 127*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", dataLibraryPath) 128*333d2b36SAndroid Build Coastguard Worker } 129*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(dataBinaryPath, "/rusty") { 130*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected test data file to be 'test_lib.so', but was '%s'", dataBinaryPath) 131*333d2b36SAndroid Build Coastguard Worker } 132*333d2b36SAndroid Build Coastguard Worker} 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Workerfunc TestDataLibsRelativeInstallPath(t *testing.T) { 135*333d2b36SAndroid Build Coastguard Worker bp := ` 136*333d2b36SAndroid Build Coastguard Worker cc_library { 137*333d2b36SAndroid Build Coastguard Worker name: "test_lib", 138*333d2b36SAndroid Build Coastguard Worker srcs: ["test_lib.cpp"], 139*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar/baz", 140*333d2b36SAndroid Build Coastguard Worker compile_multilib: "64", 141*333d2b36SAndroid Build Coastguard Worker } 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker rust_ffi { 144*333d2b36SAndroid Build Coastguard Worker name: "librust_test_lib", 145*333d2b36SAndroid Build Coastguard Worker crate_name: "rust_test_lib", 146*333d2b36SAndroid Build Coastguard Worker srcs: ["test_lib.rs"], 147*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar/baz", 148*333d2b36SAndroid Build Coastguard Worker compile_multilib: "64", 149*333d2b36SAndroid Build Coastguard Worker } 150*333d2b36SAndroid Build Coastguard Worker 151*333d2b36SAndroid Build Coastguard Worker rust_binary { 152*333d2b36SAndroid Build Coastguard Worker name: "rusty", 153*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 154*333d2b36SAndroid Build Coastguard Worker relative_install_path: "foo/bar/baz", 155*333d2b36SAndroid Build Coastguard Worker compile_multilib: "64", 156*333d2b36SAndroid Build Coastguard Worker } 157*333d2b36SAndroid Build Coastguard Worker 158*333d2b36SAndroid Build Coastguard Worker rust_test { 159*333d2b36SAndroid Build Coastguard Worker name: "main_test", 160*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.rs"], 161*333d2b36SAndroid Build Coastguard Worker data_libs: ["test_lib", "librust_test_lib"], 162*333d2b36SAndroid Build Coastguard Worker data_bins: ["rusty"], 163*333d2b36SAndroid Build Coastguard Worker compile_multilib: "64", 164*333d2b36SAndroid Build Coastguard Worker } 165*333d2b36SAndroid Build Coastguard Worker ` 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Worker ctx := testRust(t, bp) 168*333d2b36SAndroid Build Coastguard Worker testingModule := ctx.ModuleForTests("main_test", "android_arm64_armv8-a") 169*333d2b36SAndroid Build Coastguard Worker module := testingModule.Module() 170*333d2b36SAndroid Build Coastguard Worker testBinary := module.(*Module).compiler.(*testDecorator) 171*333d2b36SAndroid Build Coastguard Worker outputFiles := testingModule.OutputFiles(ctx, t, "") 172*333d2b36SAndroid Build Coastguard Worker if len(outputFiles) != 1 { 173*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected exactly one output file. output files: [%s]", outputFiles) 174*333d2b36SAndroid Build Coastguard Worker } 175*333d2b36SAndroid Build Coastguard Worker if len(testBinary.dataPaths()) != 3 { 176*333d2b36SAndroid Build Coastguard Worker t.Fatalf("expected exactly two test data files. test data files: [%v]", testBinary.dataPaths()) 177*333d2b36SAndroid Build Coastguard Worker } 178*333d2b36SAndroid Build Coastguard Worker 179*333d2b36SAndroid Build Coastguard Worker outputPath := outputFiles[0].String() 180*333d2b36SAndroid Build Coastguard Worker 181*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(outputPath, "/main_test") { 182*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected test output file to be 'main_test', but was '%s'", outputPath) 183*333d2b36SAndroid Build Coastguard Worker } 184*333d2b36SAndroid Build Coastguard Worker entries := android.AndroidMkEntriesForTest(t, ctx, module)[0] 185*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][0], ":test_lib.so:lib64/foo/bar/baz") { 186*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_TEST_DATA to end with `:test_lib.so:lib64/foo/bar/baz`,"+ 187*333d2b36SAndroid Build Coastguard Worker " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][0]) 188*333d2b36SAndroid Build Coastguard Worker } 189*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][1], ":librust_test_lib.so:lib64/foo/bar/baz") { 190*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_TEST_DATA to end with `:librust_test_lib.so:lib64/foo/bar/baz`,"+ 191*333d2b36SAndroid Build Coastguard Worker " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][1]) 192*333d2b36SAndroid Build Coastguard Worker } 193*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(entries.EntryMap["LOCAL_TEST_DATA"][2], ":rusty:foo/bar/baz") { 194*333d2b36SAndroid Build Coastguard Worker t.Errorf("expected LOCAL_TEST_DATA to end with `:rusty:foo/bar/baz`,"+ 195*333d2b36SAndroid Build Coastguard Worker " but was '%s'", entries.EntryMap["LOCAL_TEST_DATA"][2]) 196*333d2b36SAndroid Build Coastguard Worker } 197*333d2b36SAndroid Build Coastguard Worker} 198