xref: /aosp_15_r20/build/soong/apex/container_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1// Copyright 2024 Google Inc. All rights reserved.
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 apex
16
17import (
18	"fmt"
19	"testing"
20
21	"android/soong/android"
22	"android/soong/java"
23)
24
25var checkContainerMatch = func(t *testing.T, name string, container string, expected bool, actual bool) {
26	errorMessage := fmt.Sprintf("module %s container %s value differ", name, container)
27	android.AssertBoolEquals(t, errorMessage, expected, actual)
28}
29
30func TestApexDepsContainers(t *testing.T) {
31	t.Parallel()
32	result := android.GroupFixturePreparers(
33		prepareForApexTest,
34		java.PrepareForTestWithJavaSdkLibraryFiles,
35		java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"),
36	).RunTestWithBp(t, `
37		apex {
38			name: "myapex",
39			key: "myapex.key",
40			bootclasspath_fragments: [
41				"mybootclasspathfragment",
42			],
43			updatable: true,
44			min_sdk_version: "30",
45		}
46		apex_key {
47			name: "myapex.key",
48			public_key: "testkey.avbpubkey",
49			private_key: "testkey.pem",
50		}
51		bootclasspath_fragment {
52			name: "mybootclasspathfragment",
53			contents: [
54				"mybootclasspathlib",
55			],
56			apex_available: [
57				"myapex",
58			],
59			hidden_api: {
60				split_packages: ["*"],
61			},
62		}
63		java_sdk_library {
64			name: "mybootclasspathlib",
65			srcs: [
66				"mybootclasspathlib.java",
67			],
68			apex_available: [
69				"myapex",
70			],
71			compile_dex: true,
72			static_libs: [
73				"food",
74				"baz",
75			],
76			libs: [
77				"bar.stubs",
78			],
79			min_sdk_version: "30",
80			sdk_version: "current",
81		}
82		java_library {
83			name: "food",
84			srcs:[
85				"A.java",
86			],
87			apex_available: [
88				"myapex",
89			],
90			min_sdk_version: "30",
91			sdk_version: "core_current",
92		}
93		java_sdk_library {
94			name: "bar",
95			srcs:[
96				"A.java",
97			],
98			min_sdk_version: "30",
99			sdk_version: "core_current",
100		}
101		java_library {
102			name: "baz",
103			srcs:[
104				"A.java",
105			],
106			apex_available: [
107				"//apex_available:platform",
108				"myapex",
109			],
110			min_sdk_version: "30",
111			sdk_version: "core_current",
112		}
113	`)
114	testcases := []struct {
115		moduleName        string
116		variant           string
117		isSystemContainer bool
118		isApexContainer   bool
119	}{
120		{
121			moduleName:        "mybootclasspathlib",
122			variant:           "android_common_myapex",
123			isSystemContainer: true,
124			isApexContainer:   true,
125		},
126		{
127			moduleName:        "mybootclasspathlib.impl",
128			variant:           "android_common_apex30",
129			isSystemContainer: true,
130			isApexContainer:   true,
131		},
132		{
133			moduleName:        "mybootclasspathlib.stubs",
134			variant:           "android_common",
135			isSystemContainer: true,
136			isApexContainer:   false,
137		},
138		{
139			moduleName:        "food",
140			variant:           "android_common_apex30",
141			isSystemContainer: true,
142			isApexContainer:   true,
143		},
144		{
145			moduleName:        "bar",
146			variant:           "android_common",
147			isSystemContainer: true,
148			isApexContainer:   false,
149		},
150		{
151			moduleName:        "baz",
152			variant:           "android_common_apex30",
153			isSystemContainer: true,
154			isApexContainer:   true,
155		},
156	}
157
158	for _, c := range testcases {
159		m := result.ModuleForTests(c.moduleName, c.variant)
160		containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider)
161		belongingContainers := containers.BelongingContainers()
162		checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers))
163		checkContainerMatch(t, c.moduleName, "apex", c.isApexContainer, android.InList(android.ApexContainer, belongingContainers))
164	}
165}
166
167func TestNonUpdatableApexDepsContainers(t *testing.T) {
168	t.Parallel()
169	result := android.GroupFixturePreparers(
170		prepareForApexTest,
171		java.PrepareForTestWithJavaSdkLibraryFiles,
172		java.FixtureWithLastReleaseApis("mybootclasspathlib", "bar"),
173	).RunTestWithBp(t, `
174		apex {
175			name: "myapex",
176			key: "myapex.key",
177			bootclasspath_fragments: [
178				"mybootclasspathfragment",
179			],
180			updatable: false,
181		}
182		apex_key {
183			name: "myapex.key",
184			public_key: "testkey.avbpubkey",
185			private_key: "testkey.pem",
186		}
187		bootclasspath_fragment {
188			name: "mybootclasspathfragment",
189			contents: [
190				"mybootclasspathlib",
191			],
192			apex_available: [
193				"myapex",
194			],
195			hidden_api: {
196				split_packages: ["*"],
197			},
198		}
199		java_sdk_library {
200			name: "mybootclasspathlib",
201			srcs: [
202				"mybootclasspathlib.java",
203			],
204			apex_available: [
205				"myapex",
206			],
207			compile_dex: true,
208			static_libs: [
209				"food",
210			],
211			libs: [
212				"bar.stubs",
213			],
214			sdk_version: "current",
215		}
216		java_library {
217			name: "food",
218			srcs:[
219				"A.java",
220			],
221			apex_available: [
222				"myapex",
223			],
224			sdk_version: "core_current",
225		}
226		java_sdk_library {
227			name: "bar",
228			srcs:[
229				"A.java",
230			],
231			sdk_version: "none",
232			system_modules: "none",
233		}
234	`)
235	testcases := []struct {
236		moduleName        string
237		variant           string
238		isSystemContainer bool
239		isApexContainer   bool
240	}{
241		{
242			moduleName:        "mybootclasspathlib",
243			variant:           "android_common_myapex",
244			isSystemContainer: true,
245			isApexContainer:   true,
246		},
247		{
248			moduleName:        "mybootclasspathlib.impl",
249			variant:           "android_common_apex10000",
250			isSystemContainer: true,
251			isApexContainer:   true,
252		},
253		{
254			moduleName:        "mybootclasspathlib.stubs",
255			variant:           "android_common",
256			isSystemContainer: true,
257			isApexContainer:   false,
258		},
259		{
260			moduleName:        "food",
261			variant:           "android_common_apex10000",
262			isSystemContainer: true,
263			isApexContainer:   true,
264		},
265		{
266			moduleName:        "bar",
267			variant:           "android_common",
268			isSystemContainer: true,
269			isApexContainer:   false,
270		},
271	}
272
273	for _, c := range testcases {
274		m := result.ModuleForTests(c.moduleName, c.variant)
275		containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), m.Module(), android.ContainersInfoProvider)
276		belongingContainers := containers.BelongingContainers()
277		checkContainerMatch(t, c.moduleName, "system", c.isSystemContainer, android.InList(android.SystemContainer, belongingContainers))
278		checkContainerMatch(t, c.moduleName, "apex", c.isApexContainer, android.InList(android.ApexContainer, belongingContainers))
279	}
280}
281
282func TestUpdatableAndNonUpdatableApexesIdenticalMinSdkVersion(t *testing.T) {
283	t.Parallel()
284	result := android.GroupFixturePreparers(
285		prepareForApexTest,
286		java.PrepareForTestWithJavaSdkLibraryFiles,
287		android.FixtureMergeMockFs(android.MockFS{
288			"system/sepolicy/apex/myapex_non_updatable-file_contexts": nil,
289			"system/sepolicy/apex/myapex_updatable-file_contexts":     nil,
290		}),
291	).RunTestWithBp(t, `
292		apex {
293			name: "myapex_non_updatable",
294			key: "myapex_non_updatable.key",
295			java_libs: [
296				"foo",
297			],
298			updatable: false,
299			min_sdk_version: "30",
300		}
301		apex_key {
302			name: "myapex_non_updatable.key",
303			public_key: "testkey.avbpubkey",
304			private_key: "testkey.pem",
305		}
306
307		apex {
308			name: "myapex_updatable",
309			key: "myapex_updatable.key",
310			java_libs: [
311				"foo",
312			],
313			updatable: true,
314			min_sdk_version: "30",
315		}
316		apex_key {
317			name: "myapex_updatable.key",
318			public_key: "testkey.avbpubkey",
319			private_key: "testkey.pem",
320		}
321
322		java_library {
323			name: "foo",
324			srcs:[
325				"A.java",
326			],
327			apex_available: [
328				"myapex_non_updatable",
329				"myapex_updatable",
330			],
331			min_sdk_version: "30",
332			sdk_version: "current",
333			compile_dex: true,
334		}
335	`)
336
337	fooApexVariant := result.ModuleForTests("foo", "android_common_apex30")
338	containers, _ := android.OtherModuleProvider(result.TestContext.OtherModuleProviderAdaptor(), fooApexVariant.Module(), android.ContainersInfoProvider)
339	belongingContainers := containers.BelongingContainers()
340	checkContainerMatch(t, "foo", "system", true, android.InList(android.SystemContainer, belongingContainers))
341	checkContainerMatch(t, "foo", "apex", true, android.InList(android.ApexContainer, belongingContainers))
342}
343