• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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		snapshotTestPreparer(checkSnapshotWithoutSource,
91			android.FixtureMergeMockFs(android.MockFS{
92				"myapex/Android.bp": []byte(`
93				apex {
94					name: "myapex",
95					key: "myapex.key",
96					min_sdk_version: "1",
97				}
98				`),
99				"myapex/apex_manifest.json": nil,
100			}),
101		),
102	)
103}
104
105func TestSnapshotWithPartialSystemServerClasspathFragment(t *testing.T) {
106	t.Parallel()
107	commonSdk := `
108		apex {
109			name: "myapex",
110			key: "myapex.key",
111			min_sdk_version: "Tiramisu",
112			systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
113		}
114		systemserverclasspath_fragment {
115			name: "mysystemserverclasspathfragment",
116			apex_available: ["myapex"],
117			contents: [
118				"mysdklibrary",
119				"mysdklibrary-future",
120			],
121		}
122		java_sdk_library {
123			name: "mysdklibrary",
124			apex_available: ["myapex"],
125			srcs: ["Test.java"],
126			min_sdk_version: "33", // Tiramisu
127			sdk_version: "current",
128		}
129		java_sdk_library {
130			name: "mysdklibrary-future",
131			apex_available: ["myapex"],
132			srcs: ["Test.java"],
133			min_sdk_version: "34", // UpsideDownCake
134			sdk_version: "current",
135		}
136		sdk {
137			name: "mysdk",
138			apexes: ["myapex"],
139		}
140	`
141
142	result := android.GroupFixturePreparers(
143		prepareForSdkTestWithJava,
144		java.PrepareForTestWithJavaDefaultModules,
145		java.PrepareForTestWithJavaSdkLibraryFiles,
146		java.FixtureWithLastReleaseApis("mysdklibrary", "mysdklibrary-future"),
147		dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary", "myapex:mysdklibrary-future"),
148		android.FixtureModifyEnv(func(env map[string]string) {
149			// targeting Tiramisu here means that we won't export mysdklibrary-future
150			env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu"
151		}),
152		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
153			variables.Platform_version_active_codenames = []string{"UpsideDownCake"}
154		}),
155		prepareForSdkTestWithApex,
156		android.FixtureWithRootAndroidBp(commonSdk),
157	).RunTest(t)
158
159	CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(
160		`// This is auto-generated. DO NOT EDIT.
161
162java_sdk_library_import {
163    name: "mysdklibrary",
164    prefer: false,
165    visibility: ["//visibility:public"],
166    apex_available: ["myapex"],
167    shared_library: true,
168    public: {
169        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
170        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
171        current_api: "sdk_library/public/mysdklibrary.txt",
172        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
173        sdk_version: "current",
174    },
175    system: {
176        jars: ["sdk_library/system/mysdklibrary-stubs.jar"],
177        stub_srcs: ["sdk_library/system/mysdklibrary_stub_sources"],
178        current_api: "sdk_library/system/mysdklibrary.txt",
179        removed_api: "sdk_library/system/mysdklibrary-removed.txt",
180        sdk_version: "system_current",
181    },
182    test: {
183        jars: ["sdk_library/test/mysdklibrary-stubs.jar"],
184        stub_srcs: ["sdk_library/test/mysdklibrary_stub_sources"],
185        current_api: "sdk_library/test/mysdklibrary.txt",
186        removed_api: "sdk_library/test/mysdklibrary-removed.txt",
187        sdk_version: "test_current",
188    },
189}
190
191prebuilt_systemserverclasspath_fragment {
192    name: "mysystemserverclasspathfragment",
193    prefer: false,
194    visibility: ["//visibility:public"],
195    apex_available: ["myapex"],
196    contents: ["mysdklibrary"],
197} `))
198}
199
200func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) {
201	t.Parallel()
202	commonSdk := `
203		apex {
204			name: "myapex",
205			key: "myapex.key",
206			min_sdk_version: "Tiramisu",
207			systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
208		}
209		systemserverclasspath_fragment {
210			name: "mysystemserverclasspathfragment",
211			apex_available: ["myapex"],
212			contents: ["mysdklibrary"],
213		}
214		java_sdk_library {
215			name: "mysdklibrary",
216			apex_available: ["myapex"],
217			srcs: ["Test.java"],
218			min_sdk_version: "34", // UpsideDownCake
219			sdk_version: "current",
220		}
221		sdk {
222			name: "mysdk",
223			apexes: ["myapex"],
224		}
225	`
226
227	result := android.GroupFixturePreparers(
228		prepareForSdkTestWithJava,
229		java.PrepareForTestWithJavaDefaultModules,
230		java.PrepareForTestWithJavaSdkLibraryFiles,
231		java.FixtureWithLastReleaseApis("mysdklibrary"),
232		dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary"),
233		android.FixtureModifyEnv(func(env map[string]string) {
234			// targeting Tiramisu here means that we won't export mysdklibrary
235			env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu"
236		}),
237		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
238			variables.Platform_version_active_codenames = []string{"UpsideDownCake"}
239		}),
240		prepareForSdkTestWithApex,
241		android.FixtureWithRootAndroidBp(commonSdk),
242	).RunTest(t)
243
244	CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`))
245}
246
247func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) {
248	t.Parallel()
249
250	commonSdk := `
251sdk {
252	name: "mysdk",
253	systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
254	java_sdk_libs: [
255		// This is not strictly needed as it should be automatically added to the sdk_snapshot as
256		// a java_sdk_libs module because it is used in the mysystemserverclasspathfragment's
257		// contents property. However, it is specified here to ensure that duplicates are
258		// correctly deduped.
259		"mysdklibrary",
260	],
261}
262	`
263
264	expectedLatestSnapshot := `
265// This is auto-generated. DO NOT EDIT.
266
267apex_contributions_defaults {
268    name: "mysdk.contributions",
269    contents: ["prebuilt_mysdklibrary"],
270}
271
272java_sdk_library_import {
273    name: "mysdklibrary",
274    prefer: false,
275    visibility: ["//visibility:public"],
276    apex_available: ["myapex"],
277    shared_library: false,
278    dex_preopt: {
279        profile_guided: true,
280    },
281    public: {
282        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
283        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
284        current_api: "sdk_library/public/mysdklibrary.txt",
285        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
286        sdk_version: "current",
287    },
288}
289
290java_import {
291    name: "mylib",
292    prefer: false,
293    visibility: ["//visibility:public"],
294    apex_available: ["myapex"],
295    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
296    min_sdk_version: "2",
297    permitted_packages: ["mylib"],
298    dex_preopt: {
299        profile_guided: true,
300    },
301}
302
303prebuilt_systemserverclasspath_fragment {
304    name: "mysystemserverclasspathfragment",
305    prefer: false,
306    visibility: ["//visibility:public"],
307    apex_available: ["myapex"],
308    contents: [
309        "mylib",
310        "mysdklibrary",
311    ],
312}
313`
314
315	t.Run("target-s", func(t *testing.T) {
316		t.Parallel()
317		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "S", `
318// This is auto-generated. DO NOT EDIT.
319
320java_sdk_library_import {
321    name: "mysdklibrary",
322    prefer: false,
323    visibility: ["//visibility:public"],
324    apex_available: ["myapex"],
325    shared_library: false,
326    public: {
327        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
328        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
329        current_api: "sdk_library/public/mysdklibrary.txt",
330        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
331        sdk_version: "current",
332    },
333}
334`)
335	})
336
337	t.Run("target-t", func(t *testing.T) {
338		t.Parallel()
339		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "Tiramisu", `
340// This is auto-generated. DO NOT EDIT.
341
342java_sdk_library_import {
343    name: "mysdklibrary",
344    prefer: false,
345    visibility: ["//visibility:public"],
346    apex_available: ["myapex"],
347    shared_library: false,
348    public: {
349        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
350        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
351        current_api: "sdk_library/public/mysdklibrary.txt",
352        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
353        sdk_version: "current",
354    },
355}
356
357java_import {
358    name: "mylib",
359    prefer: false,
360    visibility: ["//visibility:public"],
361    apex_available: ["myapex"],
362    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
363    min_sdk_version: "2",
364    permitted_packages: ["mylib"],
365}
366
367prebuilt_systemserverclasspath_fragment {
368    name: "mysystemserverclasspathfragment",
369    prefer: false,
370    visibility: ["//visibility:public"],
371    apex_available: ["myapex"],
372    contents: [
373        "mylib",
374        "mysdklibrary",
375    ],
376}
377`)
378	})
379
380	t.Run("target-u", func(t *testing.T) {
381		t.Parallel()
382		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "UpsideDownCake", `
383// This is auto-generated. DO NOT EDIT.
384
385java_sdk_library_import {
386    name: "mysdklibrary",
387    prefer: false,
388    visibility: ["//visibility:public"],
389    apex_available: ["myapex"],
390    shared_library: false,
391    dex_preopt: {
392        profile_guided: true,
393    },
394    public: {
395        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
396        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
397        current_api: "sdk_library/public/mysdklibrary.txt",
398        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
399        sdk_version: "current",
400    },
401}
402
403java_import {
404    name: "mylib",
405    prefer: false,
406    visibility: ["//visibility:public"],
407    apex_available: ["myapex"],
408    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
409    min_sdk_version: "2",
410    permitted_packages: ["mylib"],
411    dex_preopt: {
412        profile_guided: true,
413    },
414}
415
416prebuilt_systemserverclasspath_fragment {
417    name: "mysystemserverclasspathfragment",
418    prefer: false,
419    visibility: ["//visibility:public"],
420    apex_available: ["myapex"],
421    contents: [
422        "mylib",
423        "mysdklibrary",
424    ],
425}
426`)
427	})
428
429	t.Run("added-directly", func(t *testing.T) {
430		t.Parallel()
431		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, `latest`, expectedLatestSnapshot)
432	})
433
434	t.Run("added-via-apex", func(t *testing.T) {
435		t.Parallel()
436		testSnapshotWithSystemServerClasspathFragment(t, `
437			sdk {
438				name: "mysdk",
439				apexes: ["myapex"],
440			}
441		`, `latest`, expectedLatestSnapshot)
442	})
443}
444