1*333d2b36SAndroid Build Coastguard Worker// Copyright 2019 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 "github.com/google/blueprint" 21*333d2b36SAndroid Build Coastguard Worker) 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Workertype defaultsTestProperties struct { 24*333d2b36SAndroid Build Coastguard Worker Foo []string 25*333d2b36SAndroid Build Coastguard Worker Path_prop []string `android:"path"` 26*333d2b36SAndroid Build Coastguard Worker} 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workertype defaultsTestModule struct { 29*333d2b36SAndroid Build Coastguard Worker ModuleBase 30*333d2b36SAndroid Build Coastguard Worker DefaultableModuleBase 31*333d2b36SAndroid Build Coastguard Worker properties defaultsTestProperties 32*333d2b36SAndroid Build Coastguard Worker} 33*333d2b36SAndroid Build Coastguard Worker 34*333d2b36SAndroid Build Coastguard Workerfunc (d *defaultsTestModule) GenerateAndroidBuildActions(ctx ModuleContext) { 35*333d2b36SAndroid Build Coastguard Worker ctx.Build(pctx, BuildParams{ 36*333d2b36SAndroid Build Coastguard Worker Rule: Touch, 37*333d2b36SAndroid Build Coastguard Worker Output: PathForModuleOut(ctx, "out"), 38*333d2b36SAndroid Build Coastguard Worker }) 39*333d2b36SAndroid Build Coastguard Worker} 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Workerfunc defaultsTestModuleFactory() Module { 42*333d2b36SAndroid Build Coastguard Worker module := &defaultsTestModule{} 43*333d2b36SAndroid Build Coastguard Worker module.AddProperties(&module.properties) 44*333d2b36SAndroid Build Coastguard Worker InitAndroidModule(module) 45*333d2b36SAndroid Build Coastguard Worker InitDefaultableModule(module) 46*333d2b36SAndroid Build Coastguard Worker return module 47*333d2b36SAndroid Build Coastguard Worker} 48*333d2b36SAndroid Build Coastguard Worker 49*333d2b36SAndroid Build Coastguard Workertype defaultsTestDefaults struct { 50*333d2b36SAndroid Build Coastguard Worker ModuleBase 51*333d2b36SAndroid Build Coastguard Worker DefaultsModuleBase 52*333d2b36SAndroid Build Coastguard Worker} 53*333d2b36SAndroid Build Coastguard Worker 54*333d2b36SAndroid Build Coastguard Workerfunc defaultsTestDefaultsFactory() Module { 55*333d2b36SAndroid Build Coastguard Worker defaults := &defaultsTestDefaults{} 56*333d2b36SAndroid Build Coastguard Worker defaults.AddProperties(&defaultsTestProperties{}) 57*333d2b36SAndroid Build Coastguard Worker InitDefaultsModule(defaults) 58*333d2b36SAndroid Build Coastguard Worker return defaults 59*333d2b36SAndroid Build Coastguard Worker} 60*333d2b36SAndroid Build Coastguard Worker 61*333d2b36SAndroid Build Coastguard Workervar prepareForDefaultsTest = GroupFixturePreparers( 62*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithDefaults, 63*333d2b36SAndroid Build Coastguard Worker FixtureRegisterWithContext(func(ctx RegistrationContext) { 64*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", defaultsTestModuleFactory) 65*333d2b36SAndroid Build Coastguard Worker ctx.RegisterModuleType("defaults", defaultsTestDefaultsFactory) 66*333d2b36SAndroid Build Coastguard Worker }), 67*333d2b36SAndroid Build Coastguard Worker) 68*333d2b36SAndroid Build Coastguard Worker 69*333d2b36SAndroid Build Coastguard Workerfunc TestDefaults(t *testing.T) { 70*333d2b36SAndroid Build Coastguard Worker bp := ` 71*333d2b36SAndroid Build Coastguard Worker defaults { 72*333d2b36SAndroid Build Coastguard Worker name: "transitive", 73*333d2b36SAndroid Build Coastguard Worker foo: ["transitive"], 74*333d2b36SAndroid Build Coastguard Worker } 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker defaults { 77*333d2b36SAndroid Build Coastguard Worker name: "defaults", 78*333d2b36SAndroid Build Coastguard Worker defaults: ["transitive"], 79*333d2b36SAndroid Build Coastguard Worker foo: ["defaults"], 80*333d2b36SAndroid Build Coastguard Worker } 81*333d2b36SAndroid Build Coastguard Worker 82*333d2b36SAndroid Build Coastguard Worker test { 83*333d2b36SAndroid Build Coastguard Worker name: "foo", 84*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 85*333d2b36SAndroid Build Coastguard Worker foo: ["module"], 86*333d2b36SAndroid Build Coastguard Worker } 87*333d2b36SAndroid Build Coastguard Worker ` 88*333d2b36SAndroid Build Coastguard Worker 89*333d2b36SAndroid Build Coastguard Worker result := GroupFixturePreparers( 90*333d2b36SAndroid Build Coastguard Worker prepareForDefaultsTest, 91*333d2b36SAndroid Build Coastguard Worker FixtureWithRootAndroidBp(bp), 92*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 93*333d2b36SAndroid Build Coastguard Worker 94*333d2b36SAndroid Build Coastguard Worker foo := result.Module("foo", "").(*defaultsTestModule) 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker AssertDeepEquals(t, "foo", []string{"transitive", "defaults", "module"}, foo.properties.Foo) 97*333d2b36SAndroid Build Coastguard Worker} 98*333d2b36SAndroid Build Coastguard Worker 99*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultsAllowMissingDependencies(t *testing.T) { 100*333d2b36SAndroid Build Coastguard Worker bp := ` 101*333d2b36SAndroid Build Coastguard Worker defaults { 102*333d2b36SAndroid Build Coastguard Worker name: "defaults", 103*333d2b36SAndroid Build Coastguard Worker defaults: ["missing"], 104*333d2b36SAndroid Build Coastguard Worker foo: ["defaults"], 105*333d2b36SAndroid Build Coastguard Worker } 106*333d2b36SAndroid Build Coastguard Worker 107*333d2b36SAndroid Build Coastguard Worker test { 108*333d2b36SAndroid Build Coastguard Worker name: "missing_defaults", 109*333d2b36SAndroid Build Coastguard Worker defaults: ["missing"], 110*333d2b36SAndroid Build Coastguard Worker foo: ["module"], 111*333d2b36SAndroid Build Coastguard Worker } 112*333d2b36SAndroid Build Coastguard Worker 113*333d2b36SAndroid Build Coastguard Worker test { 114*333d2b36SAndroid Build Coastguard Worker name: "missing_transitive_defaults", 115*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 116*333d2b36SAndroid Build Coastguard Worker foo: ["module"], 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker ` 119*333d2b36SAndroid Build Coastguard Worker 120*333d2b36SAndroid Build Coastguard Worker result := GroupFixturePreparers( 121*333d2b36SAndroid Build Coastguard Worker prepareForDefaultsTest, 122*333d2b36SAndroid Build Coastguard Worker PrepareForTestWithAllowMissingDependencies, 123*333d2b36SAndroid Build Coastguard Worker FixtureWithRootAndroidBp(bp), 124*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 125*333d2b36SAndroid Build Coastguard Worker 126*333d2b36SAndroid Build Coastguard Worker missingDefaults := result.ModuleForTests("missing_defaults", "").Output("out") 127*333d2b36SAndroid Build Coastguard Worker missingTransitiveDefaults := result.ModuleForTests("missing_transitive_defaults", "").Output("out") 128*333d2b36SAndroid Build Coastguard Worker 129*333d2b36SAndroid Build Coastguard Worker AssertSame(t, "missing_defaults rule", ErrorRule, missingDefaults.Rule) 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Worker AssertStringEquals(t, "missing_defaults", "module missing_defaults missing dependencies: missing\n", missingDefaults.Args["error"]) 132*333d2b36SAndroid Build Coastguard Worker 133*333d2b36SAndroid Build Coastguard Worker // TODO: missing transitive defaults is currently not handled 134*333d2b36SAndroid Build Coastguard Worker _ = missingTransitiveDefaults 135*333d2b36SAndroid Build Coastguard Worker} 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Workerfunc TestDefaultsPathProperties(t *testing.T) { 138*333d2b36SAndroid Build Coastguard Worker bp := ` 139*333d2b36SAndroid Build Coastguard Worker defaults { 140*333d2b36SAndroid Build Coastguard Worker name: "defaults", 141*333d2b36SAndroid Build Coastguard Worker path_prop: [":gen"], 142*333d2b36SAndroid Build Coastguard Worker } 143*333d2b36SAndroid Build Coastguard Worker 144*333d2b36SAndroid Build Coastguard Worker test { 145*333d2b36SAndroid Build Coastguard Worker name: "foo", 146*333d2b36SAndroid Build Coastguard Worker defaults: ["defaults"], 147*333d2b36SAndroid Build Coastguard Worker } 148*333d2b36SAndroid Build Coastguard Worker 149*333d2b36SAndroid Build Coastguard Worker test { 150*333d2b36SAndroid Build Coastguard Worker name: "gen", 151*333d2b36SAndroid Build Coastguard Worker } 152*333d2b36SAndroid Build Coastguard Worker ` 153*333d2b36SAndroid Build Coastguard Worker 154*333d2b36SAndroid Build Coastguard Worker result := GroupFixturePreparers( 155*333d2b36SAndroid Build Coastguard Worker prepareForDefaultsTest, 156*333d2b36SAndroid Build Coastguard Worker FixtureWithRootAndroidBp(bp), 157*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 158*333d2b36SAndroid Build Coastguard Worker 159*333d2b36SAndroid Build Coastguard Worker collectDeps := func(m Module) []string { 160*333d2b36SAndroid Build Coastguard Worker var deps []string 161*333d2b36SAndroid Build Coastguard Worker result.VisitDirectDeps(m, func(dep blueprint.Module) { 162*333d2b36SAndroid Build Coastguard Worker deps = append(deps, result.ModuleName(dep)) 163*333d2b36SAndroid Build Coastguard Worker }) 164*333d2b36SAndroid Build Coastguard Worker return deps 165*333d2b36SAndroid Build Coastguard Worker } 166*333d2b36SAndroid Build Coastguard Worker 167*333d2b36SAndroid Build Coastguard Worker foo := result.Module("foo", "") 168*333d2b36SAndroid Build Coastguard Worker defaults := result.Module("defaults", "") 169*333d2b36SAndroid Build Coastguard Worker 170*333d2b36SAndroid Build Coastguard Worker AssertStringListContains(t, "foo should depend on gen", collectDeps(foo), "gen") 171*333d2b36SAndroid Build Coastguard Worker AssertStringListDoesNotContain(t, "defaults should not depend on gen", collectDeps(defaults), "gen") 172*333d2b36SAndroid Build Coastguard Worker} 173