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 aconfig 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "slices" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker) 24*333d2b36SAndroid Build Coastguard Worker 25*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigDeclarations(t *testing.T) { 26*333d2b36SAndroid Build Coastguard Worker bp := ` 27*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 28*333d2b36SAndroid Build Coastguard Worker name: "module_name", 29*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 30*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 31*333d2b36SAndroid Build Coastguard Worker exportable: true, 32*333d2b36SAndroid Build Coastguard Worker srcs: [ 33*333d2b36SAndroid Build Coastguard Worker "foo.aconfig", 34*333d2b36SAndroid Build Coastguard Worker "bar.aconfig", 35*333d2b36SAndroid Build Coastguard Worker ], 36*333d2b36SAndroid Build Coastguard Worker } 37*333d2b36SAndroid Build Coastguard Worker ` 38*333d2b36SAndroid Build Coastguard Worker result := runTest(t, android.FixtureExpectsNoErrors, bp) 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Worker module := result.ModuleForTests("module_name", "").Module().(*DeclarationsModule) 41*333d2b36SAndroid Build Coastguard Worker 42*333d2b36SAndroid Build Coastguard Worker // Check that the provider has the right contents 43*333d2b36SAndroid Build Coastguard Worker depData, _ := android.OtherModuleProvider(result, module, android.AconfigDeclarationsProviderKey) 44*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "package", depData.Package, "com.example.package") 45*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "container", depData.Container, "com.android.foo") 46*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "exportable", depData.Exportable, true) 47*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(depData.IntermediateCacheOutputPath.String(), "/intermediate.pb") { 48*333d2b36SAndroid Build Coastguard Worker t.Errorf("Missing intermediates proto path in provider: %s", depData.IntermediateCacheOutputPath.String()) 49*333d2b36SAndroid Build Coastguard Worker } 50*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(depData.IntermediateDumpOutputPath.String(), "/intermediate.txt") { 51*333d2b36SAndroid Build Coastguard Worker t.Errorf("Missing intermediates text path in provider: %s", depData.IntermediateDumpOutputPath.String()) 52*333d2b36SAndroid Build Coastguard Worker } 53*333d2b36SAndroid Build Coastguard Worker} 54*333d2b36SAndroid Build Coastguard Worker 55*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigDeclarationsWithExportableUnset(t *testing.T) { 56*333d2b36SAndroid Build Coastguard Worker bp := ` 57*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 58*333d2b36SAndroid Build Coastguard Worker name: "module_name", 59*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 60*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 61*333d2b36SAndroid Build Coastguard Worker srcs: [ 62*333d2b36SAndroid Build Coastguard Worker "foo.aconfig", 63*333d2b36SAndroid Build Coastguard Worker "bar.aconfig", 64*333d2b36SAndroid Build Coastguard Worker ], 65*333d2b36SAndroid Build Coastguard Worker } 66*333d2b36SAndroid Build Coastguard Worker ` 67*333d2b36SAndroid Build Coastguard Worker result := runTest(t, android.FixtureExpectsNoErrors, bp) 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Worker module := result.ModuleForTests("module_name", "").Module().(*DeclarationsModule) 70*333d2b36SAndroid Build Coastguard Worker depData, _ := android.OtherModuleProvider(result, module, android.AconfigDeclarationsProviderKey) 71*333d2b36SAndroid Build Coastguard Worker android.AssertBoolEquals(t, "exportable", depData.Exportable, false) 72*333d2b36SAndroid Build Coastguard Worker} 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Workerfunc TestAconfigDeclarationsWithContainer(t *testing.T) { 75*333d2b36SAndroid Build Coastguard Worker bp := ` 76*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 77*333d2b36SAndroid Build Coastguard Worker name: "module_name", 78*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 79*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 80*333d2b36SAndroid Build Coastguard Worker srcs: [ 81*333d2b36SAndroid Build Coastguard Worker "foo.aconfig", 82*333d2b36SAndroid Build Coastguard Worker ], 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker ` 85*333d2b36SAndroid Build Coastguard Worker result := runTest(t, android.FixtureExpectsNoErrors, bp) 86*333d2b36SAndroid Build Coastguard Worker 87*333d2b36SAndroid Build Coastguard Worker module := result.ModuleForTests("module_name", "") 88*333d2b36SAndroid Build Coastguard Worker rule := module.Rule("aconfig") 89*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "rule must contain container", rule.Args["container"], "--container com.android.foo") 90*333d2b36SAndroid Build Coastguard Worker} 91*333d2b36SAndroid Build Coastguard Worker 92*333d2b36SAndroid Build Coastguard Workerfunc TestMandatoryProperties(t *testing.T) { 93*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 94*333d2b36SAndroid Build Coastguard Worker name string 95*333d2b36SAndroid Build Coastguard Worker expectedError string 96*333d2b36SAndroid Build Coastguard Worker bp string 97*333d2b36SAndroid Build Coastguard Worker }{ 98*333d2b36SAndroid Build Coastguard Worker { 99*333d2b36SAndroid Build Coastguard Worker name: "Srcs missing from aconfig_declarations", 100*333d2b36SAndroid Build Coastguard Worker bp: ` 101*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 102*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_foo", 103*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 104*333d2b36SAndroid Build Coastguard Worker container: "otherapex", 105*333d2b36SAndroid Build Coastguard Worker }`, 106*333d2b36SAndroid Build Coastguard Worker expectedError: `missing source files`, 107*333d2b36SAndroid Build Coastguard Worker }, 108*333d2b36SAndroid Build Coastguard Worker { 109*333d2b36SAndroid Build Coastguard Worker name: "Package missing from aconfig_declarations", 110*333d2b36SAndroid Build Coastguard Worker bp: ` 111*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 112*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_foo", 113*333d2b36SAndroid Build Coastguard Worker container: "otherapex", 114*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.aconfig"], 115*333d2b36SAndroid Build Coastguard Worker }`, 116*333d2b36SAndroid Build Coastguard Worker expectedError: `missing package property`, 117*333d2b36SAndroid Build Coastguard Worker }, 118*333d2b36SAndroid Build Coastguard Worker { 119*333d2b36SAndroid Build Coastguard Worker name: "Container missing from aconfig_declarations", 120*333d2b36SAndroid Build Coastguard Worker bp: ` 121*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 122*333d2b36SAndroid Build Coastguard Worker name: "my_aconfig_declarations_foo", 123*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 124*333d2b36SAndroid Build Coastguard Worker srcs: ["foo.aconfig"], 125*333d2b36SAndroid Build Coastguard Worker }`, 126*333d2b36SAndroid Build Coastguard Worker expectedError: `missing container property`, 127*333d2b36SAndroid Build Coastguard Worker }, 128*333d2b36SAndroid Build Coastguard Worker } 129*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 130*333d2b36SAndroid Build Coastguard Worker t.Run(test.name, func(t *testing.T) { 131*333d2b36SAndroid Build Coastguard Worker errorHandler := android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError) 132*333d2b36SAndroid Build Coastguard Worker android.GroupFixturePreparers(PrepareForTestWithAconfigBuildComponents). 133*333d2b36SAndroid Build Coastguard Worker ExtendWithErrorHandler(errorHandler). 134*333d2b36SAndroid Build Coastguard Worker RunTestWithBp(t, test.bp) 135*333d2b36SAndroid Build Coastguard Worker }) 136*333d2b36SAndroid Build Coastguard Worker } 137*333d2b36SAndroid Build Coastguard Worker} 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Workerfunc TestAssembleFileName(t *testing.T) { 140*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 141*333d2b36SAndroid Build Coastguard Worker name string 142*333d2b36SAndroid Build Coastguard Worker releaseConfig string 143*333d2b36SAndroid Build Coastguard Worker path string 144*333d2b36SAndroid Build Coastguard Worker expectedValue string 145*333d2b36SAndroid Build Coastguard Worker }{ 146*333d2b36SAndroid Build Coastguard Worker { 147*333d2b36SAndroid Build Coastguard Worker name: "active release config", 148*333d2b36SAndroid Build Coastguard Worker path: "file.path", 149*333d2b36SAndroid Build Coastguard Worker expectedValue: "file.path", 150*333d2b36SAndroid Build Coastguard Worker }, 151*333d2b36SAndroid Build Coastguard Worker { 152*333d2b36SAndroid Build Coastguard Worker name: "release config FOO", 153*333d2b36SAndroid Build Coastguard Worker releaseConfig: "FOO", 154*333d2b36SAndroid Build Coastguard Worker path: "file.path", 155*333d2b36SAndroid Build Coastguard Worker expectedValue: "file-FOO.path", 156*333d2b36SAndroid Build Coastguard Worker }, 157*333d2b36SAndroid Build Coastguard Worker } 158*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 159*333d2b36SAndroid Build Coastguard Worker actualValue := assembleFileName(test.releaseConfig, test.path) 160*333d2b36SAndroid Build Coastguard Worker if actualValue != test.expectedValue { 161*333d2b36SAndroid Build Coastguard Worker t.Errorf("Expected %q found %q", test.expectedValue, actualValue) 162*333d2b36SAndroid Build Coastguard Worker } 163*333d2b36SAndroid Build Coastguard Worker } 164*333d2b36SAndroid Build Coastguard Worker} 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Workerfunc TestGenerateAndroidBuildActions(t *testing.T) { 167*333d2b36SAndroid Build Coastguard Worker testCases := []struct { 168*333d2b36SAndroid Build Coastguard Worker name string 169*333d2b36SAndroid Build Coastguard Worker buildFlags map[string]string 170*333d2b36SAndroid Build Coastguard Worker bp string 171*333d2b36SAndroid Build Coastguard Worker errorHandler android.FixtureErrorHandler 172*333d2b36SAndroid Build Coastguard Worker }{ 173*333d2b36SAndroid Build Coastguard Worker { 174*333d2b36SAndroid Build Coastguard Worker name: "generate extra", 175*333d2b36SAndroid Build Coastguard Worker buildFlags: map[string]string{ 176*333d2b36SAndroid Build Coastguard Worker "RELEASE_ACONFIG_EXTRA_RELEASE_CONFIGS": "config2", 177*333d2b36SAndroid Build Coastguard Worker "RELEASE_ACONFIG_VALUE_SETS": "aconfig_value_set-config1", 178*333d2b36SAndroid Build Coastguard Worker "RELEASE_ACONFIG_VALUE_SETS_config2": "aconfig_value_set-config2", 179*333d2b36SAndroid Build Coastguard Worker }, 180*333d2b36SAndroid Build Coastguard Worker bp: ` 181*333d2b36SAndroid Build Coastguard Worker aconfig_declarations { 182*333d2b36SAndroid Build Coastguard Worker name: "module_name", 183*333d2b36SAndroid Build Coastguard Worker package: "com.example.package", 184*333d2b36SAndroid Build Coastguard Worker container: "com.android.foo", 185*333d2b36SAndroid Build Coastguard Worker srcs: [ 186*333d2b36SAndroid Build Coastguard Worker "foo.aconfig", 187*333d2b36SAndroid Build Coastguard Worker "bar.aconfig", 188*333d2b36SAndroid Build Coastguard Worker ], 189*333d2b36SAndroid Build Coastguard Worker } 190*333d2b36SAndroid Build Coastguard Worker aconfig_value_set { 191*333d2b36SAndroid Build Coastguard Worker name: "aconfig_value_set-config1", 192*333d2b36SAndroid Build Coastguard Worker values: [] 193*333d2b36SAndroid Build Coastguard Worker } 194*333d2b36SAndroid Build Coastguard Worker aconfig_value_set { 195*333d2b36SAndroid Build Coastguard Worker name: "aconfig_value_set-config2", 196*333d2b36SAndroid Build Coastguard Worker values: [] 197*333d2b36SAndroid Build Coastguard Worker } 198*333d2b36SAndroid Build Coastguard Worker `, 199*333d2b36SAndroid Build Coastguard Worker }, 200*333d2b36SAndroid Build Coastguard Worker } 201*333d2b36SAndroid Build Coastguard Worker for _, test := range testCases { 202*333d2b36SAndroid Build Coastguard Worker fixture := PrepareForTest(t, addBuildFlagsForTest(test.buildFlags)) 203*333d2b36SAndroid Build Coastguard Worker if test.errorHandler != nil { 204*333d2b36SAndroid Build Coastguard Worker fixture = fixture.ExtendWithErrorHandler(test.errorHandler) 205*333d2b36SAndroid Build Coastguard Worker } 206*333d2b36SAndroid Build Coastguard Worker result := fixture.RunTestWithBp(t, test.bp) 207*333d2b36SAndroid Build Coastguard Worker module := result.ModuleForTests("module_name", "").Module().(*DeclarationsModule) 208*333d2b36SAndroid Build Coastguard Worker depData, _ := android.OtherModuleProvider(result, module, android.AconfigReleaseDeclarationsProviderKey) 209*333d2b36SAndroid Build Coastguard Worker expectedKeys := []string{""} 210*333d2b36SAndroid Build Coastguard Worker for _, rc := range strings.Split(test.buildFlags["RELEASE_ACONFIG_EXTRA_RELEASE_CONFIGS"], " ") { 211*333d2b36SAndroid Build Coastguard Worker expectedKeys = append(expectedKeys, rc) 212*333d2b36SAndroid Build Coastguard Worker } 213*333d2b36SAndroid Build Coastguard Worker slices.Sort(expectedKeys) 214*333d2b36SAndroid Build Coastguard Worker actualKeys := []string{} 215*333d2b36SAndroid Build Coastguard Worker for rc := range depData { 216*333d2b36SAndroid Build Coastguard Worker actualKeys = append(actualKeys, rc) 217*333d2b36SAndroid Build Coastguard Worker } 218*333d2b36SAndroid Build Coastguard Worker slices.Sort(actualKeys) 219*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "provider keys", strings.Join(expectedKeys, " "), strings.Join(actualKeys, " ")) 220*333d2b36SAndroid Build Coastguard Worker for _, rc := range actualKeys { 221*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(depData[rc].IntermediateCacheOutputPath.String(), assembleFileName(rc, "/intermediate.pb")) { 222*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect intermediates proto path in provider for release config %s: %s", rc, depData[rc].IntermediateCacheOutputPath.String()) 223*333d2b36SAndroid Build Coastguard Worker } 224*333d2b36SAndroid Build Coastguard Worker if !strings.HasSuffix(depData[rc].IntermediateDumpOutputPath.String(), assembleFileName(rc, "/intermediate.txt")) { 225*333d2b36SAndroid Build Coastguard Worker t.Errorf("Incorrect intermediates text path in provider for release config %s: %s", rc, depData[rc].IntermediateDumpOutputPath.String()) 226*333d2b36SAndroid Build Coastguard Worker } 227*333d2b36SAndroid Build Coastguard Worker } 228*333d2b36SAndroid Build Coastguard Worker } 229*333d2b36SAndroid Build Coastguard Worker} 230