xref: /aosp_15_r20/build/soong/aconfig/aconfig_declarations_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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