xref: /aosp_15_r20/build/soong/android/singleton_module_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 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 android
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"testing"
19*333d2b36SAndroid Build Coastguard Worker)
20*333d2b36SAndroid Build Coastguard Worker
21*333d2b36SAndroid Build Coastguard Workertype testSingletonModule struct {
22*333d2b36SAndroid Build Coastguard Worker	SingletonModuleBase
23*333d2b36SAndroid Build Coastguard Worker	ops []string
24*333d2b36SAndroid Build Coastguard Worker}
25*333d2b36SAndroid Build Coastguard Worker
26*333d2b36SAndroid Build Coastguard Workerfunc (tsm *testSingletonModule) GenerateAndroidBuildActions(ctx ModuleContext) {
27*333d2b36SAndroid Build Coastguard Worker	tsm.ops = append(tsm.ops, "GenerateAndroidBuildActions")
28*333d2b36SAndroid Build Coastguard Worker}
29*333d2b36SAndroid Build Coastguard Worker
30*333d2b36SAndroid Build Coastguard Workerfunc (tsm *testSingletonModule) GenerateSingletonBuildActions(ctx SingletonContext) {
31*333d2b36SAndroid Build Coastguard Worker	tsm.ops = append(tsm.ops, "GenerateSingletonBuildActions")
32*333d2b36SAndroid Build Coastguard Worker}
33*333d2b36SAndroid Build Coastguard Worker
34*333d2b36SAndroid Build Coastguard Workerfunc (tsm *testSingletonModule) MakeVars(ctx MakeVarsContext) {
35*333d2b36SAndroid Build Coastguard Worker	tsm.ops = append(tsm.ops, "MakeVars")
36*333d2b36SAndroid Build Coastguard Worker}
37*333d2b36SAndroid Build Coastguard Worker
38*333d2b36SAndroid Build Coastguard Workerfunc testSingletonModuleFactory() SingletonModule {
39*333d2b36SAndroid Build Coastguard Worker	tsm := &testSingletonModule{}
40*333d2b36SAndroid Build Coastguard Worker	InitAndroidSingletonModule(tsm)
41*333d2b36SAndroid Build Coastguard Worker	return tsm
42*333d2b36SAndroid Build Coastguard Worker}
43*333d2b36SAndroid Build Coastguard Worker
44*333d2b36SAndroid Build Coastguard Workervar prepareForSingletonModuleTest = GroupFixturePreparers(
45*333d2b36SAndroid Build Coastguard Worker	// Enable Kati output to test SingletonModules with MakeVars.
46*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithAndroidMk,
47*333d2b36SAndroid Build Coastguard Worker	FixtureRegisterWithContext(func(ctx RegistrationContext) {
48*333d2b36SAndroid Build Coastguard Worker		ctx.RegisterSingletonModuleType("test_singleton_module", testSingletonModuleFactory)
49*333d2b36SAndroid Build Coastguard Worker	}),
50*333d2b36SAndroid Build Coastguard Worker	PrepareForTestWithMakevars,
51*333d2b36SAndroid Build Coastguard Worker)
52*333d2b36SAndroid Build Coastguard Worker
53*333d2b36SAndroid Build Coastguard Workerfunc TestSingletonModule(t *testing.T) {
54*333d2b36SAndroid Build Coastguard Worker	bp := `
55*333d2b36SAndroid Build Coastguard Worker		test_singleton_module {
56*333d2b36SAndroid Build Coastguard Worker			name: "test_singleton_module",
57*333d2b36SAndroid Build Coastguard Worker		}
58*333d2b36SAndroid Build Coastguard Worker	`
59*333d2b36SAndroid Build Coastguard Worker	result := GroupFixturePreparers(
60*333d2b36SAndroid Build Coastguard Worker		prepareForSingletonModuleTest,
61*333d2b36SAndroid Build Coastguard Worker		FixtureWithRootAndroidBp(bp),
62*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Worker	ops := result.ModuleForTests("test_singleton_module", "").Module().(*testSingletonModule).ops
65*333d2b36SAndroid Build Coastguard Worker	wantOps := []string{"GenerateAndroidBuildActions", "GenerateSingletonBuildActions", "MakeVars"}
66*333d2b36SAndroid Build Coastguard Worker	AssertDeepEquals(t, "operations", wantOps, ops)
67*333d2b36SAndroid Build Coastguard Worker}
68*333d2b36SAndroid Build Coastguard Worker
69*333d2b36SAndroid Build Coastguard Workerfunc TestDuplicateSingletonModule(t *testing.T) {
70*333d2b36SAndroid Build Coastguard Worker	bp := `
71*333d2b36SAndroid Build Coastguard Worker		test_singleton_module {
72*333d2b36SAndroid Build Coastguard Worker			name: "test_singleton_module",
73*333d2b36SAndroid Build Coastguard Worker		}
74*333d2b36SAndroid Build Coastguard Worker
75*333d2b36SAndroid Build Coastguard Worker		test_singleton_module {
76*333d2b36SAndroid Build Coastguard Worker			name: "test_singleton_module2",
77*333d2b36SAndroid Build Coastguard Worker		}
78*333d2b36SAndroid Build Coastguard Worker	`
79*333d2b36SAndroid Build Coastguard Worker
80*333d2b36SAndroid Build Coastguard Worker	prepareForSingletonModuleTest.
81*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern([]string{
82*333d2b36SAndroid Build Coastguard Worker			`\QDuplicate SingletonModule "test_singleton_module", previously used in\E`,
83*333d2b36SAndroid Build Coastguard Worker		})).RunTestWithBp(t, bp)
84*333d2b36SAndroid Build Coastguard Worker}
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Workerfunc TestUnusedSingletonModule(t *testing.T) {
87*333d2b36SAndroid Build Coastguard Worker	result := GroupFixturePreparers(
88*333d2b36SAndroid Build Coastguard Worker		prepareForSingletonModuleTest,
89*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
90*333d2b36SAndroid Build Coastguard Worker
91*333d2b36SAndroid Build Coastguard Worker	singleton := result.SingletonForTests("test_singleton_module").Singleton()
92*333d2b36SAndroid Build Coastguard Worker	sm := singleton.(*singletonModuleSingletonAdaptor).sm
93*333d2b36SAndroid Build Coastguard Worker	ops := sm.(*testSingletonModule).ops
94*333d2b36SAndroid Build Coastguard Worker	if ops != nil {
95*333d2b36SAndroid Build Coastguard Worker		t.Errorf("Expected no operations, got %q", ops)
96*333d2b36SAndroid Build Coastguard Worker	}
97*333d2b36SAndroid Build Coastguard Worker}
98*333d2b36SAndroid Build Coastguard Worker
99*333d2b36SAndroid Build Coastguard Workerfunc TestVariantSingletonModule(t *testing.T) {
100*333d2b36SAndroid Build Coastguard Worker	if testing.Short() {
101*333d2b36SAndroid Build Coastguard Worker		t.Skip("test fails with data race enabled")
102*333d2b36SAndroid Build Coastguard Worker	}
103*333d2b36SAndroid Build Coastguard Worker	bp := `
104*333d2b36SAndroid Build Coastguard Worker		test_singleton_module {
105*333d2b36SAndroid Build Coastguard Worker			name: "test_singleton_module",
106*333d2b36SAndroid Build Coastguard Worker		}
107*333d2b36SAndroid Build Coastguard Worker	`
108*333d2b36SAndroid Build Coastguard Worker
109*333d2b36SAndroid Build Coastguard Worker	GroupFixturePreparers(
110*333d2b36SAndroid Build Coastguard Worker		prepareForSingletonModuleTest,
111*333d2b36SAndroid Build Coastguard Worker		FixtureRegisterWithContext(func(ctx RegistrationContext) {
112*333d2b36SAndroid Build Coastguard Worker			ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) {
113*333d2b36SAndroid Build Coastguard Worker				ctx.Transition("test_singleton_module_mutator", &testTransitionMutator{
114*333d2b36SAndroid Build Coastguard Worker					split: func(ctx BaseModuleContext) []string {
115*333d2b36SAndroid Build Coastguard Worker						return []string{"a", "b"}
116*333d2b36SAndroid Build Coastguard Worker					},
117*333d2b36SAndroid Build Coastguard Worker				})
118*333d2b36SAndroid Build Coastguard Worker			})
119*333d2b36SAndroid Build Coastguard Worker		}),
120*333d2b36SAndroid Build Coastguard Worker	).
121*333d2b36SAndroid Build Coastguard Worker		ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern([]string{
122*333d2b36SAndroid Build Coastguard Worker			`\QGenerateAndroidBuildActions already called for variant\E`,
123*333d2b36SAndroid Build Coastguard Worker		})).
124*333d2b36SAndroid Build Coastguard Worker		RunTestWithBp(t, bp)
125*333d2b36SAndroid Build Coastguard Worker}
126