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