xref: /aosp_15_r20/build/soong/sh/sh_binary_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Workerpackage sh
2*333d2b36SAndroid Build Coastguard Worker
3*333d2b36SAndroid Build Coastguard Workerimport (
4*333d2b36SAndroid Build Coastguard Worker	"os"
5*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
6*333d2b36SAndroid Build Coastguard Worker	"strconv"
7*333d2b36SAndroid Build Coastguard Worker	"strings"
8*333d2b36SAndroid Build Coastguard Worker	"testing"
9*333d2b36SAndroid Build Coastguard Worker
10*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
11*333d2b36SAndroid Build Coastguard Worker	"android/soong/cc"
12*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
13*333d2b36SAndroid Build Coastguard Worker)
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerfunc TestMain(m *testing.M) {
16*333d2b36SAndroid Build Coastguard Worker	os.Exit(m.Run())
17*333d2b36SAndroid Build Coastguard Worker}
18*333d2b36SAndroid Build Coastguard Worker
19*333d2b36SAndroid Build Coastguard Workervar prepareForShTest = android.GroupFixturePreparers(
20*333d2b36SAndroid Build Coastguard Worker	cc.PrepareForTestWithCcBuildComponents,
21*333d2b36SAndroid Build Coastguard Worker	java.PrepareForTestWithJavaDefaultModules,
22*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithShBuildComponents,
23*333d2b36SAndroid Build Coastguard Worker	android.FixtureMergeMockFs(android.MockFS{
24*333d2b36SAndroid Build Coastguard Worker		"test.sh":            nil,
25*333d2b36SAndroid Build Coastguard Worker		"testdata/data1":     nil,
26*333d2b36SAndroid Build Coastguard Worker		"testdata/sub/data2": nil,
27*333d2b36SAndroid Build Coastguard Worker	}),
28*333d2b36SAndroid Build Coastguard Worker)
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Worker// testShBinary runs tests using the prepareForShTest
31*333d2b36SAndroid Build Coastguard Worker//
32*333d2b36SAndroid Build Coastguard Worker// Do not add any new usages of this, instead use the prepareForShTest directly as it makes it much
33*333d2b36SAndroid Build Coastguard Worker// easier to customize the test behavior.
34*333d2b36SAndroid Build Coastguard Worker//
35*333d2b36SAndroid Build Coastguard Worker// If it is necessary to customize the behavior of an existing test that uses this then please first
36*333d2b36SAndroid Build Coastguard Worker// convert the test to using prepareForShTest first and then in a following change add the
37*333d2b36SAndroid Build Coastguard Worker// appropriate fixture preparers. Keeping the conversion change separate makes it easy to verify
38*333d2b36SAndroid Build Coastguard Worker// that it did not change the test behavior unexpectedly.
39*333d2b36SAndroid Build Coastguard Worker//
40*333d2b36SAndroid Build Coastguard Worker// deprecated
41*333d2b36SAndroid Build Coastguard Workerfunc testShBinary(t *testing.T, bp string) (*android.TestContext, android.Config) {
42*333d2b36SAndroid Build Coastguard Worker	bp = bp + cc.GatherRequiredDepsForTest(android.Android)
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker	result := prepareForShTest.RunTestWithBp(t, bp)
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker	return result.TestContext, result.Config
47*333d2b36SAndroid Build Coastguard Worker}
48*333d2b36SAndroid Build Coastguard Worker
49*333d2b36SAndroid Build Coastguard Workerfunc TestShTestSubDir(t *testing.T) {
50*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
51*333d2b36SAndroid Build Coastguard Worker		prepareForShTest,
52*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(android.SetKatiEnabledForTests),
53*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
54*333d2b36SAndroid Build Coastguard Worker		sh_test {
55*333d2b36SAndroid Build Coastguard Worker			name: "foo",
56*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
57*333d2b36SAndroid Build Coastguard Worker			sub_dir: "foo_test"
58*333d2b36SAndroid Build Coastguard Worker		}
59*333d2b36SAndroid Build Coastguard Worker	`)
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Worker	mod := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*ShTest)
62*333d2b36SAndroid Build Coastguard Worker
63*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, result.TestContext, mod)[0]
64*333d2b36SAndroid Build Coastguard Worker
65*333d2b36SAndroid Build Coastguard Worker	expectedPath := "out/target/product/test_device/data/nativetest64/foo_test"
66*333d2b36SAndroid Build Coastguard Worker	actualPath := entries.EntryMap["LOCAL_MODULE_PATH"][0]
67*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathRelativeToTopEquals(t, "LOCAL_MODULE_PATH[0]", result.Config, expectedPath, actualPath)
68*333d2b36SAndroid Build Coastguard Worker}
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Workerfunc TestShTest(t *testing.T) {
71*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
72*333d2b36SAndroid Build Coastguard Worker		prepareForShTest,
73*333d2b36SAndroid Build Coastguard Worker		android.FixtureModifyConfig(android.SetKatiEnabledForTests),
74*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
75*333d2b36SAndroid Build Coastguard Worker		sh_test {
76*333d2b36SAndroid Build Coastguard Worker			name: "foo",
77*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
78*333d2b36SAndroid Build Coastguard Worker			filename: "test.sh",
79*333d2b36SAndroid Build Coastguard Worker			data: [
80*333d2b36SAndroid Build Coastguard Worker				"testdata/data1",
81*333d2b36SAndroid Build Coastguard Worker				"testdata/sub/data2",
82*333d2b36SAndroid Build Coastguard Worker			],
83*333d2b36SAndroid Build Coastguard Worker		}
84*333d2b36SAndroid Build Coastguard Worker	`)
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Worker	mod := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*ShTest)
87*333d2b36SAndroid Build Coastguard Worker
88*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, result.TestContext, mod)[0]
89*333d2b36SAndroid Build Coastguard Worker
90*333d2b36SAndroid Build Coastguard Worker	expectedPath := "out/target/product/test_device/data/nativetest64/foo"
91*333d2b36SAndroid Build Coastguard Worker	actualPath := entries.EntryMap["LOCAL_MODULE_PATH"][0]
92*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathRelativeToTopEquals(t, "LOCAL_MODULE_PATH[0]", result.Config, expectedPath, actualPath)
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	expectedData := []string{":testdata/data1", ":testdata/sub/data2"}
95*333d2b36SAndroid Build Coastguard Worker	actualData := entries.EntryMap["LOCAL_TEST_DATA"]
96*333d2b36SAndroid Build Coastguard Worker	android.AssertDeepEquals(t, "LOCAL_TEST_DATA", expectedData, actualData)
97*333d2b36SAndroid Build Coastguard Worker}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Workerfunc TestShTest_dataModules(t *testing.T) {
100*333d2b36SAndroid Build Coastguard Worker	ctx, config := testShBinary(t, `
101*333d2b36SAndroid Build Coastguard Worker		sh_test {
102*333d2b36SAndroid Build Coastguard Worker			name: "foo",
103*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
104*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
105*333d2b36SAndroid Build Coastguard Worker			data_bins: ["bar"],
106*333d2b36SAndroid Build Coastguard Worker			data_libs: ["libbar"],
107*333d2b36SAndroid Build Coastguard Worker		}
108*333d2b36SAndroid Build Coastguard Worker
109*333d2b36SAndroid Build Coastguard Worker		cc_binary {
110*333d2b36SAndroid Build Coastguard Worker			name: "bar",
111*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
112*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
113*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
114*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
115*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
116*333d2b36SAndroid Build Coastguard Worker			stl: "none",
117*333d2b36SAndroid Build Coastguard Worker		}
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker		cc_library {
120*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
121*333d2b36SAndroid Build Coastguard Worker			host_supported: true,
122*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
123*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
124*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
125*333d2b36SAndroid Build Coastguard Worker			stl: "none",
126*333d2b36SAndroid Build Coastguard Worker		}
127*333d2b36SAndroid Build Coastguard Worker	`)
128*333d2b36SAndroid Build Coastguard Worker
129*333d2b36SAndroid Build Coastguard Worker	buildOS := config.BuildOS.String()
130*333d2b36SAndroid Build Coastguard Worker	arches := []string{"android_arm64_armv8-a", buildOS + "_x86_64"}
131*333d2b36SAndroid Build Coastguard Worker	for _, arch := range arches {
132*333d2b36SAndroid Build Coastguard Worker		variant := ctx.ModuleForTests("foo", arch)
133*333d2b36SAndroid Build Coastguard Worker
134*333d2b36SAndroid Build Coastguard Worker		libExt := ".so"
135*333d2b36SAndroid Build Coastguard Worker		if arch == "darwin_x86_64" {
136*333d2b36SAndroid Build Coastguard Worker			libExt = ".dylib"
137*333d2b36SAndroid Build Coastguard Worker		}
138*333d2b36SAndroid Build Coastguard Worker		relocated := variant.Output(filepath.Join("out/soong/.intermediates/foo", arch, "relocated/lib64/libbar"+libExt))
139*333d2b36SAndroid Build Coastguard Worker		expectedInput := "out/soong/.intermediates/libbar/" + arch + "_shared/libbar" + libExt
140*333d2b36SAndroid Build Coastguard Worker		android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input)
141*333d2b36SAndroid Build Coastguard Worker
142*333d2b36SAndroid Build Coastguard Worker		mod := variant.Module().(*ShTest)
143*333d2b36SAndroid Build Coastguard Worker		entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0]
144*333d2b36SAndroid Build Coastguard Worker		expectedData := []string{
145*333d2b36SAndroid Build Coastguard Worker			filepath.Join("out/soong/.intermediates/bar", arch, ":bar"),
146*333d2b36SAndroid Build Coastguard Worker			filepath.Join("out/soong/.intermediates/foo", arch, "relocated/:lib64/libbar"+libExt),
147*333d2b36SAndroid Build Coastguard Worker		}
148*333d2b36SAndroid Build Coastguard Worker		actualData := entries.EntryMap["LOCAL_TEST_DATA"]
149*333d2b36SAndroid Build Coastguard Worker		android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData)
150*333d2b36SAndroid Build Coastguard Worker	}
151*333d2b36SAndroid Build Coastguard Worker}
152*333d2b36SAndroid Build Coastguard Worker
153*333d2b36SAndroid Build Coastguard Workerfunc TestShTestHost(t *testing.T) {
154*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testShBinary(t, `
155*333d2b36SAndroid Build Coastguard Worker		sh_test_host {
156*333d2b36SAndroid Build Coastguard Worker			name: "foo",
157*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
158*333d2b36SAndroid Build Coastguard Worker			filename: "test.sh",
159*333d2b36SAndroid Build Coastguard Worker			data: [
160*333d2b36SAndroid Build Coastguard Worker				"testdata/data1",
161*333d2b36SAndroid Build Coastguard Worker				"testdata/sub/data2",
162*333d2b36SAndroid Build Coastguard Worker			],
163*333d2b36SAndroid Build Coastguard Worker			test_options: {
164*333d2b36SAndroid Build Coastguard Worker				unit_test: true,
165*333d2b36SAndroid Build Coastguard Worker			},
166*333d2b36SAndroid Build Coastguard Worker		}
167*333d2b36SAndroid Build Coastguard Worker	`)
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
170*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("foo", buildOS+"_x86_64").Module().(*ShTest)
171*333d2b36SAndroid Build Coastguard Worker	if !mod.Host() {
172*333d2b36SAndroid Build Coastguard Worker		t.Errorf("host bit is not set for a sh_test_host module.")
173*333d2b36SAndroid Build Coastguard Worker	}
174*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0]
175*333d2b36SAndroid Build Coastguard Worker	actualData, _ := strconv.ParseBool(entries.EntryMap["LOCAL_IS_UNIT_TEST"][0])
176*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "LOCAL_IS_UNIT_TEST", true, actualData)
177*333d2b36SAndroid Build Coastguard Worker}
178*333d2b36SAndroid Build Coastguard Worker
179*333d2b36SAndroid Build Coastguard Workerfunc TestShTestExtraTestConfig(t *testing.T) {
180*333d2b36SAndroid Build Coastguard Worker	result, _ := testShBinary(t, `
181*333d2b36SAndroid Build Coastguard Worker		sh_test {
182*333d2b36SAndroid Build Coastguard Worker			name: "foo",
183*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
184*333d2b36SAndroid Build Coastguard Worker			filename: "test.sh",
185*333d2b36SAndroid Build Coastguard Worker                        extra_test_configs: ["config1.xml", "config2.xml"],
186*333d2b36SAndroid Build Coastguard Worker		}
187*333d2b36SAndroid Build Coastguard Worker	`)
188*333d2b36SAndroid Build Coastguard Worker
189*333d2b36SAndroid Build Coastguard Worker	mod := result.ModuleForTests("foo", "android_arm64_armv8-a").Module().(*ShTest)
190*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, result, mod)[0]
191*333d2b36SAndroid Build Coastguard Worker	actualData := entries.EntryMap["LOCAL_EXTRA_FULL_TEST_CONFIGS"]
192*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "extra_configs", result.Config(), []string{"config1.xml", "config2.xml"}, actualData)
193*333d2b36SAndroid Build Coastguard Worker}
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Workerfunc TestShTestHost_dataDeviceModules(t *testing.T) {
196*333d2b36SAndroid Build Coastguard Worker	ctx, config := testShBinary(t, `
197*333d2b36SAndroid Build Coastguard Worker		sh_test_host {
198*333d2b36SAndroid Build Coastguard Worker			name: "foo",
199*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
200*333d2b36SAndroid Build Coastguard Worker			data_device_bins: ["bar"],
201*333d2b36SAndroid Build Coastguard Worker			data_device_libs: ["libbar"],
202*333d2b36SAndroid Build Coastguard Worker		}
203*333d2b36SAndroid Build Coastguard Worker
204*333d2b36SAndroid Build Coastguard Worker		cc_binary {
205*333d2b36SAndroid Build Coastguard Worker			name: "bar",
206*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
207*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
208*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
209*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
210*333d2b36SAndroid Build Coastguard Worker			stl: "none",
211*333d2b36SAndroid Build Coastguard Worker		}
212*333d2b36SAndroid Build Coastguard Worker
213*333d2b36SAndroid Build Coastguard Worker		cc_library {
214*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
215*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
216*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
217*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
218*333d2b36SAndroid Build Coastguard Worker			stl: "none",
219*333d2b36SAndroid Build Coastguard Worker		}
220*333d2b36SAndroid Build Coastguard Worker	`)
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Worker	buildOS := config.BuildOS.String()
223*333d2b36SAndroid Build Coastguard Worker	variant := buildOS + "_x86_64"
224*333d2b36SAndroid Build Coastguard Worker	foo := ctx.ModuleForTests("foo", variant)
225*333d2b36SAndroid Build Coastguard Worker
226*333d2b36SAndroid Build Coastguard Worker	relocated := foo.Output(filepath.Join("out/soong/.intermediates/foo", variant, "relocated/lib64/libbar.so"))
227*333d2b36SAndroid Build Coastguard Worker	expectedInput := "out/soong/.intermediates/libbar/android_arm64_armv8-a_shared/libbar.so"
228*333d2b36SAndroid Build Coastguard Worker	android.AssertPathRelativeToTopEquals(t, "relocation input", expectedInput, relocated.Input)
229*333d2b36SAndroid Build Coastguard Worker
230*333d2b36SAndroid Build Coastguard Worker	mod := foo.Module().(*ShTest)
231*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0]
232*333d2b36SAndroid Build Coastguard Worker	expectedData := []string{
233*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/bar/android_arm64_armv8-a/:bar",
234*333d2b36SAndroid Build Coastguard Worker		// libbar has been relocated, and so has a variant that matches the host arch.
235*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/foo/" + variant + "/relocated/:lib64/libbar.so",
236*333d2b36SAndroid Build Coastguard Worker	}
237*333d2b36SAndroid Build Coastguard Worker	actualData := entries.EntryMap["LOCAL_TEST_DATA"]
238*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData)
239*333d2b36SAndroid Build Coastguard Worker}
240*333d2b36SAndroid Build Coastguard Worker
241*333d2b36SAndroid Build Coastguard Workerfunc TestShTestHost_dataDeviceModulesAutogenTradefedConfig(t *testing.T) {
242*333d2b36SAndroid Build Coastguard Worker	ctx, config := testShBinary(t, `
243*333d2b36SAndroid Build Coastguard Worker		sh_test_host {
244*333d2b36SAndroid Build Coastguard Worker			name: "foo",
245*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
246*333d2b36SAndroid Build Coastguard Worker			data_device_bins: ["bar"],
247*333d2b36SAndroid Build Coastguard Worker			data_device_libs: ["libbar"],
248*333d2b36SAndroid Build Coastguard Worker		}
249*333d2b36SAndroid Build Coastguard Worker
250*333d2b36SAndroid Build Coastguard Worker		cc_binary {
251*333d2b36SAndroid Build Coastguard Worker			name: "bar",
252*333d2b36SAndroid Build Coastguard Worker			shared_libs: ["libbar"],
253*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
254*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
255*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
256*333d2b36SAndroid Build Coastguard Worker			stl: "none",
257*333d2b36SAndroid Build Coastguard Worker		}
258*333d2b36SAndroid Build Coastguard Worker
259*333d2b36SAndroid Build Coastguard Worker		cc_library {
260*333d2b36SAndroid Build Coastguard Worker			name: "libbar",
261*333d2b36SAndroid Build Coastguard Worker			no_libcrt: true,
262*333d2b36SAndroid Build Coastguard Worker			nocrt: true,
263*333d2b36SAndroid Build Coastguard Worker			system_shared_libs: [],
264*333d2b36SAndroid Build Coastguard Worker			stl: "none",
265*333d2b36SAndroid Build Coastguard Worker		}
266*333d2b36SAndroid Build Coastguard Worker	`)
267*333d2b36SAndroid Build Coastguard Worker
268*333d2b36SAndroid Build Coastguard Worker	buildOS := config.BuildOS.String()
269*333d2b36SAndroid Build Coastguard Worker	fooModule := ctx.ModuleForTests("foo", buildOS+"_x86_64")
270*333d2b36SAndroid Build Coastguard Worker
271*333d2b36SAndroid Build Coastguard Worker	expectedBinAutogenConfig := `<option name="push-file" key="bar" value="/data/local/tests/unrestricted/foo/bar" />`
272*333d2b36SAndroid Build Coastguard Worker	autogen := fooModule.Rule("autogen")
273*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(autogen.Args["extraConfigs"], expectedBinAutogenConfig) {
274*333d2b36SAndroid Build Coastguard Worker		t.Errorf("foo extraConfings %v does not contain %q", autogen.Args["extraConfigs"], expectedBinAutogenConfig)
275*333d2b36SAndroid Build Coastguard Worker	}
276*333d2b36SAndroid Build Coastguard Worker}
277*333d2b36SAndroid Build Coastguard Worker
278*333d2b36SAndroid Build Coastguard Workerfunc TestShTestHost_javaData(t *testing.T) {
279*333d2b36SAndroid Build Coastguard Worker	ctx, config := testShBinary(t, `
280*333d2b36SAndroid Build Coastguard Worker		sh_test_host {
281*333d2b36SAndroid Build Coastguard Worker			name: "foo",
282*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
283*333d2b36SAndroid Build Coastguard Worker			filename: "test.sh",
284*333d2b36SAndroid Build Coastguard Worker			data: [
285*333d2b36SAndroid Build Coastguard Worker				"testdata/data1",
286*333d2b36SAndroid Build Coastguard Worker				"testdata/sub/data2",
287*333d2b36SAndroid Build Coastguard Worker			],
288*333d2b36SAndroid Build Coastguard Worker			java_data: [
289*333d2b36SAndroid Build Coastguard Worker				"javalib",
290*333d2b36SAndroid Build Coastguard Worker			],
291*333d2b36SAndroid Build Coastguard Worker		}
292*333d2b36SAndroid Build Coastguard Worker
293*333d2b36SAndroid Build Coastguard Worker		java_library_host {
294*333d2b36SAndroid Build Coastguard Worker			name: "javalib",
295*333d2b36SAndroid Build Coastguard Worker			srcs: [],
296*333d2b36SAndroid Build Coastguard Worker		}
297*333d2b36SAndroid Build Coastguard Worker	`)
298*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
299*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("foo", buildOS+"_x86_64").Module().(*ShTest)
300*333d2b36SAndroid Build Coastguard Worker	if !mod.Host() {
301*333d2b36SAndroid Build Coastguard Worker		t.Errorf("host bit is not set for a sh_test_host module.")
302*333d2b36SAndroid Build Coastguard Worker	}
303*333d2b36SAndroid Build Coastguard Worker	expectedData := []string{
304*333d2b36SAndroid Build Coastguard Worker		":testdata/data1",
305*333d2b36SAndroid Build Coastguard Worker		":testdata/sub/data2",
306*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/javalib/" + buildOS + "_common/combined/:javalib.jar",
307*333d2b36SAndroid Build Coastguard Worker	}
308*333d2b36SAndroid Build Coastguard Worker
309*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0]
310*333d2b36SAndroid Build Coastguard Worker	actualData := entries.EntryMap["LOCAL_TEST_DATA"]
311*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData)
312*333d2b36SAndroid Build Coastguard Worker}
313*333d2b36SAndroid Build Coastguard Worker
314*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultsForTests(t *testing.T) {
315*333d2b36SAndroid Build Coastguard Worker	ctx, config := testShBinary(t, `
316*333d2b36SAndroid Build Coastguard Worker		sh_defaults {
317*333d2b36SAndroid Build Coastguard Worker			name: "defaults",
318*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
319*333d2b36SAndroid Build Coastguard Worker			filename: "test.sh",
320*333d2b36SAndroid Build Coastguard Worker			data: [
321*333d2b36SAndroid Build Coastguard Worker				"testdata/data1",
322*333d2b36SAndroid Build Coastguard Worker				"testdata/sub/data2",
323*333d2b36SAndroid Build Coastguard Worker			],
324*333d2b36SAndroid Build Coastguard Worker		}
325*333d2b36SAndroid Build Coastguard Worker		sh_test_host {
326*333d2b36SAndroid Build Coastguard Worker			name: "foo",
327*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
328*333d2b36SAndroid Build Coastguard Worker			data: [
329*333d2b36SAndroid Build Coastguard Worker				"testdata/more_data",
330*333d2b36SAndroid Build Coastguard Worker			],
331*333d2b36SAndroid Build Coastguard Worker			java_data: [
332*333d2b36SAndroid Build Coastguard Worker				"javalib",
333*333d2b36SAndroid Build Coastguard Worker			],
334*333d2b36SAndroid Build Coastguard Worker		}
335*333d2b36SAndroid Build Coastguard Worker
336*333d2b36SAndroid Build Coastguard Worker		java_library_host {
337*333d2b36SAndroid Build Coastguard Worker			name: "javalib",
338*333d2b36SAndroid Build Coastguard Worker			srcs: [],
339*333d2b36SAndroid Build Coastguard Worker		}
340*333d2b36SAndroid Build Coastguard Worker
341*333d2b36SAndroid Build Coastguard Worker		sh_test {
342*333d2b36SAndroid Build Coastguard Worker			name: "sh-test",
343*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
344*333d2b36SAndroid Build Coastguard Worker		}
345*333d2b36SAndroid Build Coastguard Worker
346*333d2b36SAndroid Build Coastguard Worker	`)
347*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
348*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("foo", buildOS+"_x86_64").Module().(*ShTest)
349*333d2b36SAndroid Build Coastguard Worker	if !mod.Host() {
350*333d2b36SAndroid Build Coastguard Worker		t.Errorf("host bit is not set for a sh_test_host module.")
351*333d2b36SAndroid Build Coastguard Worker	}
352*333d2b36SAndroid Build Coastguard Worker	expectedData := []string{
353*333d2b36SAndroid Build Coastguard Worker		":testdata/data1",
354*333d2b36SAndroid Build Coastguard Worker		":testdata/sub/data2",
355*333d2b36SAndroid Build Coastguard Worker		":testdata/more_data",
356*333d2b36SAndroid Build Coastguard Worker		"out/soong/.intermediates/javalib/" + buildOS + "_common/combined/:javalib.jar",
357*333d2b36SAndroid Build Coastguard Worker	}
358*333d2b36SAndroid Build Coastguard Worker
359*333d2b36SAndroid Build Coastguard Worker	entries := android.AndroidMkEntriesForTest(t, ctx, mod)[0]
360*333d2b36SAndroid Build Coastguard Worker	actualData := entries.EntryMap["LOCAL_TEST_DATA"]
361*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData)
362*333d2b36SAndroid Build Coastguard Worker
363*333d2b36SAndroid Build Coastguard Worker	// Just the defaults
364*333d2b36SAndroid Build Coastguard Worker	expectedData = []string{
365*333d2b36SAndroid Build Coastguard Worker		":testdata/data1",
366*333d2b36SAndroid Build Coastguard Worker		":testdata/sub/data2",
367*333d2b36SAndroid Build Coastguard Worker	}
368*333d2b36SAndroid Build Coastguard Worker	mod = ctx.ModuleForTests("sh-test", "android_arm64_armv8-a").Module().(*ShTest)
369*333d2b36SAndroid Build Coastguard Worker	entries = android.AndroidMkEntriesForTest(t, ctx, mod)[0]
370*333d2b36SAndroid Build Coastguard Worker	actualData = entries.EntryMap["LOCAL_TEST_DATA"]
371*333d2b36SAndroid Build Coastguard Worker	android.AssertStringPathsRelativeToTopEquals(t, "LOCAL_TEST_DATA", config, expectedData, actualData)
372*333d2b36SAndroid Build Coastguard Worker}
373*333d2b36SAndroid Build Coastguard Worker
374*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultsForBinaries(t *testing.T) {
375*333d2b36SAndroid Build Coastguard Worker	ctx, _ := testShBinary(t, `
376*333d2b36SAndroid Build Coastguard Worker		sh_defaults {
377*333d2b36SAndroid Build Coastguard Worker			name: "defaults",
378*333d2b36SAndroid Build Coastguard Worker			src: "test.sh",
379*333d2b36SAndroid Build Coastguard Worker			filename: "test.sh",
380*333d2b36SAndroid Build Coastguard Worker		}
381*333d2b36SAndroid Build Coastguard Worker		sh_binary_host {
382*333d2b36SAndroid Build Coastguard Worker			name: "the-host-binary",
383*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
384*333d2b36SAndroid Build Coastguard Worker		}
385*333d2b36SAndroid Build Coastguard Worker		sh_binary{
386*333d2b36SAndroid Build Coastguard Worker			name: "the-binary",
387*333d2b36SAndroid Build Coastguard Worker			defaults: ["defaults"],
388*333d2b36SAndroid Build Coastguard Worker		}
389*333d2b36SAndroid Build Coastguard Worker	`)
390*333d2b36SAndroid Build Coastguard Worker	buildOS := ctx.Config().BuildOS.String()
391*333d2b36SAndroid Build Coastguard Worker	mod := ctx.ModuleForTests("the-host-binary", buildOS+"_x86_64").Module().(*ShBinary)
392*333d2b36SAndroid Build Coastguard Worker	if !mod.Host() {
393*333d2b36SAndroid Build Coastguard Worker		t.Errorf("host bit is not set for a sh_binary_host module.")
394*333d2b36SAndroid Build Coastguard Worker	}
395*333d2b36SAndroid Build Coastguard Worker
396*333d2b36SAndroid Build Coastguard Worker	expectedFilename := "test.sh"
397*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Filename", expectedFilename, *mod.properties.Filename)
398*333d2b36SAndroid Build Coastguard Worker
399*333d2b36SAndroid Build Coastguard Worker	mod = ctx.ModuleForTests("the-binary", "android_arm64_armv8-a").Module().(*ShBinary)
400*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "Filename", expectedFilename, *mod.properties.Filename)
401*333d2b36SAndroid Build Coastguard Worker}
402