• 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		prepareForSdkTestWithApex,
38
39		android.FixtureWithRootAndroidBp(sdk+`
40			apex {
41				name: "myapex",
42				key: "myapex.key",
43				min_sdk_version: "2",
44				systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
45			}
46
47			systemserverclasspath_fragment {
48				name: "mysystemserverclasspathfragment",
49				apex_available: ["myapex"],
50				contents: [
51					"mylib",
52					"mysdklibrary",
53				],
54			}
55
56			java_library {
57				name: "mylib",
58				apex_available: ["myapex"],
59				srcs: ["Test.java"],
60				system_modules: "none",
61				sdk_version: "none",
62				min_sdk_version: "2",
63				compile_dex: true,
64				permitted_packages: ["mylib"],
65				dex_preopt: {
66					profile: "art-profile",
67				},
68			}
69
70			java_sdk_library {
71				name: "mysdklibrary",
72				apex_available: ["myapex"],
73				srcs: ["Test.java"],
74				shared_library: false,
75				public: {enabled: true},
76				min_sdk_version: "2",
77				dex_preopt: {
78					profile: "art-profile",
79				},
80			}
81		`),
82	).RunTest(t)
83
84	CheckSnapshot(t, result, "mysdk", "",
85		checkAndroidBpContents(expectedSdkSnapshot),
86	)
87}
88
89func TestSnapshotWithEmptySystemServerClasspathFragment(t *testing.T) {
90	commonSdk := `
91		apex {
92			name: "myapex",
93			key: "myapex.key",
94			min_sdk_version: "Tiramisu",
95			systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
96		}
97		systemserverclasspath_fragment {
98			name: "mysystemserverclasspathfragment",
99			apex_available: ["myapex"],
100			contents: ["mysdklibrary"],
101		}
102		java_sdk_library {
103			name: "mysdklibrary",
104			apex_available: ["myapex"],
105			srcs: ["Test.java"],
106			min_sdk_version: "34", // UpsideDownCake
107		}
108		sdk {
109			name: "mysdk",
110			apexes: ["myapex"],
111		}
112	`
113
114	result := android.GroupFixturePreparers(
115		prepareForSdkTestWithJava,
116		java.PrepareForTestWithJavaDefaultModules,
117		java.PrepareForTestWithJavaSdkLibraryFiles,
118		java.FixtureWithLastReleaseApis("mysdklibrary"),
119		dexpreopt.FixtureSetApexSystemServerJars("myapex:mysdklibrary"),
120		android.FixtureModifyEnv(func(env map[string]string) {
121			// targeting Tiramisu here means that we won't export mysdklibrary
122			env["SOONG_SDK_SNAPSHOT_TARGET_BUILD_RELEASE"] = "Tiramisu"
123		}),
124		android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
125			variables.Platform_version_active_codenames = []string{"UpsideDownCake"}
126		}),
127		prepareForSdkTestWithApex,
128		android.FixtureWithRootAndroidBp(commonSdk),
129	).RunTest(t)
130
131	CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(`// This is auto-generated. DO NOT EDIT.`))
132}
133
134func TestSnapshotWithSystemServerClasspathFragment(t *testing.T) {
135
136	commonSdk := `
137sdk {
138	name: "mysdk",
139	systemserverclasspath_fragments: ["mysystemserverclasspathfragment"],
140	java_sdk_libs: [
141		// This is not strictly needed as it should be automatically added to the sdk_snapshot as
142		// a java_sdk_libs module because it is used in the mysystemserverclasspathfragment's
143		// contents property. However, it is specified here to ensure that duplicates are
144		// correctly deduped.
145		"mysdklibrary",
146	],
147}
148	`
149
150	expectedLatestSnapshot := `
151// This is auto-generated. DO NOT EDIT.
152
153java_sdk_library_import {
154    name: "mysdklibrary",
155    prefer: false,
156    visibility: ["//visibility:public"],
157    apex_available: ["myapex"],
158    shared_library: false,
159    dex_preopt: {
160        profile_guided: true,
161    },
162    public: {
163        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
164        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
165        current_api: "sdk_library/public/mysdklibrary.txt",
166        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
167        sdk_version: "current",
168    },
169}
170
171java_import {
172    name: "mylib",
173    prefer: false,
174    visibility: ["//visibility:public"],
175    apex_available: ["myapex"],
176    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
177    min_sdk_version: "2",
178    permitted_packages: ["mylib"],
179    dex_preopt: {
180        profile_guided: true,
181    },
182}
183
184prebuilt_systemserverclasspath_fragment {
185    name: "mysystemserverclasspathfragment",
186    prefer: false,
187    visibility: ["//visibility:public"],
188    apex_available: ["myapex"],
189    contents: [
190        "mylib",
191        "mysdklibrary",
192    ],
193}
194`
195
196	t.Run("target-s", func(t *testing.T) {
197		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "S", `
198// This is auto-generated. DO NOT EDIT.
199
200java_sdk_library_import {
201    name: "mysdklibrary",
202    prefer: false,
203    visibility: ["//visibility:public"],
204    apex_available: ["myapex"],
205    shared_library: false,
206    public: {
207        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
208        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
209        current_api: "sdk_library/public/mysdklibrary.txt",
210        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
211        sdk_version: "current",
212    },
213}
214`)
215	})
216
217	t.Run("target-t", func(t *testing.T) {
218		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "Tiramisu", `
219// This is auto-generated. DO NOT EDIT.
220
221java_sdk_library_import {
222    name: "mysdklibrary",
223    prefer: false,
224    visibility: ["//visibility:public"],
225    apex_available: ["myapex"],
226    shared_library: false,
227    public: {
228        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
229        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
230        current_api: "sdk_library/public/mysdklibrary.txt",
231        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
232        sdk_version: "current",
233    },
234}
235
236java_import {
237    name: "mylib",
238    prefer: false,
239    visibility: ["//visibility:public"],
240    apex_available: ["myapex"],
241    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
242    min_sdk_version: "2",
243    permitted_packages: ["mylib"],
244}
245
246prebuilt_systemserverclasspath_fragment {
247    name: "mysystemserverclasspathfragment",
248    prefer: false,
249    visibility: ["//visibility:public"],
250    apex_available: ["myapex"],
251    contents: [
252        "mylib",
253        "mysdklibrary",
254    ],
255}
256`)
257	})
258
259	t.Run("target-u", func(t *testing.T) {
260		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, "UpsideDownCake", `
261// This is auto-generated. DO NOT EDIT.
262
263java_sdk_library_import {
264    name: "mysdklibrary",
265    prefer: false,
266    visibility: ["//visibility:public"],
267    apex_available: ["myapex"],
268    shared_library: false,
269    dex_preopt: {
270        profile_guided: true,
271    },
272    public: {
273        jars: ["sdk_library/public/mysdklibrary-stubs.jar"],
274        stub_srcs: ["sdk_library/public/mysdklibrary_stub_sources"],
275        current_api: "sdk_library/public/mysdklibrary.txt",
276        removed_api: "sdk_library/public/mysdklibrary-removed.txt",
277        sdk_version: "current",
278    },
279}
280
281java_import {
282    name: "mylib",
283    prefer: false,
284    visibility: ["//visibility:public"],
285    apex_available: ["myapex"],
286    jars: ["java_systemserver_libs/snapshot/jars/are/invalid/mylib.jar"],
287    min_sdk_version: "2",
288    permitted_packages: ["mylib"],
289    dex_preopt: {
290        profile_guided: true,
291    },
292}
293
294prebuilt_systemserverclasspath_fragment {
295    name: "mysystemserverclasspathfragment",
296    prefer: false,
297    visibility: ["//visibility:public"],
298    apex_available: ["myapex"],
299    contents: [
300        "mylib",
301        "mysdklibrary",
302    ],
303}
304`)
305	})
306
307	t.Run("added-directly", func(t *testing.T) {
308		testSnapshotWithSystemServerClasspathFragment(t, commonSdk, `latest`, expectedLatestSnapshot)
309	})
310
311	t.Run("added-via-apex", func(t *testing.T) {
312		testSnapshotWithSystemServerClasspathFragment(t, `
313			sdk {
314				name: "mysdk",
315				apexes: ["myapex"],
316			}
317		`, `latest`, expectedLatestSnapshot)
318	})
319}
320