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