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