1// 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 ( 18 "os" 19 "strings" 20 "testing" 21 22 "android/soong/android" 23 "android/soong/cc" 24 "android/soong/java" 25 26 "github.com/google/blueprint/proptools" 27) 28 29func TestMain(m *testing.M) { 30 os.Exit(m.Run()) 31} 32 33func test(t *testing.T, bp string) *android.TestResult { 34 t.Helper() 35 36 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, 55 llndk: { 56 symbol_file: "liblog.map.txt", 57 } 58 } 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 78 mockFS := android.MockFS{ 79 "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, 89 "api/sysprop-vendor-on-product-current.txt": nil, 90 "api/sysprop-vendor-on-product-latest.txt": nil, 91 "api/sysprop-odm-current.txt": nil, 92 "api/sysprop-odm-latest.txt": nil, 93 "framework/aidl/a.aidl": nil, 94 95 // For framework-res, which is an implicit dependency for framework 96 "AndroidManifest.xml": nil, 97 "build/make/target/product/security/testkey": nil, 98 99 "build/soong/scripts/jar-wrapper.sh": nil, 100 101 "jdk8/jre/lib/jce.jar": nil, 102 "jdk8/jre/lib/rt.jar": nil, 103 "jdk8/lib/tools.jar": nil, 104 105 "bar-doc/a.java": nil, 106 "bar-doc/b.java": nil, 107 "bar-doc/IFoo.aidl": nil, 108 "bar-doc/known_oj_tags.txt": nil, 109 "external/doclava/templates-sdk": nil, 110 111 "cert/new_cert.x509.pem": nil, 112 "cert/new_cert.pk8": nil, 113 114 "android/sysprop/PlatformProperties.sysprop": nil, 115 "com/android/VendorProperties.sysprop": nil, 116 "com/android2/OdmProperties.sysprop": nil, 117 } 118 119 result := android.GroupFixturePreparers( 120 cc.PrepareForTestWithCcDefaultModules, 121 java.PrepareForTestWithJavaDefaultModules, 122 PrepareForTestWithSyspropBuildComponents, 123 android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 124 variables.DeviceSystemSdkVersions = []string{"28"} 125 variables.DeviceVndkVersion = proptools.StringPtr("current") 126 variables.Platform_vndk_version = proptools.StringPtr("29") 127 }), 128 mockFS.AddToFixture(), 129 android.FixtureWithRootAndroidBp(bp), 130 ).RunTest(t) 131 132 return result 133} 134 135func TestSyspropLibrary(t *testing.T) { 136 result := test(t, ` 137 sysprop_library { 138 name: "sysprop-platform", 139 apex_available: ["//apex_available:platform"], 140 srcs: ["android/sysprop/PlatformProperties.sysprop"], 141 api_packages: ["android.sysprop"], 142 property_owner: "Platform", 143 vendor_available: true, 144 host_supported: true, 145 } 146 147 sysprop_library { 148 name: "sysprop-platform-on-product", 149 srcs: ["android/sysprop/PlatformProperties.sysprop"], 150 api_packages: ["android.sysprop"], 151 property_owner: "Platform", 152 product_specific: true, 153 } 154 155 sysprop_library { 156 name: "sysprop-vendor", 157 srcs: ["com/android/VendorProperties.sysprop"], 158 api_packages: ["com.android"], 159 property_owner: "Vendor", 160 vendor: true, 161 } 162 163 sysprop_library { 164 name: "sysprop-vendor-on-product", 165 srcs: ["com/android/VendorProperties.sysprop"], 166 api_packages: ["com.android"], 167 property_owner: "Vendor", 168 product_specific: true, 169 } 170 171 sysprop_library { 172 name: "sysprop-odm", 173 srcs: ["com/android2/OdmProperties.sysprop"], 174 api_packages: ["com.android2"], 175 property_owner: "Odm", 176 device_specific: true, 177 } 178 179 java_library { 180 name: "java-platform", 181 srcs: ["c.java"], 182 sdk_version: "system_current", 183 libs: ["sysprop-platform"], 184 } 185 186 java_library { 187 name: "java-platform-private", 188 srcs: ["c.java"], 189 platform_apis: true, 190 libs: ["sysprop-platform"], 191 } 192 193 java_library { 194 name: "java-product", 195 srcs: ["c.java"], 196 sdk_version: "system_current", 197 product_specific: true, 198 libs: ["sysprop-platform", "sysprop-vendor-on-product"], 199 } 200 201 java_library { 202 name: "java-vendor", 203 srcs: ["c.java"], 204 sdk_version: "system_current", 205 soc_specific: true, 206 libs: ["sysprop-platform", "sysprop-vendor"], 207 } 208 209 cc_library { 210 name: "cc-client-platform", 211 srcs: ["d.cpp"], 212 static_libs: ["libsysprop-platform"], 213 } 214 215 cc_library_static { 216 name: "cc-client-platform-static", 217 srcs: ["d.cpp"], 218 whole_static_libs: ["libsysprop-platform"], 219 } 220 221 cc_library { 222 name: "cc-client-product", 223 srcs: ["d.cpp"], 224 product_specific: true, 225 static_libs: ["libsysprop-platform-on-product", "libsysprop-vendor-on-product"], 226 } 227 228 cc_library { 229 name: "cc-client-vendor", 230 srcs: ["d.cpp"], 231 soc_specific: true, 232 static_libs: ["libsysprop-platform", "libsysprop-vendor"], 233 } 234 235 cc_binary_host { 236 name: "hostbin", 237 static_libs: ["libsysprop-platform"], 238 } 239 `) 240 241 // Check for generated cc_library 242 for _, variant := range []string{ 243 "android_vendor.29_arm_armv7-a-neon_shared", 244 "android_vendor.29_arm_armv7-a-neon_static", 245 "android_vendor.29_arm64_armv8-a_shared", 246 "android_vendor.29_arm64_armv8-a_static", 247 } { 248 result.ModuleForTests("libsysprop-platform", variant) 249 result.ModuleForTests("libsysprop-vendor", variant) 250 result.ModuleForTests("libsysprop-odm", variant) 251 } 252 253 for _, variant := range []string{ 254 "android_arm_armv7-a-neon_shared", 255 "android_arm_armv7-a-neon_static", 256 "android_arm64_armv8-a_shared", 257 "android_arm64_armv8-a_static", 258 } { 259 library := result.ModuleForTests("libsysprop-platform", variant).Module().(*cc.Module) 260 expectedApexAvailableOnLibrary := []string{"//apex_available:platform"} 261 android.AssertDeepEquals(t, "apex available property on libsysprop-platform", expectedApexAvailableOnLibrary, library.ApexProperties.Apex_available) 262 263 // product variant of vendor-owned sysprop_library 264 result.ModuleForTests("libsysprop-vendor-on-product", variant) 265 } 266 267 result.ModuleForTests("sysprop-platform", "android_common") 268 result.ModuleForTests("sysprop-platform_public", "android_common") 269 result.ModuleForTests("sysprop-vendor", "android_common") 270 result.ModuleForTests("sysprop-vendor-on-product", "android_common") 271 272 // Check for exported includes 273 coreVariant := "android_arm64_armv8-a_static" 274 vendorVariant := "android_vendor.29_arm64_armv8-a_static" 275 276 platformInternalPath := "libsysprop-platform/android_arm64_armv8-a_static/gen/sysprop/include" 277 platformPublicCorePath := "libsysprop-platform/android_arm64_armv8-a_static/gen/sysprop/public/include" 278 platformPublicVendorPath := "libsysprop-platform/android_vendor.29_arm64_armv8-a_static/gen/sysprop/public/include" 279 280 platformOnProductPath := "libsysprop-platform-on-product/android_arm64_armv8-a_static/gen/sysprop/public/include" 281 282 vendorInternalPath := "libsysprop-vendor/android_vendor.29_arm64_armv8-a_static/gen/sysprop/include" 283 vendorPublicPath := "libsysprop-vendor-on-product/android_arm64_armv8-a_static/gen/sysprop/public/include" 284 285 platformClient := result.ModuleForTests("cc-client-platform", coreVariant) 286 platformFlags := platformClient.Rule("cc").Args["cFlags"] 287 288 // platform should use platform's internal header 289 android.AssertStringDoesContain(t, "flags for platform", platformFlags, platformInternalPath) 290 291 platformStaticClient := result.ModuleForTests("cc-client-platform-static", coreVariant) 292 platformStaticFlags := platformStaticClient.Rule("cc").Args["cFlags"] 293 294 // platform-static should use platform's internal header 295 android.AssertStringDoesContain(t, "flags for platform-static", platformStaticFlags, platformInternalPath) 296 297 productClient := result.ModuleForTests("cc-client-product", coreVariant) 298 productFlags := productClient.Rule("cc").Args["cFlags"] 299 300 // Product should use platform's and vendor's public headers 301 if !strings.Contains(productFlags, platformOnProductPath) || 302 !strings.Contains(productFlags, vendorPublicPath) { 303 t.Errorf("flags for product must contain %#v and %#v, but was %#v.", 304 platformPublicCorePath, vendorPublicPath, productFlags) 305 } 306 307 vendorClient := result.ModuleForTests("cc-client-vendor", vendorVariant) 308 vendorFlags := vendorClient.Rule("cc").Args["cFlags"] 309 310 // Vendor should use platform's public header and vendor's internal header 311 if !strings.Contains(vendorFlags, platformPublicVendorPath) || 312 !strings.Contains(vendorFlags, vendorInternalPath) { 313 t.Errorf("flags for vendor must contain %#v and %#v, but was %#v.", 314 platformPublicVendorPath, vendorInternalPath, vendorFlags) 315 } 316 317 // Java modules linking against system API should use public stub 318 javaSystemApiClient := result.ModuleForTests("java-platform", "android_common").Rule("javac") 319 syspropPlatformPublic := result.ModuleForTests("sysprop-platform_public", "android_common").Description("for turbine") 320 if g, w := javaSystemApiClient.Implicits.Strings(), syspropPlatformPublic.Output.String(); !android.InList(w, g) { 321 t.Errorf("system api client should use public stub %q, got %q", w, g) 322 } 323} 324 325func TestApexAvailabilityIsForwarded(t *testing.T) { 326 result := test(t, ` 327 sysprop_library { 328 name: "sysprop-platform", 329 apex_available: ["//apex_available:platform"], 330 srcs: ["android/sysprop/PlatformProperties.sysprop"], 331 api_packages: ["android.sysprop"], 332 property_owner: "Platform", 333 } 334 `) 335 336 expected := []string{"//apex_available:platform"} 337 338 ccModule := result.ModuleForTests("libsysprop-platform", "android_arm64_armv8-a_shared").Module().(*cc.Module) 339 propFromCc := ccModule.ApexProperties.Apex_available 340 android.AssertDeepEquals(t, "apex_available forwarding to cc module", expected, propFromCc) 341 342 javaModule := result.ModuleForTests("sysprop-platform", "android_common").Module().(*java.Library) 343 propFromJava := javaModule.ApexProperties.Apex_available 344 android.AssertDeepEquals(t, "apex_available forwarding to java module", expected, propFromJava) 345} 346 347func TestMinSdkVersionIsForwarded(t *testing.T) { 348 result := test(t, ` 349 sysprop_library { 350 name: "sysprop-platform", 351 srcs: ["android/sysprop/PlatformProperties.sysprop"], 352 api_packages: ["android.sysprop"], 353 property_owner: "Platform", 354 cpp: { 355 min_sdk_version: "29", 356 }, 357 java: { 358 min_sdk_version: "30", 359 }, 360 } 361 `) 362 363 ccModule := result.ModuleForTests("libsysprop-platform", "android_arm64_armv8-a_shared").Module().(*cc.Module) 364 propFromCc := proptools.String(ccModule.Properties.Min_sdk_version) 365 android.AssertStringEquals(t, "min_sdk_version forwarding to cc module", "29", propFromCc) 366 367 javaModule := result.ModuleForTests("sysprop-platform", "android_common").Module().(*java.Library) 368 propFromJava := javaModule.MinSdkVersionString() 369 android.AssertStringEquals(t, "min_sdk_version forwarding to java module", "30", propFromJava) 370} 371