xref: /aosp_15_r20/build/soong/cc/orderfile_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2023 Google Inc. All rights reserved.
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 cc
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 TestOrderfileProfileSharedLibrary(t *testing.T) {
25*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
26*333d2b36SAndroid Build Coastguard Worker	bp := `
27*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
28*333d2b36SAndroid Build Coastguard Worker		name: "libTest",
29*333d2b36SAndroid Build Coastguard Worker		srcs: ["test.c"],
30*333d2b36SAndroid Build Coastguard Worker		orderfile : {
31*333d2b36SAndroid Build Coastguard Worker			instrumentation: true,
32*333d2b36SAndroid Build Coastguard Worker			load_order_file: false,
33*333d2b36SAndroid Build Coastguard Worker			order_file_path: "",
34*333d2b36SAndroid Build Coastguard Worker		},
35*333d2b36SAndroid Build Coastguard Worker	}
36*333d2b36SAndroid Build Coastguard Worker	`
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
39*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
40*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
41*333d2b36SAndroid Build Coastguard Worker
42*333d2b36SAndroid Build Coastguard Worker	expectedCFlag := "-forder-file-instrumentation"
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Worker	libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared")
45*333d2b36SAndroid Build Coastguard Worker
46*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of orderfile-enabled module
47*333d2b36SAndroid Build Coastguard Worker	cFlags := libTest.Rule("cc").Args["cFlags"]
48*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(cFlags, expectedCFlag) {
49*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libTest' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags)
50*333d2b36SAndroid Build Coastguard Worker	}
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Worker	// Check ldFlags of orderfile-enabled module
53*333d2b36SAndroid Build Coastguard Worker	ldFlags := libTest.Rule("ld").Args["ldFlags"]
54*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ldFlags, expectedCFlag) {
55*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libTest' to enable orderfile, but did not find %q in ldflags %q", expectedCFlag, ldFlags)
56*333d2b36SAndroid Build Coastguard Worker	}
57*333d2b36SAndroid Build Coastguard Worker}
58*333d2b36SAndroid Build Coastguard Worker
59*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileLoadSharedLibrary(t *testing.T) {
60*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
61*333d2b36SAndroid Build Coastguard Worker	bp := `
62*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
63*333d2b36SAndroid Build Coastguard Worker		name: "libTest",
64*333d2b36SAndroid Build Coastguard Worker		srcs: ["test.c"],
65*333d2b36SAndroid Build Coastguard Worker		orderfile : {
66*333d2b36SAndroid Build Coastguard Worker			instrumentation: true,
67*333d2b36SAndroid Build Coastguard Worker			load_order_file: true,
68*333d2b36SAndroid Build Coastguard Worker			order_file_path: "libTest.orderfile",
69*333d2b36SAndroid Build Coastguard Worker		},
70*333d2b36SAndroid Build Coastguard Worker	}
71*333d2b36SAndroid Build Coastguard Worker	`
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
74*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
75*333d2b36SAndroid Build Coastguard Worker		android.FixtureAddTextFile("toolchain/pgo-profiles/orderfiles/libTest.orderfile", "TEST"),
76*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
77*333d2b36SAndroid Build Coastguard Worker
78*333d2b36SAndroid Build Coastguard Worker	expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/libTest.orderfile"
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared")
81*333d2b36SAndroid Build Coastguard Worker
82*333d2b36SAndroid Build Coastguard Worker	// Check ldFlags of orderfile-enabled module
83*333d2b36SAndroid Build Coastguard Worker	ldFlags := libTest.Rule("ld").Args["ldFlags"]
84*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ldFlags, expectedCFlag) {
85*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libTest' to load orderfile, but did not find %q in ldflags %q", expectedCFlag, ldFlags)
86*333d2b36SAndroid Build Coastguard Worker	}
87*333d2b36SAndroid Build Coastguard Worker}
88*333d2b36SAndroid Build Coastguard Worker
89*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfileBinary(t *testing.T) {
90*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
91*333d2b36SAndroid Build Coastguard Worker	bp := `
92*333d2b36SAndroid Build Coastguard Worker	cc_binary {
93*333d2b36SAndroid Build Coastguard Worker		name: "test",
94*333d2b36SAndroid Build Coastguard Worker		srcs: ["test.c"],
95*333d2b36SAndroid Build Coastguard Worker		orderfile : {
96*333d2b36SAndroid Build Coastguard Worker			instrumentation: true,
97*333d2b36SAndroid Build Coastguard Worker			load_order_file: false,
98*333d2b36SAndroid Build Coastguard Worker			order_file_path: "",
99*333d2b36SAndroid Build Coastguard Worker		},
100*333d2b36SAndroid Build Coastguard Worker	}
101*333d2b36SAndroid Build Coastguard Worker	`
102*333d2b36SAndroid Build Coastguard Worker
103*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
104*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
105*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
106*333d2b36SAndroid Build Coastguard Worker
107*333d2b36SAndroid Build Coastguard Worker	expectedCFlag := "-forder-file-instrumentation"
108*333d2b36SAndroid Build Coastguard Worker
109*333d2b36SAndroid Build Coastguard Worker	test := result.ModuleForTests("test", "android_arm64_armv8-a")
110*333d2b36SAndroid Build Coastguard Worker
111*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of orderfile-enabled module
112*333d2b36SAndroid Build Coastguard Worker	cFlags := test.Rule("cc").Args["cFlags"]
113*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(cFlags, expectedCFlag) {
114*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'test' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags)
115*333d2b36SAndroid Build Coastguard Worker	}
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker	// Check ldFlags of orderfile-enabled module
118*333d2b36SAndroid Build Coastguard Worker	ldFlags := test.Rule("ld").Args["ldFlags"]
119*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ldFlags, expectedCFlag) {
120*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'test' to enable orderfile, but did not find %q in ldflags %q", expectedCFlag, ldFlags)
121*333d2b36SAndroid Build Coastguard Worker	}
122*333d2b36SAndroid Build Coastguard Worker}
123*333d2b36SAndroid Build Coastguard Worker
124*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileLoadBinary(t *testing.T) {
125*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
126*333d2b36SAndroid Build Coastguard Worker	bp := `
127*333d2b36SAndroid Build Coastguard Worker	cc_binary {
128*333d2b36SAndroid Build Coastguard Worker		name: "test",
129*333d2b36SAndroid Build Coastguard Worker		srcs: ["test.c"],
130*333d2b36SAndroid Build Coastguard Worker		orderfile : {
131*333d2b36SAndroid Build Coastguard Worker			instrumentation: true,
132*333d2b36SAndroid Build Coastguard Worker			load_order_file: true,
133*333d2b36SAndroid Build Coastguard Worker			order_file_path: "test.orderfile",
134*333d2b36SAndroid Build Coastguard Worker		},
135*333d2b36SAndroid Build Coastguard Worker	}
136*333d2b36SAndroid Build Coastguard Worker	`
137*333d2b36SAndroid Build Coastguard Worker
138*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
139*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
140*333d2b36SAndroid Build Coastguard Worker		android.FixtureAddTextFile("toolchain/pgo-profiles/orderfiles/test.orderfile", "TEST"),
141*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
142*333d2b36SAndroid Build Coastguard Worker
143*333d2b36SAndroid Build Coastguard Worker	expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/test.orderfile"
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Worker	test := result.ModuleForTests("test", "android_arm64_armv8-a")
146*333d2b36SAndroid Build Coastguard Worker
147*333d2b36SAndroid Build Coastguard Worker	// Check ldFlags of orderfile-enabled module
148*333d2b36SAndroid Build Coastguard Worker	ldFlags := test.Rule("ld").Args["ldFlags"]
149*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ldFlags, expectedCFlag) {
150*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'test' to load orderfile, but did not find %q in ldflags %q", expectedCFlag, ldFlags)
151*333d2b36SAndroid Build Coastguard Worker	}
152*333d2b36SAndroid Build Coastguard Worker}
153*333d2b36SAndroid Build Coastguard Worker
154*333d2b36SAndroid Build Coastguard Worker// Profile flags should propagate through static libraries
155*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfilePropagateStaticDeps(t *testing.T) {
156*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
157*333d2b36SAndroid Build Coastguard Worker	bp := `
158*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
159*333d2b36SAndroid Build Coastguard Worker		name: "libTest",
160*333d2b36SAndroid Build Coastguard Worker		srcs: ["test.c"],
161*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libFoo"],
162*333d2b36SAndroid Build Coastguard Worker		orderfile : {
163*333d2b36SAndroid Build Coastguard Worker			instrumentation: true,
164*333d2b36SAndroid Build Coastguard Worker			load_order_file: false,
165*333d2b36SAndroid Build Coastguard Worker			order_file_path: "",
166*333d2b36SAndroid Build Coastguard Worker		},
167*333d2b36SAndroid Build Coastguard Worker	}
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
170*333d2b36SAndroid Build Coastguard Worker		name: "libFoo",
171*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo.c"],
172*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libBar"],
173*333d2b36SAndroid Build Coastguard Worker	}
174*333d2b36SAndroid Build Coastguard Worker
175*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
176*333d2b36SAndroid Build Coastguard Worker		name: "libBar",
177*333d2b36SAndroid Build Coastguard Worker		srcs: ["bar.c"],
178*333d2b36SAndroid Build Coastguard Worker	}
179*333d2b36SAndroid Build Coastguard Worker	`
180*333d2b36SAndroid Build Coastguard Worker
181*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
182*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
183*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
184*333d2b36SAndroid Build Coastguard Worker
185*333d2b36SAndroid Build Coastguard Worker	expectedCFlag := "-forder-file-instrumentation"
186*333d2b36SAndroid Build Coastguard Worker
187*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of orderfile-enabled module
188*333d2b36SAndroid Build Coastguard Worker	libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared")
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker	cFlags := libTest.Rule("cc").Args["cFlags"]
191*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(cFlags, expectedCFlag) {
192*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libTest' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags)
193*333d2b36SAndroid Build Coastguard Worker	}
194*333d2b36SAndroid Build Coastguard Worker
195*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of orderfile variant static libraries
196*333d2b36SAndroid Build Coastguard Worker	libFooOfVariant := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static_orderfile")
197*333d2b36SAndroid Build Coastguard Worker	libBarOfVariant := result.ModuleForTests("libBar", "android_arm64_armv8-a_static_orderfile")
198*333d2b36SAndroid Build Coastguard Worker
199*333d2b36SAndroid Build Coastguard Worker	cFlags = libFooOfVariant.Rule("cc").Args["cFlags"]
200*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(cFlags, expectedCFlag) {
201*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libFooOfVariant' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags)
202*333d2b36SAndroid Build Coastguard Worker	}
203*333d2b36SAndroid Build Coastguard Worker
204*333d2b36SAndroid Build Coastguard Worker	cFlags = libBarOfVariant.Rule("cc").Args["cFlags"]
205*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(cFlags, expectedCFlag) {
206*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libBarOfVariant' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags)
207*333d2b36SAndroid Build Coastguard Worker	}
208*333d2b36SAndroid Build Coastguard Worker
209*333d2b36SAndroid Build Coastguard Worker	// Check dependency edge from orderfile-enabled module to orderfile variant static libraries
210*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libTest.Module(), libFooOfVariant.Module()) {
211*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest missing dependency on orderfile variant of libFoo")
212*333d2b36SAndroid Build Coastguard Worker	}
213*333d2b36SAndroid Build Coastguard Worker
214*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libFooOfVariant.Module(), libBarOfVariant.Module()) {
215*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest missing dependency on orderfile variant of libBar")
216*333d2b36SAndroid Build Coastguard Worker	}
217*333d2b36SAndroid Build Coastguard Worker
218*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of the non-orderfile variant static libraries
219*333d2b36SAndroid Build Coastguard Worker	libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static")
220*333d2b36SAndroid Build Coastguard Worker	libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static")
221*333d2b36SAndroid Build Coastguard Worker
222*333d2b36SAndroid Build Coastguard Worker	cFlags = libFoo.Rule("cc").Args["cFlags"]
223*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(cFlags, expectedCFlag) {
224*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libFoo' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags)
225*333d2b36SAndroid Build Coastguard Worker	}
226*333d2b36SAndroid Build Coastguard Worker
227*333d2b36SAndroid Build Coastguard Worker	cFlags = libBar.Rule("cc").Args["cFlags"]
228*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(cFlags, expectedCFlag) {
229*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libBar' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags)
230*333d2b36SAndroid Build Coastguard Worker	}
231*333d2b36SAndroid Build Coastguard Worker
232*333d2b36SAndroid Build Coastguard Worker	// Check no dependency edge from orderfile-enabled module to non-orderfile variant static libraries
233*333d2b36SAndroid Build Coastguard Worker	if hasDirectDep(result, libTest.Module(), libFoo.Module()) {
234*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest has dependency on non-orderfile variant of libFoo")
235*333d2b36SAndroid Build Coastguard Worker	}
236*333d2b36SAndroid Build Coastguard Worker
237*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libFoo.Module(), libBar.Module()) {
238*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest has dependency on non-orderfile variant of libBar")
239*333d2b36SAndroid Build Coastguard Worker	}
240*333d2b36SAndroid Build Coastguard Worker}
241*333d2b36SAndroid Build Coastguard Worker
242*333d2b36SAndroid Build Coastguard Worker// Load flags should never propagate
243*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileLoadPropagateStaticDeps(t *testing.T) {
244*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
245*333d2b36SAndroid Build Coastguard Worker	bp := `
246*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
247*333d2b36SAndroid Build Coastguard Worker		name: "libTest",
248*333d2b36SAndroid Build Coastguard Worker		srcs: ["test.c"],
249*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libFoo"],
250*333d2b36SAndroid Build Coastguard Worker		orderfile : {
251*333d2b36SAndroid Build Coastguard Worker			instrumentation: true,
252*333d2b36SAndroid Build Coastguard Worker			load_order_file: true,
253*333d2b36SAndroid Build Coastguard Worker			order_file_path: "test.orderfile",
254*333d2b36SAndroid Build Coastguard Worker		},
255*333d2b36SAndroid Build Coastguard Worker	}
256*333d2b36SAndroid Build Coastguard Worker
257*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
258*333d2b36SAndroid Build Coastguard Worker		name: "libFoo",
259*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo.c"],
260*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libBar"],
261*333d2b36SAndroid Build Coastguard Worker	}
262*333d2b36SAndroid Build Coastguard Worker
263*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
264*333d2b36SAndroid Build Coastguard Worker		name: "libBar",
265*333d2b36SAndroid Build Coastguard Worker		srcs: ["bar.c"],
266*333d2b36SAndroid Build Coastguard Worker	}
267*333d2b36SAndroid Build Coastguard Worker	`
268*333d2b36SAndroid Build Coastguard Worker
269*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
270*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
271*333d2b36SAndroid Build Coastguard Worker		android.FixtureAddTextFile("toolchain/pgo-profiles/orderfiles/test.orderfile", "TEST"),
272*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
273*333d2b36SAndroid Build Coastguard Worker
274*333d2b36SAndroid Build Coastguard Worker	expectedCFlag := "-Wl,--symbol-ordering-file=toolchain/pgo-profiles/orderfiles/test.orderfile"
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Worker	// Check ldFlags of orderfile-enabled module
277*333d2b36SAndroid Build Coastguard Worker	libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared")
278*333d2b36SAndroid Build Coastguard Worker
279*333d2b36SAndroid Build Coastguard Worker	ldFlags := libTest.Rule("ld").Args["ldFlags"]
280*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(ldFlags, expectedCFlag) {
281*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libTest' to load orderfile, but did not find %q in ldFlags %q", expectedCFlag, ldFlags)
282*333d2b36SAndroid Build Coastguard Worker	}
283*333d2b36SAndroid Build Coastguard Worker
284*333d2b36SAndroid Build Coastguard Worker	libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static")
285*333d2b36SAndroid Build Coastguard Worker	libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static")
286*333d2b36SAndroid Build Coastguard Worker
287*333d2b36SAndroid Build Coastguard Worker	// Check dependency edge from orderfile-enabled module to non-orderfile variant static libraries
288*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libTest.Module(), libFoo.Module()) {
289*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest missing dependency on non-orderfile variant of libFoo")
290*333d2b36SAndroid Build Coastguard Worker	}
291*333d2b36SAndroid Build Coastguard Worker
292*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libFoo.Module(), libBar.Module()) {
293*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest missing dependency on non-orderfile variant of libBar")
294*333d2b36SAndroid Build Coastguard Worker	}
295*333d2b36SAndroid Build Coastguard Worker
296*333d2b36SAndroid Build Coastguard Worker	// Make sure no orderfile variants are created for static libraries because the flags were not propagated
297*333d2b36SAndroid Build Coastguard Worker	libFooVariants := result.ModuleVariantsForTests("libFoo")
298*333d2b36SAndroid Build Coastguard Worker	for _, v := range libFooVariants {
299*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(v, "orderfile") {
300*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Expected variants for 'libFoo' to not contain 'orderfile', but found %q", v)
301*333d2b36SAndroid Build Coastguard Worker		}
302*333d2b36SAndroid Build Coastguard Worker	}
303*333d2b36SAndroid Build Coastguard Worker
304*333d2b36SAndroid Build Coastguard Worker	libBarVariants := result.ModuleVariantsForTests("libBar")
305*333d2b36SAndroid Build Coastguard Worker	for _, v := range libBarVariants {
306*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(v, "orderfile") {
307*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Expected variants for 'libBar' to not contain 'orderfile', but found %q", v)
308*333d2b36SAndroid Build Coastguard Worker		}
309*333d2b36SAndroid Build Coastguard Worker	}
310*333d2b36SAndroid Build Coastguard Worker}
311*333d2b36SAndroid Build Coastguard Worker
312*333d2b36SAndroid Build Coastguard Worker// Profile flags should not propagate through shared libraries
313*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfilePropagateSharedDeps(t *testing.T) {
314*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
315*333d2b36SAndroid Build Coastguard Worker	bp := `
316*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
317*333d2b36SAndroid Build Coastguard Worker		name: "libTest",
318*333d2b36SAndroid Build Coastguard Worker		srcs: ["test.c"],
319*333d2b36SAndroid Build Coastguard Worker		shared_libs: ["libFoo"],
320*333d2b36SAndroid Build Coastguard Worker		orderfile : {
321*333d2b36SAndroid Build Coastguard Worker			instrumentation: true,
322*333d2b36SAndroid Build Coastguard Worker			load_order_file: false,
323*333d2b36SAndroid Build Coastguard Worker			order_file_path: "",
324*333d2b36SAndroid Build Coastguard Worker		},
325*333d2b36SAndroid Build Coastguard Worker	}
326*333d2b36SAndroid Build Coastguard Worker
327*333d2b36SAndroid Build Coastguard Worker	cc_library_shared {
328*333d2b36SAndroid Build Coastguard Worker		name: "libFoo",
329*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo.c"],
330*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libBar"],
331*333d2b36SAndroid Build Coastguard Worker	}
332*333d2b36SAndroid Build Coastguard Worker
333*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
334*333d2b36SAndroid Build Coastguard Worker		name: "libBar",
335*333d2b36SAndroid Build Coastguard Worker		srcs: ["bar.c"],
336*333d2b36SAndroid Build Coastguard Worker	}
337*333d2b36SAndroid Build Coastguard Worker	`
338*333d2b36SAndroid Build Coastguard Worker
339*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
340*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
341*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
342*333d2b36SAndroid Build Coastguard Worker
343*333d2b36SAndroid Build Coastguard Worker	expectedCFlag := "-forder-file-instrumentation"
344*333d2b36SAndroid Build Coastguard Worker
345*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of orderfile-enabled module
346*333d2b36SAndroid Build Coastguard Worker	libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_shared")
347*333d2b36SAndroid Build Coastguard Worker
348*333d2b36SAndroid Build Coastguard Worker	cFlags := libTest.Rule("cc").Args["cFlags"]
349*333d2b36SAndroid Build Coastguard Worker	if !strings.Contains(cFlags, expectedCFlag) {
350*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libTest' to enable orderfile, but did not find %q in cflags %q", expectedCFlag, cFlags)
351*333d2b36SAndroid Build Coastguard Worker	}
352*333d2b36SAndroid Build Coastguard Worker
353*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of the static and shared libraries
354*333d2b36SAndroid Build Coastguard Worker	libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_shared")
355*333d2b36SAndroid Build Coastguard Worker	libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static")
356*333d2b36SAndroid Build Coastguard Worker
357*333d2b36SAndroid Build Coastguard Worker	cFlags = libFoo.Rule("cc").Args["cFlags"]
358*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(cFlags, expectedCFlag) {
359*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libFoo' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags)
360*333d2b36SAndroid Build Coastguard Worker	}
361*333d2b36SAndroid Build Coastguard Worker
362*333d2b36SAndroid Build Coastguard Worker	cFlags = libBar.Rule("cc").Args["cFlags"]
363*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(cFlags, expectedCFlag) {
364*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libBar' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags)
365*333d2b36SAndroid Build Coastguard Worker	}
366*333d2b36SAndroid Build Coastguard Worker
367*333d2b36SAndroid Build Coastguard Worker	// Check dependency edge from orderfile-enabled module to non-orderfile variant static libraries
368*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libTest.Module(), libFoo.Module()) {
369*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest missing dependency on non-orderfile variant of libFoo")
370*333d2b36SAndroid Build Coastguard Worker	}
371*333d2b36SAndroid Build Coastguard Worker
372*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libFoo.Module(), libBar.Module()) {
373*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest missing dependency on non-orderfile variant of libBar")
374*333d2b36SAndroid Build Coastguard Worker	}
375*333d2b36SAndroid Build Coastguard Worker
376*333d2b36SAndroid Build Coastguard Worker	// Make sure no orderfile variants are created for libraries because the flags were not propagated
377*333d2b36SAndroid Build Coastguard Worker	libFooVariants := result.ModuleVariantsForTests("libFoo")
378*333d2b36SAndroid Build Coastguard Worker	for _, v := range libFooVariants {
379*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(v, "orderfile") {
380*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Expected variants for 'libFoo' to not contain 'orderfile', but found %q", v)
381*333d2b36SAndroid Build Coastguard Worker		}
382*333d2b36SAndroid Build Coastguard Worker	}
383*333d2b36SAndroid Build Coastguard Worker
384*333d2b36SAndroid Build Coastguard Worker	libBarVariants := result.ModuleVariantsForTests("libBar")
385*333d2b36SAndroid Build Coastguard Worker	for _, v := range libBarVariants {
386*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(v, "orderfile") {
387*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Expected variants for 'libBar' to not contain 'orderfile', but found %q", v)
388*333d2b36SAndroid Build Coastguard Worker		}
389*333d2b36SAndroid Build Coastguard Worker	}
390*333d2b36SAndroid Build Coastguard Worker}
391*333d2b36SAndroid Build Coastguard Worker
392*333d2b36SAndroid Build Coastguard Worker// Profile flags should not work or be propagated if orderfile flags start at a static library
393*333d2b36SAndroid Build Coastguard Workerfunc TestOrderfileProfileStaticLibrary(t *testing.T) {
394*333d2b36SAndroid Build Coastguard Worker	t.Parallel()
395*333d2b36SAndroid Build Coastguard Worker	bp := `
396*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
397*333d2b36SAndroid Build Coastguard Worker		name: "libTest",
398*333d2b36SAndroid Build Coastguard Worker		srcs: ["test.c"],
399*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libFoo"],
400*333d2b36SAndroid Build Coastguard Worker		orderfile : {
401*333d2b36SAndroid Build Coastguard Worker			instrumentation: true,
402*333d2b36SAndroid Build Coastguard Worker			load_order_file: false,
403*333d2b36SAndroid Build Coastguard Worker			order_file_path: "",
404*333d2b36SAndroid Build Coastguard Worker		},
405*333d2b36SAndroid Build Coastguard Worker	}
406*333d2b36SAndroid Build Coastguard Worker
407*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
408*333d2b36SAndroid Build Coastguard Worker		name: "libFoo",
409*333d2b36SAndroid Build Coastguard Worker		srcs: ["foo.c"],
410*333d2b36SAndroid Build Coastguard Worker		static_libs: ["libBar"],
411*333d2b36SAndroid Build Coastguard Worker	}
412*333d2b36SAndroid Build Coastguard Worker
413*333d2b36SAndroid Build Coastguard Worker	cc_library_static {
414*333d2b36SAndroid Build Coastguard Worker		name: "libBar",
415*333d2b36SAndroid Build Coastguard Worker		srcs: ["bar.c"],
416*333d2b36SAndroid Build Coastguard Worker	}
417*333d2b36SAndroid Build Coastguard Worker	`
418*333d2b36SAndroid Build Coastguard Worker
419*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
420*333d2b36SAndroid Build Coastguard Worker		prepareForCcTest,
421*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, bp)
422*333d2b36SAndroid Build Coastguard Worker
423*333d2b36SAndroid Build Coastguard Worker	expectedCFlag := "-forder-file-instrumentation"
424*333d2b36SAndroid Build Coastguard Worker
425*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of module
426*333d2b36SAndroid Build Coastguard Worker	libTest := result.ModuleForTests("libTest", "android_arm64_armv8-a_static")
427*333d2b36SAndroid Build Coastguard Worker
428*333d2b36SAndroid Build Coastguard Worker	cFlags := libTest.Rule("cc").Args["cFlags"]
429*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(cFlags, expectedCFlag) {
430*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libTest' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags)
431*333d2b36SAndroid Build Coastguard Worker	}
432*333d2b36SAndroid Build Coastguard Worker
433*333d2b36SAndroid Build Coastguard Worker	// Check cFlags of the static libraries
434*333d2b36SAndroid Build Coastguard Worker	libFoo := result.ModuleForTests("libFoo", "android_arm64_armv8-a_static")
435*333d2b36SAndroid Build Coastguard Worker	libBar := result.ModuleForTests("libBar", "android_arm64_armv8-a_static")
436*333d2b36SAndroid Build Coastguard Worker
437*333d2b36SAndroid Build Coastguard Worker	cFlags = libFoo.Rule("cc").Args["cFlags"]
438*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(cFlags, expectedCFlag) {
439*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libFoo' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags)
440*333d2b36SAndroid Build Coastguard Worker	}
441*333d2b36SAndroid Build Coastguard Worker
442*333d2b36SAndroid Build Coastguard Worker	cFlags = libBar.Rule("cc").Args["cFlags"]
443*333d2b36SAndroid Build Coastguard Worker	if strings.Contains(cFlags, expectedCFlag) {
444*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected 'libBar' to not enable orderfile, but did find %q in cflags %q", expectedCFlag, cFlags)
445*333d2b36SAndroid Build Coastguard Worker	}
446*333d2b36SAndroid Build Coastguard Worker
447*333d2b36SAndroid Build Coastguard Worker	// Check dependency edge from orderfile-enabled module to non-orderfile variant libraries
448*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libTest.Module(), libFoo.Module()) {
449*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest missing dependency on non-orderfile variant of libFoo")
450*333d2b36SAndroid Build Coastguard Worker	}
451*333d2b36SAndroid Build Coastguard Worker
452*333d2b36SAndroid Build Coastguard Worker	if !hasDirectDep(result, libFoo.Module(), libBar.Module()) {
453*333d2b36SAndroid Build Coastguard Worker		t.Errorf("libTest missing dependency on non-orderfile variant of libBar")
454*333d2b36SAndroid Build Coastguard Worker	}
455*333d2b36SAndroid Build Coastguard Worker
456*333d2b36SAndroid Build Coastguard Worker	// Make sure no orderfile variants are created for static libraries because the flags were not propagated
457*333d2b36SAndroid Build Coastguard Worker	libFooVariants := result.ModuleVariantsForTests("libFoo")
458*333d2b36SAndroid Build Coastguard Worker	for _, v := range libFooVariants {
459*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(v, "orderfile") {
460*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Expected variants for 'libFoo' to not contain 'orderfile', but found %q", v)
461*333d2b36SAndroid Build Coastguard Worker		}
462*333d2b36SAndroid Build Coastguard Worker	}
463*333d2b36SAndroid Build Coastguard Worker
464*333d2b36SAndroid Build Coastguard Worker	libBarVariants := result.ModuleVariantsForTests("libBar")
465*333d2b36SAndroid Build Coastguard Worker	for _, v := range libBarVariants {
466*333d2b36SAndroid Build Coastguard Worker		if strings.Contains(v, "orderfile") {
467*333d2b36SAndroid Build Coastguard Worker			t.Errorf("Expected variants for 'libBar' to not contain 'orderfile', but found %q", v)
468*333d2b36SAndroid Build Coastguard Worker		}
469*333d2b36SAndroid Build Coastguard Worker	}
470*333d2b36SAndroid Build Coastguard Worker}
471