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 }), 50 PrepareForTestWithMakevars, 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 TestVariantSingletonModule(t *testing.T) { 100 if testing.Short() { 101 t.Skip("test fails with data race enabled") 102 } 103 bp := ` 104 test_singleton_module { 105 name: "test_singleton_module", 106 } 107 ` 108 109 GroupFixturePreparers( 110 prepareForSingletonModuleTest, 111 FixtureRegisterWithContext(func(ctx RegistrationContext) { 112 ctx.PreDepsMutators(func(ctx RegisterMutatorsContext) { 113 ctx.Transition("test_singleton_module_mutator", &testTransitionMutator{ 114 split: func(ctx BaseModuleContext) []string { 115 return []string{"a", "b"} 116 }, 117 }) 118 }) 119 }), 120 ). 121 ExtendWithErrorHandler(FixtureExpectsAllErrorsToMatchAPattern([]string{ 122 `\QGenerateAndroidBuildActions already called for variant\E`, 123 })). 124 RunTestWithBp(t, bp) 125} 126