blob: f935f062efd9570b801730532002e62f42c08cdf [file] [log] [blame]
Inseob Kimc0907f12019-02-08 21:00:45 +09001// Copyright (C) 2019 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 sysprop
16
17import (
Paul Duffin9cbbbb82021-03-18 00:21:03 +000018 "os"
19 "strings"
20 "testing"
Paul Duffin7b3de8f2020-03-30 18:00:25 +010021
Inseob Kimc0907f12019-02-08 21:00:45 +090022 "android/soong/android"
23 "android/soong/cc"
24 "android/soong/java"
25
Inseob Kimc0907f12019-02-08 21:00:45 +090026 "github.com/google/blueprint/proptools"
27)
28
Inseob Kimc0907f12019-02-08 21:00:45 +090029func TestMain(m *testing.M) {
Paul Duffin9cbbbb82021-03-18 00:21:03 +000030 os.Exit(m.Run())
Inseob Kimc0907f12019-02-08 21:00:45 +090031}
32
Paul Duffin9cbbbb82021-03-18 00:21:03 +000033func test(t *testing.T, bp string) *android.TestResult {
Colin Cross98be1bb2019-12-13 20:41:13 -080034 t.Helper()
Colin Cross98be1bb2019-12-13 20:41:13 -080035
Jiyong Park5e914b22021-03-08 10:09:52 +090036 bp += `
37 cc_library {
38 name: "libbase",
39 host_supported: true,
40 }
41
42 cc_library_headers {
43 name: "libbase_headers",
44 vendor_available: true,
45 recovery_available: true,
46 }
47
48 cc_library {
49 name: "liblog",
50 no_libcrt: true,
51 nocrt: true,
52 system_shared_libs: [],
53 recovery_available: true,
54 host_supported: true,
Colin Cross203b4212021-04-26 17:19:41 -070055 llndk: {
56 symbol_file: "liblog.map.txt",
57 }
Jiyong Park5e914b22021-03-08 10:09:52 +090058 }
59
60 java_library {
61 name: "sysprop-library-stub-platform",
62 sdk_version: "core_current",
63 }
64
65 java_library {
66 name: "sysprop-library-stub-vendor",
67 soc_specific: true,
68 sdk_version: "core_current",
69 }
70
71 java_library {
72 name: "sysprop-library-stub-product",
73 product_specific: true,
74 sdk_version: "core_current",
75 }
76 `
77
Paul Duffin9cbbbb82021-03-18 00:21:03 +000078 mockFS := android.MockFS{
Inseob Kim42882742019-07-30 17:55:33 +090079 "a.java": nil,
80 "b.java": nil,
81 "c.java": nil,
82 "d.cpp": nil,
83 "api/sysprop-platform-current.txt": nil,
84 "api/sysprop-platform-latest.txt": nil,
85 "api/sysprop-platform-on-product-current.txt": nil,
86 "api/sysprop-platform-on-product-latest.txt": nil,
87 "api/sysprop-vendor-current.txt": nil,
88 "api/sysprop-vendor-latest.txt": nil,
Inseob Kimfe612182020-10-20 16:29:55 +090089 "api/sysprop-vendor-on-product-current.txt": nil,
90 "api/sysprop-vendor-on-product-latest.txt": nil,
Inseob Kim42882742019-07-30 17:55:33 +090091 "api/sysprop-odm-current.txt": nil,
92 "api/sysprop-odm-latest.txt": nil,
93 "framework/aidl/a.aidl": nil,
Inseob Kimc0907f12019-02-08 21:00:45 +090094
95 // For framework-res, which is an implicit dependency for framework
Dan Willemsen412160e2019-04-09 21:36:26 -070096 "AndroidManifest.xml": nil,
97 "build/make/target/product/security/testkey": nil,
Inseob Kimc0907f12019-02-08 21:00:45 +090098
99 "build/soong/scripts/jar-wrapper.sh": nil,
100
101 "build/make/core/proguard.flags": nil,
102 "build/make/core/proguard_basic_keeps.flags": nil,
103
104 "jdk8/jre/lib/jce.jar": nil,
105 "jdk8/jre/lib/rt.jar": nil,
106 "jdk8/lib/tools.jar": nil,
107
108 "bar-doc/a.java": nil,
109 "bar-doc/b.java": nil,
110 "bar-doc/IFoo.aidl": nil,
111 "bar-doc/known_oj_tags.txt": nil,
112 "external/doclava/templates-sdk": nil,
113
114 "cert/new_cert.x509.pem": nil,
115 "cert/new_cert.pk8": nil,
116
117 "android/sysprop/PlatformProperties.sysprop": nil,
118 "com/android/VendorProperties.sysprop": nil,
Inseob Kim42882742019-07-30 17:55:33 +0900119 "com/android2/OdmProperties.sysprop": nil,
Inseob Kimc0907f12019-02-08 21:00:45 +0900120 }
121
Paul Duffin89648f92021-03-20 00:36:55 +0000122 result := android.GroupFixturePreparers(
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000123 cc.PrepareForTestWithCcDefaultModules,
124 java.PrepareForTestWithJavaDefaultModules,
125 PrepareForTestWithSyspropBuildComponents,
126 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) {
127 variables.DeviceSystemSdkVersions = []string{"28"}
128 variables.DeviceVndkVersion = proptools.StringPtr("current")
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900129 variables.Platform_vndk_version = proptools.StringPtr("29")
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000130 }),
131 mockFS.AddToFixture(),
132 android.FixtureWithRootAndroidBp(bp),
Paul Duffin89648f92021-03-20 00:36:55 +0000133 ).RunTest(t)
Inseob Kimc0907f12019-02-08 21:00:45 +0900134
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000135 return result
Inseob Kimc0907f12019-02-08 21:00:45 +0900136}
137
138func TestSyspropLibrary(t *testing.T) {
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000139 result := test(t, `
Inseob Kimc0907f12019-02-08 21:00:45 +0900140 sysprop_library {
141 name: "sysprop-platform",
Paul Duffin7b3de8f2020-03-30 18:00:25 +0100142 apex_available: ["//apex_available:platform"],
Inseob Kimc0907f12019-02-08 21:00:45 +0900143 srcs: ["android/sysprop/PlatformProperties.sysprop"],
144 api_packages: ["android.sysprop"],
145 property_owner: "Platform",
146 vendor_available: true,
Inseob Kim89db15d2020-02-03 18:06:46 +0900147 host_supported: true,
Inseob Kimc0907f12019-02-08 21:00:45 +0900148 }
149
150 sysprop_library {
151 name: "sysprop-platform-on-product",
152 srcs: ["android/sysprop/PlatformProperties.sysprop"],
153 api_packages: ["android.sysprop"],
154 property_owner: "Platform",
155 product_specific: true,
156 }
157
158 sysprop_library {
159 name: "sysprop-vendor",
160 srcs: ["com/android/VendorProperties.sysprop"],
161 api_packages: ["com.android"],
162 property_owner: "Vendor",
Inseob Kimfe612182020-10-20 16:29:55 +0900163 vendor: true,
164 }
165
166 sysprop_library {
167 name: "sysprop-vendor-on-product",
168 srcs: ["com/android/VendorProperties.sysprop"],
169 api_packages: ["com.android"],
170 property_owner: "Vendor",
Inseob Kimc0907f12019-02-08 21:00:45 +0900171 product_specific: true,
Inseob Kimc0907f12019-02-08 21:00:45 +0900172 }
173
Inseob Kim42882742019-07-30 17:55:33 +0900174 sysprop_library {
175 name: "sysprop-odm",
176 srcs: ["com/android2/OdmProperties.sysprop"],
177 api_packages: ["com.android2"],
178 property_owner: "Odm",
179 device_specific: true,
180 }
181
Inseob Kimc0907f12019-02-08 21:00:45 +0900182 java_library {
183 name: "java-platform",
184 srcs: ["c.java"],
185 sdk_version: "system_current",
186 libs: ["sysprop-platform"],
187 }
188
189 java_library {
Inseob Kimac1e9862019-12-09 18:15:47 +0900190 name: "java-platform-private",
191 srcs: ["c.java"],
192 platform_apis: true,
193 libs: ["sysprop-platform"],
194 }
195
196 java_library {
Inseob Kimc0907f12019-02-08 21:00:45 +0900197 name: "java-product",
198 srcs: ["c.java"],
199 sdk_version: "system_current",
200 product_specific: true,
Inseob Kimfe612182020-10-20 16:29:55 +0900201 libs: ["sysprop-platform", "sysprop-vendor-on-product"],
Inseob Kimc0907f12019-02-08 21:00:45 +0900202 }
203
204 java_library {
205 name: "java-vendor",
206 srcs: ["c.java"],
207 sdk_version: "system_current",
208 soc_specific: true,
209 libs: ["sysprop-platform", "sysprop-vendor"],
210 }
211
212 cc_library {
213 name: "cc-client-platform",
214 srcs: ["d.cpp"],
215 static_libs: ["sysprop-platform"],
216 }
217
Jiyong Park5d1598f2019-02-25 22:14:17 +0900218 cc_library_static {
219 name: "cc-client-platform-static",
220 srcs: ["d.cpp"],
221 whole_static_libs: ["sysprop-platform"],
222 }
223
Inseob Kimc0907f12019-02-08 21:00:45 +0900224 cc_library {
225 name: "cc-client-product",
226 srcs: ["d.cpp"],
227 product_specific: true,
Inseob Kimfe612182020-10-20 16:29:55 +0900228 static_libs: ["sysprop-platform-on-product", "sysprop-vendor-on-product"],
Inseob Kimc0907f12019-02-08 21:00:45 +0900229 }
230
231 cc_library {
232 name: "cc-client-vendor",
233 srcs: ["d.cpp"],
234 soc_specific: true,
235 static_libs: ["sysprop-platform", "sysprop-vendor"],
236 }
Inseob Kim1f959762019-03-27 17:20:37 +0900237
Inseob Kim89db15d2020-02-03 18:06:46 +0900238 cc_binary_host {
239 name: "hostbin",
240 static_libs: ["sysprop-platform"],
Inseob Kim1f959762019-03-27 17:20:37 +0900241 }
Jiyong Park5e914b22021-03-08 10:09:52 +0900242 `)
Inseob Kimc0907f12019-02-08 21:00:45 +0900243
Inseob Kim42882742019-07-30 17:55:33 +0900244 // Check for generated cc_library
245 for _, variant := range []string{
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900246 "android_vendor.29_arm_armv7-a-neon_shared",
247 "android_vendor.29_arm_armv7-a-neon_static",
248 "android_vendor.29_arm64_armv8-a_shared",
249 "android_vendor.29_arm64_armv8-a_static",
Inseob Kim42882742019-07-30 17:55:33 +0900250 } {
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000251 result.ModuleForTests("libsysprop-platform", variant)
252 result.ModuleForTests("libsysprop-vendor", variant)
253 result.ModuleForTests("libsysprop-odm", variant)
Inseob Kim42882742019-07-30 17:55:33 +0900254 }
255
Inseob Kimc0907f12019-02-08 21:00:45 +0900256 for _, variant := range []string{
Colin Cross7113d202019-11-20 16:39:12 -0800257 "android_arm_armv7-a-neon_shared",
258 "android_arm_armv7-a-neon_static",
259 "android_arm64_armv8-a_shared",
260 "android_arm64_armv8-a_static",
Inseob Kimc0907f12019-02-08 21:00:45 +0900261 } {
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000262 library := result.ModuleForTests("libsysprop-platform", variant).Module().(*cc.Module)
Paul Duffin7b3de8f2020-03-30 18:00:25 +0100263 expectedApexAvailableOnLibrary := []string{"//apex_available:platform"}
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000264 android.AssertDeepEquals(t, "apex available property on libsysprop-platform", expectedApexAvailableOnLibrary, library.ApexProperties.Apex_available)
Inseob Kim42882742019-07-30 17:55:33 +0900265
Inseob Kimfe612182020-10-20 16:29:55 +0900266 // product variant of vendor-owned sysprop_library
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000267 result.ModuleForTests("libsysprop-vendor-on-product", variant)
Inseob Kimc0907f12019-02-08 21:00:45 +0900268 }
269
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000270 result.ModuleForTests("sysprop-platform", "android_common")
271 result.ModuleForTests("sysprop-platform_public", "android_common")
272 result.ModuleForTests("sysprop-vendor", "android_common")
273 result.ModuleForTests("sysprop-vendor-on-product", "android_common")
Inseob Kimc0907f12019-02-08 21:00:45 +0900274
275 // Check for exported includes
Colin Cross7113d202019-11-20 16:39:12 -0800276 coreVariant := "android_arm64_armv8-a_static"
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900277 vendorVariant := "android_vendor.29_arm64_armv8-a_static"
Inseob Kimc0907f12019-02-08 21:00:45 +0900278
Colin Cross7113d202019-11-20 16:39:12 -0800279 platformInternalPath := "libsysprop-platform/android_arm64_armv8-a_static/gen/sysprop/include"
280 platformPublicCorePath := "libsysprop-platform/android_arm64_armv8-a_static/gen/sysprop/public/include"
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900281 platformPublicVendorPath := "libsysprop-platform/android_vendor.29_arm64_armv8-a_static/gen/sysprop/public/include"
Inseob Kimc0907f12019-02-08 21:00:45 +0900282
Colin Cross7113d202019-11-20 16:39:12 -0800283 platformOnProductPath := "libsysprop-platform-on-product/android_arm64_armv8-a_static/gen/sysprop/public/include"
Inseob Kimc0907f12019-02-08 21:00:45 +0900284
Jiyong Parkf58c46e2021-04-01 21:35:20 +0900285 vendorInternalPath := "libsysprop-vendor/android_vendor.29_arm64_armv8-a_static/gen/sysprop/include"
Inseob Kimfe612182020-10-20 16:29:55 +0900286 vendorPublicPath := "libsysprop-vendor-on-product/android_arm64_armv8-a_static/gen/sysprop/public/include"
Inseob Kimc0907f12019-02-08 21:00:45 +0900287
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000288 platformClient := result.ModuleForTests("cc-client-platform", coreVariant)
Inseob Kimc0907f12019-02-08 21:00:45 +0900289 platformFlags := platformClient.Rule("cc").Args["cFlags"]
290
Jiyong Park5d1598f2019-02-25 22:14:17 +0900291 // platform should use platform's internal header
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000292 android.AssertStringDoesContain(t, "flags for platform", platformFlags, platformInternalPath)
Inseob Kimc0907f12019-02-08 21:00:45 +0900293
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000294 platformStaticClient := result.ModuleForTests("cc-client-platform-static", coreVariant)
Jiyong Park5d1598f2019-02-25 22:14:17 +0900295 platformStaticFlags := platformStaticClient.Rule("cc").Args["cFlags"]
296
297 // platform-static should use platform's internal header
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000298 android.AssertStringDoesContain(t, "flags for platform-static", platformStaticFlags, platformInternalPath)
Jiyong Park5d1598f2019-02-25 22:14:17 +0900299
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000300 productClient := result.ModuleForTests("cc-client-product", coreVariant)
Inseob Kimc0907f12019-02-08 21:00:45 +0900301 productFlags := productClient.Rule("cc").Args["cFlags"]
302
Inseob Kim5cefbd22019-06-08 20:36:59 +0900303 // Product should use platform's and vendor's public headers
Inseob Kimc0907f12019-02-08 21:00:45 +0900304 if !strings.Contains(productFlags, platformOnProductPath) ||
Inseob Kim5cefbd22019-06-08 20:36:59 +0900305 !strings.Contains(productFlags, vendorPublicPath) {
Inseob Kimc0907f12019-02-08 21:00:45 +0900306 t.Errorf("flags for product must contain %#v and %#v, but was %#v.",
Inseob Kim5cefbd22019-06-08 20:36:59 +0900307 platformPublicCorePath, vendorPublicPath, productFlags)
Inseob Kimc0907f12019-02-08 21:00:45 +0900308 }
309
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000310 vendorClient := result.ModuleForTests("cc-client-vendor", vendorVariant)
Inseob Kimc0907f12019-02-08 21:00:45 +0900311 vendorFlags := vendorClient.Rule("cc").Args["cFlags"]
312
Inseob Kim5cefbd22019-06-08 20:36:59 +0900313 // Vendor should use platform's public header and vendor's internal header
314 if !strings.Contains(vendorFlags, platformPublicVendorPath) ||
Inseob Kimc0907f12019-02-08 21:00:45 +0900315 !strings.Contains(vendorFlags, vendorInternalPath) {
316 t.Errorf("flags for vendor must contain %#v and %#v, but was %#v.",
Inseob Kim5cefbd22019-06-08 20:36:59 +0900317 platformPublicVendorPath, vendorInternalPath, vendorFlags)
Inseob Kimc0907f12019-02-08 21:00:45 +0900318 }
Inseob Kimac1e9862019-12-09 18:15:47 +0900319
320 // Java modules linking against system API should use public stub
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000321 javaSystemApiClient := result.ModuleForTests("java-platform", "android_common").Rule("javac")
322 syspropPlatformPublic := result.ModuleForTests("sysprop-platform_public", "android_common").Description("for turbine")
Colin Cross75ce9ec2021-02-26 16:20:32 -0800323 if g, w := javaSystemApiClient.Implicits.Strings(), syspropPlatformPublic.Output.String(); !android.InList(w, g) {
324 t.Errorf("system api client should use public stub %q, got %q", w, g)
Inseob Kimac1e9862019-12-09 18:15:47 +0900325 }
Inseob Kimc0907f12019-02-08 21:00:45 +0900326}
Jiyong Park5e914b22021-03-08 10:09:52 +0900327
328func TestApexAvailabilityIsForwarded(t *testing.T) {
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000329 result := test(t, `
Jiyong Park5e914b22021-03-08 10:09:52 +0900330 sysprop_library {
331 name: "sysprop-platform",
332 apex_available: ["//apex_available:platform"],
333 srcs: ["android/sysprop/PlatformProperties.sysprop"],
334 api_packages: ["android.sysprop"],
335 property_owner: "Platform",
336 }
337 `)
338
339 expected := []string{"//apex_available:platform"}
340
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000341 ccModule := result.ModuleForTests("libsysprop-platform", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Jiyong Park5e914b22021-03-08 10:09:52 +0900342 propFromCc := ccModule.ApexProperties.Apex_available
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000343 android.AssertDeepEquals(t, "apex_available forwarding to cc module", expected, propFromCc)
Jiyong Park5e914b22021-03-08 10:09:52 +0900344
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000345 javaModule := result.ModuleForTests("sysprop-platform", "android_common").Module().(*java.Library)
Jiyong Park5e914b22021-03-08 10:09:52 +0900346 propFromJava := javaModule.ApexProperties.Apex_available
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000347 android.AssertDeepEquals(t, "apex_available forwarding to java module", expected, propFromJava)
Jiyong Park5e914b22021-03-08 10:09:52 +0900348}
349
350func TestMinSdkVersionIsForwarded(t *testing.T) {
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000351 result := test(t, `
Jiyong Park5e914b22021-03-08 10:09:52 +0900352 sysprop_library {
353 name: "sysprop-platform",
354 srcs: ["android/sysprop/PlatformProperties.sysprop"],
355 api_packages: ["android.sysprop"],
356 property_owner: "Platform",
357 cpp: {
358 min_sdk_version: "29",
359 },
360 java: {
361 min_sdk_version: "30",
362 },
363 }
364 `)
365
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000366 ccModule := result.ModuleForTests("libsysprop-platform", "android_arm64_armv8-a_shared").Module().(*cc.Module)
Jiyong Park5e914b22021-03-08 10:09:52 +0900367 propFromCc := proptools.String(ccModule.Properties.Min_sdk_version)
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000368 android.AssertStringEquals(t, "min_sdk_version forwarding to cc module", "29", propFromCc)
Jiyong Park5e914b22021-03-08 10:09:52 +0900369
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000370 javaModule := result.ModuleForTests("sysprop-platform", "android_common").Module().(*java.Library)
Jiyong Parkf1691d22021-03-29 20:11:58 +0900371 propFromJava := javaModule.MinSdkVersionString()
Paul Duffin9cbbbb82021-03-18 00:21:03 +0000372 android.AssertStringEquals(t, "min_sdk_version forwarding to java module", "30", propFromJava)
Jiyong Park5e914b22021-03-08 10:09:52 +0900373}