1*333d2b36SAndroid Build Coastguard Worker// Copyright 2018 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage dexpreopt 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 19*333d2b36SAndroid Build Coastguard Worker "fmt" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workerfunc testSystemModuleConfig(ctx android.PathContext, name string) *ModuleConfig { 24*333d2b36SAndroid Build Coastguard Worker return testModuleConfig(ctx, name, "system") 25*333d2b36SAndroid Build Coastguard Worker} 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workerfunc testSystemProductModuleConfig(ctx android.PathContext, name string) *ModuleConfig { 28*333d2b36SAndroid Build Coastguard Worker return testModuleConfig(ctx, name, "system/product") 29*333d2b36SAndroid Build Coastguard Worker} 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workerfunc testProductModuleConfig(ctx android.PathContext, name string) *ModuleConfig { 32*333d2b36SAndroid Build Coastguard Worker return testModuleConfig(ctx, name, "product") 33*333d2b36SAndroid Build Coastguard Worker} 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Workerfunc testModuleConfig(ctx android.PathContext, name, partition string) *ModuleConfig { 36*333d2b36SAndroid Build Coastguard Worker return createTestModuleConfig( 37*333d2b36SAndroid Build Coastguard Worker name, 38*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("/%s/app/test/%s.apk", partition, name), 39*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/%s.apk", name, name)), 40*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/dex/%s.jar", name, name)), 41*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name))) 42*333d2b36SAndroid Build Coastguard Worker} 43*333d2b36SAndroid Build Coastguard Worker 44*333d2b36SAndroid Build Coastguard Workerfunc testApexModuleConfig(ctx android.PathContext, name, apexName string) *ModuleConfig { 45*333d2b36SAndroid Build Coastguard Worker ret := createTestModuleConfig( 46*333d2b36SAndroid Build Coastguard Worker name, 47*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("/apex/%s/javalib/%s.jar", apexName, name), 48*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/dexpreopt/%s.jar", name, name)), 49*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/aligned/%s.jar", name, name)), 50*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name))) 51*333d2b36SAndroid Build Coastguard Worker ret.ApexPartition = "/system" 52*333d2b36SAndroid Build Coastguard Worker return ret 53*333d2b36SAndroid Build Coastguard Worker} 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Workerfunc testPlatformSystemServerModuleConfig(ctx android.PathContext, name string) *ModuleConfig { 56*333d2b36SAndroid Build Coastguard Worker return createTestModuleConfig( 57*333d2b36SAndroid Build Coastguard Worker name, 58*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("/system/framework/%s.jar", name), 59*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/dexpreopt/%s.jar", name, name)), 60*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/aligned/%s.jar", name, name)), 61*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name))) 62*333d2b36SAndroid Build Coastguard Worker} 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Workerfunc testSystemExtSystemServerModuleConfig(ctx android.PathContext, name string) *ModuleConfig { 65*333d2b36SAndroid Build Coastguard Worker return createTestModuleConfig( 66*333d2b36SAndroid Build Coastguard Worker name, 67*333d2b36SAndroid Build Coastguard Worker fmt.Sprintf("/system_ext/framework/%s.jar", name), 68*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/dexpreopt/%s.jar", name, name)), 69*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/aligned/%s.jar", name, name)), 70*333d2b36SAndroid Build Coastguard Worker android.PathForOutput(ctx, fmt.Sprintf("%s/enforce_uses_libraries.status", name))) 71*333d2b36SAndroid Build Coastguard Worker} 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Workerfunc createTestModuleConfig(name, dexLocation string, buildPath, dexPath, enforceUsesLibrariesStatusFile android.OutputPath) *ModuleConfig { 74*333d2b36SAndroid Build Coastguard Worker return &ModuleConfig{ 75*333d2b36SAndroid Build Coastguard Worker Name: name, 76*333d2b36SAndroid Build Coastguard Worker DexLocation: dexLocation, 77*333d2b36SAndroid Build Coastguard Worker BuildPath: buildPath, 78*333d2b36SAndroid Build Coastguard Worker DexPath: dexPath, 79*333d2b36SAndroid Build Coastguard Worker UncompressedDex: false, 80*333d2b36SAndroid Build Coastguard Worker HasApkLibraries: false, 81*333d2b36SAndroid Build Coastguard Worker PreoptFlags: nil, 82*333d2b36SAndroid Build Coastguard Worker ProfileClassListing: android.OptionalPath{}, 83*333d2b36SAndroid Build Coastguard Worker ProfileIsTextListing: false, 84*333d2b36SAndroid Build Coastguard Worker EnforceUsesLibrariesStatusFile: enforceUsesLibrariesStatusFile, 85*333d2b36SAndroid Build Coastguard Worker EnforceUsesLibraries: false, 86*333d2b36SAndroid Build Coastguard Worker ClassLoaderContexts: nil, 87*333d2b36SAndroid Build Coastguard Worker Archs: []android.ArchType{android.Arm}, 88*333d2b36SAndroid Build Coastguard Worker DexPreoptImagesDeps: []android.OutputPaths{android.OutputPaths{}}, 89*333d2b36SAndroid Build Coastguard Worker DexPreoptImageLocationsOnHost: []string{}, 90*333d2b36SAndroid Build Coastguard Worker PreoptBootClassPathDexFiles: nil, 91*333d2b36SAndroid Build Coastguard Worker PreoptBootClassPathDexLocations: nil, 92*333d2b36SAndroid Build Coastguard Worker NoCreateAppImage: false, 93*333d2b36SAndroid Build Coastguard Worker ForceCreateAppImage: false, 94*333d2b36SAndroid Build Coastguard Worker PresignedPrebuilt: false, 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker} 97*333d2b36SAndroid Build Coastguard Worker 98*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreopt(t *testing.T) { 99*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 100*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 101*333d2b36SAndroid Build Coastguard Worker globalSoong := globalSoongConfigForTests(ctx) 102*333d2b36SAndroid Build Coastguard Worker global := GlobalConfigForTests(ctx) 103*333d2b36SAndroid Build Coastguard Worker module := testSystemModuleConfig(ctx, "test") 104*333d2b36SAndroid Build Coastguard Worker productPackages := android.PathForTesting("product_packages.txt") 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true) 107*333d2b36SAndroid Build Coastguard Worker if err != nil { 108*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 109*333d2b36SAndroid Build Coastguard Worker } 110*333d2b36SAndroid Build Coastguard Worker 111*333d2b36SAndroid Build Coastguard Worker wantInstalls := android.RuleBuilderInstalls{ 112*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "test/oat/arm/package.odex"), "/system/app/test/oat/arm/test.odex"}, 113*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "test/oat/arm/package.vdex"), "/system/app/test/oat/arm/test.vdex"}, 114*333d2b36SAndroid Build Coastguard Worker } 115*333d2b36SAndroid Build Coastguard Worker 116*333d2b36SAndroid Build Coastguard Worker if rule.Installs().String() != wantInstalls.String() { 117*333d2b36SAndroid Build Coastguard Worker t.Errorf("\nwant installs:\n %v\ngot:\n %v", wantInstalls, rule.Installs()) 118*333d2b36SAndroid Build Coastguard Worker } 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "", rule.Inputs().RelativeToTop().Strings(), 121*333d2b36SAndroid Build Coastguard Worker "out/soong/dexpreopt_test/uffd_gc_flag.txt") 122*333d2b36SAndroid Build Coastguard Worker} 123*333d2b36SAndroid Build Coastguard Worker 124*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptSystemOther(t *testing.T) { 125*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 126*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 127*333d2b36SAndroid Build Coastguard Worker globalSoong := globalSoongConfigForTests(ctx) 128*333d2b36SAndroid Build Coastguard Worker global := GlobalConfigForTests(ctx) 129*333d2b36SAndroid Build Coastguard Worker systemModule := testSystemModuleConfig(ctx, "Stest") 130*333d2b36SAndroid Build Coastguard Worker systemProductModule := testSystemProductModuleConfig(ctx, "SPtest") 131*333d2b36SAndroid Build Coastguard Worker productModule := testProductModuleConfig(ctx, "Ptest") 132*333d2b36SAndroid Build Coastguard Worker productPackages := android.PathForTesting("product_packages.txt") 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker global.HasSystemOther = true 135*333d2b36SAndroid Build Coastguard Worker 136*333d2b36SAndroid Build Coastguard Worker type moduleTest struct { 137*333d2b36SAndroid Build Coastguard Worker module *ModuleConfig 138*333d2b36SAndroid Build Coastguard Worker expectedPartition string 139*333d2b36SAndroid Build Coastguard Worker } 140*333d2b36SAndroid Build Coastguard Worker tests := []struct { 141*333d2b36SAndroid Build Coastguard Worker patterns []string 142*333d2b36SAndroid Build Coastguard Worker moduleTests []moduleTest 143*333d2b36SAndroid Build Coastguard Worker }{ 144*333d2b36SAndroid Build Coastguard Worker { 145*333d2b36SAndroid Build Coastguard Worker patterns: []string{"app/%"}, 146*333d2b36SAndroid Build Coastguard Worker moduleTests: []moduleTest{ 147*333d2b36SAndroid Build Coastguard Worker {module: systemModule, expectedPartition: "system_other/system"}, 148*333d2b36SAndroid Build Coastguard Worker {module: systemProductModule, expectedPartition: "system/product"}, 149*333d2b36SAndroid Build Coastguard Worker {module: productModule, expectedPartition: "product"}, 150*333d2b36SAndroid Build Coastguard Worker }, 151*333d2b36SAndroid Build Coastguard Worker }, 152*333d2b36SAndroid Build Coastguard Worker // product/app/% only applies to product apps inside the system partition 153*333d2b36SAndroid Build Coastguard Worker { 154*333d2b36SAndroid Build Coastguard Worker patterns: []string{"app/%", "product/app/%"}, 155*333d2b36SAndroid Build Coastguard Worker moduleTests: []moduleTest{ 156*333d2b36SAndroid Build Coastguard Worker {module: systemModule, expectedPartition: "system_other/system"}, 157*333d2b36SAndroid Build Coastguard Worker {module: systemProductModule, expectedPartition: "system_other/system/product"}, 158*333d2b36SAndroid Build Coastguard Worker {module: productModule, expectedPartition: "system_other/product"}, 159*333d2b36SAndroid Build Coastguard Worker }, 160*333d2b36SAndroid Build Coastguard Worker }, 161*333d2b36SAndroid Build Coastguard Worker } 162*333d2b36SAndroid Build Coastguard Worker 163*333d2b36SAndroid Build Coastguard Worker for _, test := range tests { 164*333d2b36SAndroid Build Coastguard Worker global.PatternsOnSystemOther = test.patterns 165*333d2b36SAndroid Build Coastguard Worker for _, mt := range test.moduleTests { 166*333d2b36SAndroid Build Coastguard Worker rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, mt.module, productPackages, true) 167*333d2b36SAndroid Build Coastguard Worker if err != nil { 168*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 169*333d2b36SAndroid Build Coastguard Worker } 170*333d2b36SAndroid Build Coastguard Worker 171*333d2b36SAndroid Build Coastguard Worker name := mt.module.Name 172*333d2b36SAndroid Build Coastguard Worker wantInstalls := android.RuleBuilderInstalls{ 173*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, name+"/oat/arm/package.odex"), fmt.Sprintf("/%s/app/test/oat/arm/%s.odex", mt.expectedPartition, name)}, 174*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, name+"/oat/arm/package.vdex"), fmt.Sprintf("/%s/app/test/oat/arm/%s.vdex", mt.expectedPartition, name)}, 175*333d2b36SAndroid Build Coastguard Worker } 176*333d2b36SAndroid Build Coastguard Worker 177*333d2b36SAndroid Build Coastguard Worker if rule.Installs().String() != wantInstalls.String() { 178*333d2b36SAndroid Build Coastguard Worker t.Errorf("\nwant installs:\n %v\ngot:\n %v", wantInstalls, rule.Installs()) 179*333d2b36SAndroid Build Coastguard Worker } 180*333d2b36SAndroid Build Coastguard Worker } 181*333d2b36SAndroid Build Coastguard Worker } 182*333d2b36SAndroid Build Coastguard Worker 183*333d2b36SAndroid Build Coastguard Worker} 184*333d2b36SAndroid Build Coastguard Worker 185*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptApexSystemServerJars(t *testing.T) { 186*333d2b36SAndroid Build Coastguard Worker // modify the global variable for test 187*333d2b36SAndroid Build Coastguard Worker var oldDexpreoptRunningInSoong = DexpreoptRunningInSoong 188*333d2b36SAndroid Build Coastguard Worker DexpreoptRunningInSoong = true 189*333d2b36SAndroid Build Coastguard Worker 190*333d2b36SAndroid Build Coastguard Worker // test begin 191*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 192*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 193*333d2b36SAndroid Build Coastguard Worker globalSoong := globalSoongConfigForTests(ctx) 194*333d2b36SAndroid Build Coastguard Worker global := GlobalConfigForTests(ctx) 195*333d2b36SAndroid Build Coastguard Worker module := testApexModuleConfig(ctx, "service-A", "com.android.apex1") 196*333d2b36SAndroid Build Coastguard Worker productPackages := android.PathForTesting("product_packages.txt") 197*333d2b36SAndroid Build Coastguard Worker 198*333d2b36SAndroid Build Coastguard Worker global.ApexSystemServerJars = android.CreateTestConfiguredJarList( 199*333d2b36SAndroid Build Coastguard Worker []string{"com.android.apex1:service-A"}) 200*333d2b36SAndroid Build Coastguard Worker 201*333d2b36SAndroid Build Coastguard Worker rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true) 202*333d2b36SAndroid Build Coastguard Worker if err != nil { 203*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 204*333d2b36SAndroid Build Coastguard Worker } 205*333d2b36SAndroid Build Coastguard Worker 206*333d2b36SAndroid Build Coastguard Worker wantInstalls := android.RuleBuilderInstalls{ 207*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.odex"}, 208*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.vdex"}, 209*333d2b36SAndroid Build Coastguard Worker } 210*333d2b36SAndroid Build Coastguard Worker 211*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String()) 212*333d2b36SAndroid Build Coastguard Worker 213*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "apex sscp jar copy", rule.Outputs().Strings(), "out/soong/system_server_dexjars/service-A.jar") 214*333d2b36SAndroid Build Coastguard Worker 215*333d2b36SAndroid Build Coastguard Worker // rule with apex sscp cp as false 216*333d2b36SAndroid Build Coastguard Worker rule, err = GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, false) 217*333d2b36SAndroid Build Coastguard Worker if err != nil { 218*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 219*333d2b36SAndroid Build Coastguard Worker } 220*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "apex sscp jar copy", rule.Outputs().Strings(), "out/soong/system_server_dexjars/service-A.jar") 221*333d2b36SAndroid Build Coastguard Worker 222*333d2b36SAndroid Build Coastguard Worker // cleanup the global variable for test 223*333d2b36SAndroid Build Coastguard Worker DexpreoptRunningInSoong = oldDexpreoptRunningInSoong 224*333d2b36SAndroid Build Coastguard Worker} 225*333d2b36SAndroid Build Coastguard Worker 226*333d2b36SAndroid Build Coastguard Worker// Same as `TestDexPreoptApexSystemServerJars`, but the apex jar is in /system_ext 227*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptApexSystemServerJarsSystemExt(t *testing.T) { 228*333d2b36SAndroid Build Coastguard Worker // modify the global variable for test 229*333d2b36SAndroid Build Coastguard Worker var oldDexpreoptRunningInSoong = DexpreoptRunningInSoong 230*333d2b36SAndroid Build Coastguard Worker DexpreoptRunningInSoong = true 231*333d2b36SAndroid Build Coastguard Worker 232*333d2b36SAndroid Build Coastguard Worker // test begin 233*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 234*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 235*333d2b36SAndroid Build Coastguard Worker globalSoong := globalSoongConfigForTests(ctx) 236*333d2b36SAndroid Build Coastguard Worker global := GlobalConfigForTests(ctx) 237*333d2b36SAndroid Build Coastguard Worker module := testApexModuleConfig(ctx, "service-A", "com.android.apex1") 238*333d2b36SAndroid Build Coastguard Worker module.ApexPartition = "/system_ext" 239*333d2b36SAndroid Build Coastguard Worker productPackages := android.PathForTesting("product_packages.txt") 240*333d2b36SAndroid Build Coastguard Worker 241*333d2b36SAndroid Build Coastguard Worker global.ApexSystemServerJars = android.CreateTestConfiguredJarList( 242*333d2b36SAndroid Build Coastguard Worker []string{"com.android.apex1:service-A"}) 243*333d2b36SAndroid Build Coastguard Worker 244*333d2b36SAndroid Build Coastguard Worker rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true) 245*333d2b36SAndroid Build Coastguard Worker if err != nil { 246*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 247*333d2b36SAndroid Build Coastguard Worker } 248*333d2b36SAndroid Build Coastguard Worker 249*333d2b36SAndroid Build Coastguard Worker wantInstalls := android.RuleBuilderInstalls{ 250*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system_ext/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.odex"}, 251*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system_ext/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.vdex"}, 252*333d2b36SAndroid Build Coastguard Worker } 253*333d2b36SAndroid Build Coastguard Worker 254*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String()) 255*333d2b36SAndroid Build Coastguard Worker 256*333d2b36SAndroid Build Coastguard Worker android.AssertStringListContains(t, "apex sscp jar copy", rule.Outputs().Strings(), "out/soong/system_server_dexjars/service-A.jar") 257*333d2b36SAndroid Build Coastguard Worker 258*333d2b36SAndroid Build Coastguard Worker // rule with apex sscp cp as false 259*333d2b36SAndroid Build Coastguard Worker rule, err = GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, false) 260*333d2b36SAndroid Build Coastguard Worker if err != nil { 261*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 262*333d2b36SAndroid Build Coastguard Worker } 263*333d2b36SAndroid Build Coastguard Worker android.AssertStringListDoesNotContain(t, "apex sscp jar copy", rule.Outputs().Strings(), "out/soong/system_server_dexjars/service-A.jar") 264*333d2b36SAndroid Build Coastguard Worker 265*333d2b36SAndroid Build Coastguard Worker // cleanup the global variable for test 266*333d2b36SAndroid Build Coastguard Worker DexpreoptRunningInSoong = oldDexpreoptRunningInSoong 267*333d2b36SAndroid Build Coastguard Worker} 268*333d2b36SAndroid Build Coastguard Worker 269*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptStandaloneSystemServerJars(t *testing.T) { 270*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 271*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 272*333d2b36SAndroid Build Coastguard Worker globalSoong := globalSoongConfigForTests(ctx) 273*333d2b36SAndroid Build Coastguard Worker global := GlobalConfigForTests(ctx) 274*333d2b36SAndroid Build Coastguard Worker module := testPlatformSystemServerModuleConfig(ctx, "service-A") 275*333d2b36SAndroid Build Coastguard Worker productPackages := android.PathForTesting("product_packages.txt") 276*333d2b36SAndroid Build Coastguard Worker 277*333d2b36SAndroid Build Coastguard Worker global.StandaloneSystemServerJars = android.CreateTestConfiguredJarList( 278*333d2b36SAndroid Build Coastguard Worker []string{"platform:service-A"}) 279*333d2b36SAndroid Build Coastguard Worker 280*333d2b36SAndroid Build Coastguard Worker rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true) 281*333d2b36SAndroid Build Coastguard Worker if err != nil { 282*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 283*333d2b36SAndroid Build Coastguard Worker } 284*333d2b36SAndroid Build Coastguard Worker 285*333d2b36SAndroid Build Coastguard Worker wantInstalls := android.RuleBuilderInstalls{ 286*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system/framework/oat/arm/service-A.odex"}, 287*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system/framework/oat/arm/service-A.vdex"}, 288*333d2b36SAndroid Build Coastguard Worker } 289*333d2b36SAndroid Build Coastguard Worker 290*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String()) 291*333d2b36SAndroid Build Coastguard Worker} 292*333d2b36SAndroid Build Coastguard Worker 293*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptSystemExtSystemServerJars(t *testing.T) { 294*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 295*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 296*333d2b36SAndroid Build Coastguard Worker globalSoong := globalSoongConfigForTests(ctx) 297*333d2b36SAndroid Build Coastguard Worker global := GlobalConfigForTests(ctx) 298*333d2b36SAndroid Build Coastguard Worker module := testSystemExtSystemServerModuleConfig(ctx, "service-A") 299*333d2b36SAndroid Build Coastguard Worker productPackages := android.PathForTesting("product_packages.txt") 300*333d2b36SAndroid Build Coastguard Worker 301*333d2b36SAndroid Build Coastguard Worker global.StandaloneSystemServerJars = android.CreateTestConfiguredJarList( 302*333d2b36SAndroid Build Coastguard Worker []string{"system_ext:service-A"}) 303*333d2b36SAndroid Build Coastguard Worker 304*333d2b36SAndroid Build Coastguard Worker rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true) 305*333d2b36SAndroid Build Coastguard Worker if err != nil { 306*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 307*333d2b36SAndroid Build Coastguard Worker } 308*333d2b36SAndroid Build Coastguard Worker 309*333d2b36SAndroid Build Coastguard Worker wantInstalls := android.RuleBuilderInstalls{ 310*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system_ext/framework/oat/arm/service-A.odex"}, 311*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system_ext/framework/oat/arm/service-A.vdex"}, 312*333d2b36SAndroid Build Coastguard Worker } 313*333d2b36SAndroid Build Coastguard Worker 314*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String()) 315*333d2b36SAndroid Build Coastguard Worker} 316*333d2b36SAndroid Build Coastguard Worker 317*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptApexStandaloneSystemServerJars(t *testing.T) { 318*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 319*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 320*333d2b36SAndroid Build Coastguard Worker globalSoong := globalSoongConfigForTests(ctx) 321*333d2b36SAndroid Build Coastguard Worker global := GlobalConfigForTests(ctx) 322*333d2b36SAndroid Build Coastguard Worker module := testApexModuleConfig(ctx, "service-A", "com.android.apex1") 323*333d2b36SAndroid Build Coastguard Worker productPackages := android.PathForTesting("product_packages.txt") 324*333d2b36SAndroid Build Coastguard Worker 325*333d2b36SAndroid Build Coastguard Worker global.ApexStandaloneSystemServerJars = android.CreateTestConfiguredJarList( 326*333d2b36SAndroid Build Coastguard Worker []string{"com.android.apex1:service-A"}) 327*333d2b36SAndroid Build Coastguard Worker 328*333d2b36SAndroid Build Coastguard Worker rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true) 329*333d2b36SAndroid Build Coastguard Worker if err != nil { 330*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 331*333d2b36SAndroid Build Coastguard Worker } 332*333d2b36SAndroid Build Coastguard Worker 333*333d2b36SAndroid Build Coastguard Worker wantInstalls := android.RuleBuilderInstalls{ 334*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.odex"), "/system/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.odex"}, 335*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "service-A/dexpreopt/oat/arm/javalib.vdex"), "/system/framework/oat/arm/apex@com.android.apex1@[email protected]@classes.vdex"}, 336*333d2b36SAndroid Build Coastguard Worker } 337*333d2b36SAndroid Build Coastguard Worker 338*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "installs", wantInstalls.String(), rule.Installs().String()) 339*333d2b36SAndroid Build Coastguard Worker} 340*333d2b36SAndroid Build Coastguard Worker 341*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptProfile(t *testing.T) { 342*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 343*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 344*333d2b36SAndroid Build Coastguard Worker globalSoong := globalSoongConfigForTests(ctx) 345*333d2b36SAndroid Build Coastguard Worker global := GlobalConfigForTests(ctx) 346*333d2b36SAndroid Build Coastguard Worker module := testSystemModuleConfig(ctx, "test") 347*333d2b36SAndroid Build Coastguard Worker productPackages := android.PathForTesting("product_packages.txt") 348*333d2b36SAndroid Build Coastguard Worker 349*333d2b36SAndroid Build Coastguard Worker module.ProfileClassListing = android.OptionalPathForPath(android.PathForTesting("profile")) 350*333d2b36SAndroid Build Coastguard Worker 351*333d2b36SAndroid Build Coastguard Worker rule, err := GenerateDexpreoptRule(ctx, globalSoong, global, module, productPackages, true) 352*333d2b36SAndroid Build Coastguard Worker if err != nil { 353*333d2b36SAndroid Build Coastguard Worker t.Fatal(err) 354*333d2b36SAndroid Build Coastguard Worker } 355*333d2b36SAndroid Build Coastguard Worker 356*333d2b36SAndroid Build Coastguard Worker wantInstalls := android.RuleBuilderInstalls{ 357*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "test/profile.prof"), "/system/app/test/test.apk.prof"}, 358*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "test/oat/arm/package.art"), "/system/app/test/oat/arm/test.art"}, 359*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "test/oat/arm/package.odex"), "/system/app/test/oat/arm/test.odex"}, 360*333d2b36SAndroid Build Coastguard Worker {android.PathForOutput(ctx, "test/oat/arm/package.vdex"), "/system/app/test/oat/arm/test.vdex"}, 361*333d2b36SAndroid Build Coastguard Worker } 362*333d2b36SAndroid Build Coastguard Worker 363*333d2b36SAndroid Build Coastguard Worker if rule.Installs().String() != wantInstalls.String() { 364*333d2b36SAndroid Build Coastguard Worker t.Errorf("\nwant installs:\n %v\ngot:\n %v", wantInstalls, rule.Installs()) 365*333d2b36SAndroid Build Coastguard Worker } 366*333d2b36SAndroid Build Coastguard Worker} 367*333d2b36SAndroid Build Coastguard Worker 368*333d2b36SAndroid Build Coastguard Workerfunc TestDexPreoptConfigToJson(t *testing.T) { 369*333d2b36SAndroid Build Coastguard Worker config := android.TestConfig("out", nil, "", nil) 370*333d2b36SAndroid Build Coastguard Worker ctx := android.BuilderContextForTesting(config) 371*333d2b36SAndroid Build Coastguard Worker module := testSystemModuleConfig(ctx, "test") 372*333d2b36SAndroid Build Coastguard Worker data, err := moduleConfigToJSON(module) 373*333d2b36SAndroid Build Coastguard Worker if err != nil { 374*333d2b36SAndroid Build Coastguard Worker t.Errorf("Failed to convert module config data to JSON, %v", err) 375*333d2b36SAndroid Build Coastguard Worker } 376*333d2b36SAndroid Build Coastguard Worker parsed, err := ParseModuleConfig(ctx, data) 377*333d2b36SAndroid Build Coastguard Worker if err != nil { 378*333d2b36SAndroid Build Coastguard Worker t.Errorf("Failed to parse JSON, %v", err) 379*333d2b36SAndroid Build Coastguard Worker } 380*333d2b36SAndroid Build Coastguard Worker before := fmt.Sprintf("%v", module) 381*333d2b36SAndroid Build Coastguard Worker after := fmt.Sprintf("%v", parsed) 382*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "The result must be the same as the original after marshalling and unmarshalling it.", before, after) 383*333d2b36SAndroid Build Coastguard Worker} 384*333d2b36SAndroid Build Coastguard Worker 385*333d2b36SAndroid Build Coastguard Workerfunc TestUffdGcFlagForce(t *testing.T) { 386*333d2b36SAndroid Build Coastguard Worker for _, enableUffdGc := range []string{"true", "false"} { 387*333d2b36SAndroid Build Coastguard Worker t.Run(enableUffdGc, func(t *testing.T) { 388*333d2b36SAndroid Build Coastguard Worker preparers := android.GroupFixturePreparers( 389*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFakeDex2oatd, 390*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDexpreoptConfig, 391*333d2b36SAndroid Build Coastguard Worker FixtureSetEnableUffdGc(enableUffdGc), 392*333d2b36SAndroid Build Coastguard Worker ) 393*333d2b36SAndroid Build Coastguard Worker 394*333d2b36SAndroid Build Coastguard Worker result := preparers.RunTest(t) 395*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 396*333d2b36SAndroid Build Coastguard Worker 397*333d2b36SAndroid Build Coastguard Worker ctx.SingletonForTests("dexpreopt-soong-config").Output("out/soong/dexpreopt/uffd_gc_flag.txt") 398*333d2b36SAndroid Build Coastguard Worker }) 399*333d2b36SAndroid Build Coastguard Worker } 400*333d2b36SAndroid Build Coastguard Worker} 401*333d2b36SAndroid Build Coastguard Worker 402*333d2b36SAndroid Build Coastguard Workerfunc TestUffdGcFlagDefault(t *testing.T) { 403*333d2b36SAndroid Build Coastguard Worker preparers := android.GroupFixturePreparers( 404*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFakeDex2oatd, 405*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDexpreoptConfig, 406*333d2b36SAndroid Build Coastguard Worker FixtureSetEnableUffdGc("default"), 407*333d2b36SAndroid Build Coastguard Worker ) 408*333d2b36SAndroid Build Coastguard Worker 409*333d2b36SAndroid Build Coastguard Worker result := preparers.RunTest(t) 410*333d2b36SAndroid Build Coastguard Worker ctx := result.TestContext 411*333d2b36SAndroid Build Coastguard Worker config := ctx.Config() 412*333d2b36SAndroid Build Coastguard Worker 413*333d2b36SAndroid Build Coastguard Worker rule := ctx.SingletonForTests("dexpreopt-soong-config").Rule("dexpreopt_uffd_gc_flag") 414*333d2b36SAndroid Build Coastguard Worker 415*333d2b36SAndroid Build Coastguard Worker android.AssertStringDoesContain(t, "", rule.RuleParams.Command, "construct_uffd_gc_flag") 416*333d2b36SAndroid Build Coastguard Worker android.AssertStringPathsRelativeToTopEquals(t, "", config, []string{ 417*333d2b36SAndroid Build Coastguard Worker "out/soong/dexpreopt/uffd_gc_flag.txt", 418*333d2b36SAndroid Build Coastguard Worker }, rule.AllOutputs()) 419*333d2b36SAndroid Build Coastguard Worker android.AssertPathsRelativeToTopEquals(t, "", []string{ 420*333d2b36SAndroid Build Coastguard Worker "out/soong/dexpreopt/kernel_version_for_uffd_gc.txt", 421*333d2b36SAndroid Build Coastguard Worker }, rule.Implicits) 422*333d2b36SAndroid Build Coastguard Worker} 423*333d2b36SAndroid Build Coastguard Worker 424*333d2b36SAndroid Build Coastguard Workerfunc TestUffdGcFlagBogus(t *testing.T) { 425*333d2b36SAndroid Build Coastguard Worker preparers := android.GroupFixturePreparers( 426*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithFakeDex2oatd, 427*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDexpreoptConfig, 428*333d2b36SAndroid Build Coastguard Worker FixtureSetEnableUffdGc("bogus"), 429*333d2b36SAndroid Build Coastguard Worker ) 430*333d2b36SAndroid Build Coastguard Worker 431*333d2b36SAndroid Build Coastguard Worker preparers. 432*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( 433*333d2b36SAndroid Build Coastguard Worker "Unknown value of PRODUCT_ENABLE_UFFD_GC: bogus")). 434*333d2b36SAndroid Build Coastguard Worker RunTest(t) 435*333d2b36SAndroid Build Coastguard Worker} 436