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