xref: /aosp_15_r20/build/soong/sdk/systemserverclasspath_fragment_sdk_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1// Copyright (C) 2021 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package sdk
16
17import (
18	"testing"
19
20	"android/soong/android"
21	"android/soong/dexpreopt"
22	"android/soong/java"
23)
24
25func testSnapshotWithSystemServerClasspathFragment(t *testing.T, sdk string, targetBuildRelease string, expectedSdkSnapshot string) {
26	result := android.GroupFixturePreparers(
27		prepareForSdkTestWithJava,
28		java.PrepareForTestWithJavaDefaultModules,
29		java.PrepareForTestWithJavaSdkLibraryFiles,
30		java.FixtureWithLastReleaseApis("mysdklibrary"),
31		dexpreopt.FixtureSetApexSystemServerJars("myapex:mylib", "myapex:mysdklibrary"),
32		android.FixtureModifyEnv(func(env map[string]string) {
33			if targetBuildRelease != "latest" {
34				env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = targetBuildRelease
35			}
36		}),
37		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
38			variables.Platform_version_active_codenames = []string{"VanillaIceCream"}
39		}),
40		prepareForSdkTestWithApex,
41
42		android.FixtureWithRootAndroidBp(sdk+`
43			apex {
44				name: "myapex",
45				key: "myapex.key",
46				min_sdk_version: "2",
47				systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
48			}
49
50			systemserverclasspath_fragment {
51				name: "mysystemserverclasspathfragment",
52				apex_available: ["myapex"],
53				contents: [
54					"mylib",
55					"mysdklibrary",
56				],
57			}
58
59			java_library {
60				name: "mylib",
61				apex_available: ["myapex"],
62				srcs: ["Test.java"],
63				system_modules: "none",
64				sdk_version: "none",
65				min_sdk_version: "2",
66				compile_dex: true,
67				permitted_packages: ["mylib"],
68				dex_preopt: {
69					profile: "art-profile",
70				},
71			}
72
73			java_sdk_library {
74				name: "mysdklibrary",
75				apex_available: ["myapex"],
76				srcs: ["Test.java"],
77				shared_library: false,
78				public: {enabled: true},
79				min_sdk_version: "2",
80				dex_preopt: {
81					profile: "art-profile",
82				},
83				sdk_version: "current",
84			}
85		`),
86	).RunTest(t)
87
88	CheckSnapshot(t, result, "mysdk", "",
89		checkAndroidBpContents(expectedSdkSnapshot),
90	)
91}
92
93func TestSnapshotWithPartialSystemServerClasspathFragment(t *testing.T) {
94	commonSdk := `
95		apex {
96			name: "myapex",
97			key: "myapex.key",
98			min_sdk_version: "Tiramisu",
99			systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
100		}
101		systemserverclasspath_fragment {
102			name: "mysystemserverclasspathfragment",
103			apex_available: ["myapex"],
104			contents: [
105				"mysdklibrary",
106				"mysdklibrary-future",
107			],
108		}
109		java_sdk_library {
110			name: "mysdklibrary",
111			apex_available: ["myapex"],
112			srcs: ["Test.java"],
113			min_sdk_version: "33", // Tiramisu
114			sdk_version: "current",
115		}
116		java_sdk_library {
117			name: "mysdklibrary-future",
118			apex_available: ["myapex"],
119			srcs: ["Test.java"],
120			min_sdk_version: "34", // UpsideDownCake
121			sdk_version: "current",
122		}
123		sdk {
124			name: "mysdk",
125			apexes: ["myapex"],
126		}
127	`
128
129	result := android.GroupFixturePreparers(
130		prepareForSdkTestWithJava,
131		java.PrepareForTestWithJavaDefaultModules,
132		java.PrepareForTestWithJavaSdkLibraryFiles,
133		java.FixtureWithLastReleaseApis("mysdklibrary", "mysdklibrary-future"),
134		dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary", "myapex:mysdklibrary-future"),
135		android.FixtureModifyEnv(func(env map[string]string) {
136			// targeting Tiramisu here means that we won't export mysdklibrary-future
137			env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu"
138		}),
139		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
140			variables.Platform_version_active_codenames = []string{"UpsideDownCake"}
141		}),
142		prepareForSdkTestWithApex,
143		android.FixtureWithRootAndroidBp(commonSdk),
144	).RunTest(t)
145
146	CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(
147		`// This is auto-generated. DO NOT EDIT.
148
149java_sdk_library_import {
150    name: "mysdklibrary",
151    prefer: false,
152    visibility: ["//visibility:public"],
153    apex_available: ["myapex"],
154    shared_library: true,
155    public: {
156        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
157        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
158        current_api: "sdk_library/public/mysdklibrary.txt",
159        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
160        sdk_version: "current",
161    },
162    system: {
163        jars: ["sdk_library/system/mysdklibrary-stubs.jar"],
164        stub_srcs: ["sdk_library/system/mysdklibrary_stub_sources"],
165        current_api: "sdk_library/system/mysdklibrary.txt",
166        removed_api: "sdk_library/system/mysdklibrary-removed.txt",
167        sdk_version: "system_current",
168    },
169    test: {
170        jars: ["sdk_library/test/mysdklibrary-stubs.jar"],
171        stub_srcs: ["sdk_library/test/mysdklibrary_stub_sources"],
172        current_api: "sdk_library/test/mysdklibrary.txt",
173        removed_api: "sdk_library/test/mysdklibrary-removed.txt",
174        sdk_version: "test_current",
175    },
176}
177
178prebuilt_systemserverclasspath_fragment {
179    name: "mysystemserverclasspathfragment",
180    prefer: false,
181    visibility: ["//visibility:public"],
182    apex_available: ["myapex"],
183    contents: ["mysdklibrary"],
184} `))
185}
186
187func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) {
188	commonSdk := `
189		apex {
190			name: "myapex",
191			key: "myapex.key",
192			min_sdk_version: "Tiramisu",
193			systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
194		}
195		systemserverclasspath_fragment {
196			name: "mysystemserverclasspathfragment",
197			apex_available: ["myapex"],
198			contents: ["mysdklibrary"],
199		}
200		java_sdk_library {
201			name: "mysdklibrary",
202			apex_available: ["myapex"],
203			srcs: ["Test.java"],
204			min_sdk_version: "34", // UpsideDownCake
205			sdk_version: "current",
206		}
207		sdk {
208			name: "mysdk",
209			apexes: ["myapex"],
210		}
211	`
212
213	result := android.GroupFixturePreparers(
214		prepareForSdkTestWithJava,
215		java.PrepareForTestWithJavaDefaultModules,
216		java.PrepareForTestWithJavaSdkLibraryFiles,
217		java.FixtureWithLastReleaseApis("mysdklibrary"),
218		dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary"),
219		android.FixtureModifyEnv(func(env map[string]string) {
220			// targeting Tiramisu here means that we won't export mysdklibrary
221			env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu"
222		}),
223		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
224			variables.Platform_version_active_codenames = []string{"UpsideDownCake"}
225		}),
226		prepareForSdkTestWithApex,
227		android.FixtureWithRootAndroidBp(commonSdk),
228	).RunTest(t)
229
230	CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`))
231}
232
233func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) {
234
235	commonSdk := `
236sdk {
237	name: "mysdk",
238	systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
239	java_sdk_libs: [
240		// This is not strictly needed as it should be automatically added to the sdk_snapshot as
241		// a java_sdk_libs module because it is used in the mysystemserverclasspathfragment's
242		// contents property. However, it is specified here to ensure that duplicates are
243		// correctly deduped.
244		"mysdklibrary",
245	],
246}
247	`
248
249	expectedLatestSnapshot := `
250// This is auto-generated. DO NOT EDIT.
251
252apex_contributions_defaults {
253    name: "mysdk.contributions",
254    contents: ["prebuilt_mysdklibrary"],
255}
256
257java_sdk_library_import {
258    name: "mysdklibrary",
259    prefer: false,
260    visibility: ["//visibility:public"],
261    apex_available: ["myapex"],
262    shared_library: false,
263    dex_preopt: {
264        profile_guided: true,
265    },
266    public: {
267        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
268        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
269        current_api: "sdk_library/public/mysdklibrary.txt",
270        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
271        sdk_version: "current",
272    },
273}
274
275java_import {
276    name: "mylib",
277    prefer: false,
278    visibility: ["//visibility:public"],
279    apex_available: ["myapex"],
280    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
281    min_sdk_version: "2",
282    permitted_packages: ["mylib"],
283    dex_preopt: {
284        profile_guided: true,
285    },
286}
287
288prebuilt_systemserverclasspath_fragment {
289    name: "mysystemserverclasspathfragment",
290    prefer: false,
291    visibility: ["//visibility:public"],
292    apex_available: ["myapex"],
293    contents: [
294        "mylib",
295        "mysdklibrary",
296    ],
297}
298`
299
300	t.Run("target-s", func(t *testing.T) {
301		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "S", `
302// This is auto-generated. DO NOT EDIT.
303
304java_sdk_library_import {
305    name: "mysdklibrary",
306    prefer: false,
307    visibility: ["//visibility:public"],
308    apex_available: ["myapex"],
309    shared_library: false,
310    public: {
311        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
312        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
313        current_api: "sdk_library/public/mysdklibrary.txt",
314        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
315        sdk_version: "current",
316    },
317}
318`)
319	})
320
321	t.Run("target-t", func(t *testing.T) {
322		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "Tiramisu", `
323// This is auto-generated. DO NOT EDIT.
324
325java_sdk_library_import {
326    name: "mysdklibrary",
327    prefer: false,
328    visibility: ["//visibility:public"],
329    apex_available: ["myapex"],
330    shared_library: false,
331    public: {
332        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
333        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
334        current_api: "sdk_library/public/mysdklibrary.txt",
335        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
336        sdk_version: "current",
337    },
338}
339
340java_import {
341    name: "mylib",
342    prefer: false,
343    visibility: ["//visibility:public"],
344    apex_available: ["myapex"],
345    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
346    min_sdk_version: "2",
347    permitted_packages: ["mylib"],
348}
349
350prebuilt_systemserverclasspath_fragment {
351    name: "mysystemserverclasspathfragment",
352    prefer: false,
353    visibility: ["//visibility:public"],
354    apex_available: ["myapex"],
355    contents: [
356        "mylib",
357        "mysdklibrary",
358    ],
359}
360`)
361	})
362
363	t.Run("target-u", func(t *testing.T) {
364		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "UpsideDownCake", `
365// This is auto-generated. DO NOT EDIT.
366
367java_sdk_library_import {
368    name: "mysdklibrary",
369    prefer: false,
370    visibility: ["//visibility:public"],
371    apex_available: ["myapex"],
372    shared_library: false,
373    dex_preopt: {
374        profile_guided: true,
375    },
376    public: {
377        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
378        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
379        current_api: "sdk_library/public/mysdklibrary.txt",
380        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
381        sdk_version: "current",
382    },
383}
384
385java_import {
386    name: "mylib",
387    prefer: false,
388    visibility: ["//visibility:public"],
389    apex_available: ["myapex"],
390    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
391    min_sdk_version: "2",
392    permitted_packages: ["mylib"],
393    dex_preopt: {
394        profile_guided: true,
395    },
396}
397
398prebuilt_systemserverclasspath_fragment {
399    name: "mysystemserverclasspathfragment",
400    prefer: false,
401    visibility: ["//visibility:public"],
402    apex_available: ["myapex"],
403    contents: [
404        "mylib",
405        "mysdklibrary",
406    ],
407}
408`)
409	})
410
411	t.Run("added-directly", func(t *testing.T) {
412		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, `latest`, expectedLatestSnapshot)
413	})
414
415	t.Run("added-via-apex", func(t *testing.T) {
416		testSnapshotWithSystemServerClasspathFragment(t, `
417			sdk {
418				name: "mysdk",
419				apexes: ["myapex"],
420			}
421		`, `latest`, expectedLatestSnapshot)
422	})
423}
424