1*1fa6dee9SAndroid Build Coastguard Worker// Copyright 2019 Google Inc. All rights reserved. 2*1fa6dee9SAndroid Build Coastguard Worker// 3*1fa6dee9SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*1fa6dee9SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*1fa6dee9SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*1fa6dee9SAndroid Build Coastguard Worker// 7*1fa6dee9SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*1fa6dee9SAndroid Build Coastguard Worker// 9*1fa6dee9SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*1fa6dee9SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*1fa6dee9SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*1fa6dee9SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*1fa6dee9SAndroid Build Coastguard Worker// limitations under the License. 14*1fa6dee9SAndroid Build Coastguard Worker 15*1fa6dee9SAndroid Build Coastguard Workerpackage blueprint 16*1fa6dee9SAndroid Build Coastguard Worker 17*1fa6dee9SAndroid Build Coastguard Workerimport ( 18*1fa6dee9SAndroid Build Coastguard Worker "reflect" 19*1fa6dee9SAndroid Build Coastguard Worker "strings" 20*1fa6dee9SAndroid Build Coastguard Worker "testing" 21*1fa6dee9SAndroid Build Coastguard Worker) 22*1fa6dee9SAndroid Build Coastguard Worker 23*1fa6dee9SAndroid Build Coastguard Workertype moduleCtxTestModule struct { 24*1fa6dee9SAndroid Build Coastguard Worker SimpleName 25*1fa6dee9SAndroid Build Coastguard Worker} 26*1fa6dee9SAndroid Build Coastguard Worker 27*1fa6dee9SAndroid Build Coastguard Workerfunc newModuleCtxTestModule() (Module, []interface{}) { 28*1fa6dee9SAndroid Build Coastguard Worker m := &moduleCtxTestModule{} 29*1fa6dee9SAndroid Build Coastguard Worker return m, []interface{}{&m.SimpleName.Properties} 30*1fa6dee9SAndroid Build Coastguard Worker} 31*1fa6dee9SAndroid Build Coastguard Worker 32*1fa6dee9SAndroid Build Coastguard Workerfunc (f *moduleCtxTestModule) GenerateBuildActions(ModuleContext) { 33*1fa6dee9SAndroid Build Coastguard Worker} 34*1fa6dee9SAndroid Build Coastguard Worker 35*1fa6dee9SAndroid Build Coastguard Workerfunc addVariantDepsResultMutator(variants []Variation, tag DependencyTag, from, to string, results map[string][]Module) func(ctx BottomUpMutatorContext) { 36*1fa6dee9SAndroid Build Coastguard Worker return func(ctx BottomUpMutatorContext) { 37*1fa6dee9SAndroid Build Coastguard Worker if ctx.ModuleName() == from { 38*1fa6dee9SAndroid Build Coastguard Worker ret := ctx.AddVariationDependencies(variants, tag, to) 39*1fa6dee9SAndroid Build Coastguard Worker results[ctx.ModuleName()] = ret 40*1fa6dee9SAndroid Build Coastguard Worker } 41*1fa6dee9SAndroid Build Coastguard Worker } 42*1fa6dee9SAndroid Build Coastguard Worker} 43*1fa6dee9SAndroid Build Coastguard Worker 44*1fa6dee9SAndroid Build Coastguard Workerfunc expectedErrors(t *testing.T, errs []error, expectedMessages ...string) { 45*1fa6dee9SAndroid Build Coastguard Worker t.Helper() 46*1fa6dee9SAndroid Build Coastguard Worker if len(errs) != len(expectedMessages) { 47*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("expected %d error, found: %q", len(expectedMessages), errs) 48*1fa6dee9SAndroid Build Coastguard Worker } else { 49*1fa6dee9SAndroid Build Coastguard Worker for i, expected := range expectedMessages { 50*1fa6dee9SAndroid Build Coastguard Worker err := errs[i] 51*1fa6dee9SAndroid Build Coastguard Worker if err.Error() != expected { 52*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("expected error %q found %q", expected, err) 53*1fa6dee9SAndroid Build Coastguard Worker } 54*1fa6dee9SAndroid Build Coastguard Worker } 55*1fa6dee9SAndroid Build Coastguard Worker } 56*1fa6dee9SAndroid Build Coastguard Worker} 57*1fa6dee9SAndroid Build Coastguard Worker 58*1fa6dee9SAndroid Build Coastguard Workerfunc TestAddVariationDependencies(t *testing.T) { 59*1fa6dee9SAndroid Build Coastguard Worker runWithFailures := func(ctx *Context, expectedErr string) { 60*1fa6dee9SAndroid Build Coastguard Worker t.Helper() 61*1fa6dee9SAndroid Build Coastguard Worker bp := ` 62*1fa6dee9SAndroid Build Coastguard Worker test { 63*1fa6dee9SAndroid Build Coastguard Worker name: "foo", 64*1fa6dee9SAndroid Build Coastguard Worker } 65*1fa6dee9SAndroid Build Coastguard Worker 66*1fa6dee9SAndroid Build Coastguard Worker test { 67*1fa6dee9SAndroid Build Coastguard Worker name: "bar", 68*1fa6dee9SAndroid Build Coastguard Worker } 69*1fa6dee9SAndroid Build Coastguard Worker ` 70*1fa6dee9SAndroid Build Coastguard Worker 71*1fa6dee9SAndroid Build Coastguard Worker mockFS := map[string][]byte{ 72*1fa6dee9SAndroid Build Coastguard Worker "Android.bp": []byte(bp), 73*1fa6dee9SAndroid Build Coastguard Worker } 74*1fa6dee9SAndroid Build Coastguard Worker 75*1fa6dee9SAndroid Build Coastguard Worker ctx.MockFileSystem(mockFS) 76*1fa6dee9SAndroid Build Coastguard Worker 77*1fa6dee9SAndroid Build Coastguard Worker _, errs := ctx.ParseFileList(".", []string{"Android.bp"}, nil) 78*1fa6dee9SAndroid Build Coastguard Worker if len(errs) > 0 { 79*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("unexpected parse errors:") 80*1fa6dee9SAndroid Build Coastguard Worker for _, err := range errs { 81*1fa6dee9SAndroid Build Coastguard Worker t.Errorf(" %s", err) 82*1fa6dee9SAndroid Build Coastguard Worker } 83*1fa6dee9SAndroid Build Coastguard Worker } 84*1fa6dee9SAndroid Build Coastguard Worker 85*1fa6dee9SAndroid Build Coastguard Worker _, errs = ctx.ResolveDependencies(nil) 86*1fa6dee9SAndroid Build Coastguard Worker if len(errs) > 0 { 87*1fa6dee9SAndroid Build Coastguard Worker if expectedErr == "" { 88*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("unexpected dep errors:") 89*1fa6dee9SAndroid Build Coastguard Worker for _, err := range errs { 90*1fa6dee9SAndroid Build Coastguard Worker t.Errorf(" %s", err) 91*1fa6dee9SAndroid Build Coastguard Worker } 92*1fa6dee9SAndroid Build Coastguard Worker } else { 93*1fa6dee9SAndroid Build Coastguard Worker for _, err := range errs { 94*1fa6dee9SAndroid Build Coastguard Worker if strings.Contains(err.Error(), expectedErr) { 95*1fa6dee9SAndroid Build Coastguard Worker continue 96*1fa6dee9SAndroid Build Coastguard Worker } else { 97*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("unexpected dep error: %s", err) 98*1fa6dee9SAndroid Build Coastguard Worker } 99*1fa6dee9SAndroid Build Coastguard Worker } 100*1fa6dee9SAndroid Build Coastguard Worker } 101*1fa6dee9SAndroid Build Coastguard Worker } else if expectedErr != "" { 102*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("missing dep error: %s", expectedErr) 103*1fa6dee9SAndroid Build Coastguard Worker } 104*1fa6dee9SAndroid Build Coastguard Worker } 105*1fa6dee9SAndroid Build Coastguard Worker 106*1fa6dee9SAndroid Build Coastguard Worker run := func(ctx *Context) { 107*1fa6dee9SAndroid Build Coastguard Worker t.Helper() 108*1fa6dee9SAndroid Build Coastguard Worker runWithFailures(ctx, "") 109*1fa6dee9SAndroid Build Coastguard Worker } 110*1fa6dee9SAndroid Build Coastguard Worker 111*1fa6dee9SAndroid Build Coastguard Worker t.Run("parallel", func(t *testing.T) { 112*1fa6dee9SAndroid Build Coastguard Worker ctx := NewContext() 113*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", newModuleCtxTestModule) 114*1fa6dee9SAndroid Build Coastguard Worker results := make(map[string][]Module) 115*1fa6dee9SAndroid Build Coastguard Worker depsMutator := addVariantDepsResultMutator(nil, nil, "foo", "bar", results) 116*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterBottomUpMutator("deps", depsMutator) 117*1fa6dee9SAndroid Build Coastguard Worker 118*1fa6dee9SAndroid Build Coastguard Worker run(ctx) 119*1fa6dee9SAndroid Build Coastguard Worker 120*1fa6dee9SAndroid Build Coastguard Worker foo := ctx.moduleGroupFromName("foo", nil).moduleByVariantName("") 121*1fa6dee9SAndroid Build Coastguard Worker bar := ctx.moduleGroupFromName("bar", nil).moduleByVariantName("") 122*1fa6dee9SAndroid Build Coastguard Worker 123*1fa6dee9SAndroid Build Coastguard Worker if g, w := foo.forwardDeps, []*moduleInfo{bar}; !reflect.DeepEqual(g, w) { 124*1fa6dee9SAndroid Build Coastguard Worker t.Fatalf("expected foo deps to be %q, got %q", w, g) 125*1fa6dee9SAndroid Build Coastguard Worker } 126*1fa6dee9SAndroid Build Coastguard Worker 127*1fa6dee9SAndroid Build Coastguard Worker if g, w := results["foo"], []Module{bar.logicModule}; !reflect.DeepEqual(g, w) { 128*1fa6dee9SAndroid Build Coastguard Worker t.Fatalf("expected AddVariationDependencies return value to be %q, got %q", w, g) 129*1fa6dee9SAndroid Build Coastguard Worker } 130*1fa6dee9SAndroid Build Coastguard Worker }) 131*1fa6dee9SAndroid Build Coastguard Worker 132*1fa6dee9SAndroid Build Coastguard Worker t.Run("missing", func(t *testing.T) { 133*1fa6dee9SAndroid Build Coastguard Worker ctx := NewContext() 134*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", newModuleCtxTestModule) 135*1fa6dee9SAndroid Build Coastguard Worker results := make(map[string][]Module) 136*1fa6dee9SAndroid Build Coastguard Worker depsMutator := addVariantDepsResultMutator(nil, nil, "foo", "baz", results) 137*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterBottomUpMutator("deps", depsMutator) 138*1fa6dee9SAndroid Build Coastguard Worker runWithFailures(ctx, `"foo" depends on undefined module "baz"`) 139*1fa6dee9SAndroid Build Coastguard Worker 140*1fa6dee9SAndroid Build Coastguard Worker foo := ctx.moduleGroupFromName("foo", nil).moduleByVariantName("") 141*1fa6dee9SAndroid Build Coastguard Worker 142*1fa6dee9SAndroid Build Coastguard Worker if g, w := foo.forwardDeps, []*moduleInfo(nil); !reflect.DeepEqual(g, w) { 143*1fa6dee9SAndroid Build Coastguard Worker t.Fatalf("expected foo deps to be %q, got %q", w, g) 144*1fa6dee9SAndroid Build Coastguard Worker } 145*1fa6dee9SAndroid Build Coastguard Worker 146*1fa6dee9SAndroid Build Coastguard Worker if g, w := results["foo"], []Module{nil}; !reflect.DeepEqual(g, w) { 147*1fa6dee9SAndroid Build Coastguard Worker t.Fatalf("expected AddVariationDependencies return value to be %q, got %q", w, g) 148*1fa6dee9SAndroid Build Coastguard Worker } 149*1fa6dee9SAndroid Build Coastguard Worker }) 150*1fa6dee9SAndroid Build Coastguard Worker 151*1fa6dee9SAndroid Build Coastguard Worker t.Run("allow missing", func(t *testing.T) { 152*1fa6dee9SAndroid Build Coastguard Worker ctx := NewContext() 153*1fa6dee9SAndroid Build Coastguard Worker ctx.SetAllowMissingDependencies(true) 154*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", newModuleCtxTestModule) 155*1fa6dee9SAndroid Build Coastguard Worker results := make(map[string][]Module) 156*1fa6dee9SAndroid Build Coastguard Worker depsMutator := addVariantDepsResultMutator(nil, nil, "foo", "baz", results) 157*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterBottomUpMutator("deps", depsMutator) 158*1fa6dee9SAndroid Build Coastguard Worker run(ctx) 159*1fa6dee9SAndroid Build Coastguard Worker 160*1fa6dee9SAndroid Build Coastguard Worker foo := ctx.moduleGroupFromName("foo", nil).moduleByVariantName("") 161*1fa6dee9SAndroid Build Coastguard Worker 162*1fa6dee9SAndroid Build Coastguard Worker if g, w := foo.forwardDeps, []*moduleInfo(nil); !reflect.DeepEqual(g, w) { 163*1fa6dee9SAndroid Build Coastguard Worker t.Fatalf("expected foo deps to be %q, got %q", w, g) 164*1fa6dee9SAndroid Build Coastguard Worker } 165*1fa6dee9SAndroid Build Coastguard Worker 166*1fa6dee9SAndroid Build Coastguard Worker if g, w := results["foo"], []Module{nil}; !reflect.DeepEqual(g, w) { 167*1fa6dee9SAndroid Build Coastguard Worker t.Fatalf("expected AddVariationDependencies return value to be %q, got %q", w, g) 168*1fa6dee9SAndroid Build Coastguard Worker } 169*1fa6dee9SAndroid Build Coastguard Worker }) 170*1fa6dee9SAndroid Build Coastguard Worker 171*1fa6dee9SAndroid Build Coastguard Worker} 172*1fa6dee9SAndroid Build Coastguard Worker 173*1fa6dee9SAndroid Build Coastguard Workerfunc TestCheckBlueprintSyntax(t *testing.T) { 174*1fa6dee9SAndroid Build Coastguard Worker factories := map[string]ModuleFactory{ 175*1fa6dee9SAndroid Build Coastguard Worker "test": newModuleCtxTestModule, 176*1fa6dee9SAndroid Build Coastguard Worker } 177*1fa6dee9SAndroid Build Coastguard Worker 178*1fa6dee9SAndroid Build Coastguard Worker t.Run("valid", func(t *testing.T) { 179*1fa6dee9SAndroid Build Coastguard Worker errs := CheckBlueprintSyntax(factories, "path/Blueprint", ` 180*1fa6dee9SAndroid Build Coastguard Workertest { 181*1fa6dee9SAndroid Build Coastguard Worker name: "test", 182*1fa6dee9SAndroid Build Coastguard Worker} 183*1fa6dee9SAndroid Build Coastguard Worker`) 184*1fa6dee9SAndroid Build Coastguard Worker expectedErrors(t, errs) 185*1fa6dee9SAndroid Build Coastguard Worker }) 186*1fa6dee9SAndroid Build Coastguard Worker 187*1fa6dee9SAndroid Build Coastguard Worker t.Run("syntax error", func(t *testing.T) { 188*1fa6dee9SAndroid Build Coastguard Worker errs := CheckBlueprintSyntax(factories, "path/Blueprint", ` 189*1fa6dee9SAndroid Build Coastguard Workertest { 190*1fa6dee9SAndroid Build Coastguard Worker name: "test", 191*1fa6dee9SAndroid Build Coastguard Worker 192*1fa6dee9SAndroid Build Coastguard Worker`) 193*1fa6dee9SAndroid Build Coastguard Worker 194*1fa6dee9SAndroid Build Coastguard Worker expectedErrors(t, errs, `path/Blueprint:5:1: expected "}", found EOF`) 195*1fa6dee9SAndroid Build Coastguard Worker }) 196*1fa6dee9SAndroid Build Coastguard Worker 197*1fa6dee9SAndroid Build Coastguard Worker t.Run("unknown module type", func(t *testing.T) { 198*1fa6dee9SAndroid Build Coastguard Worker errs := CheckBlueprintSyntax(factories, "path/Blueprint", ` 199*1fa6dee9SAndroid Build Coastguard Workertest2 { 200*1fa6dee9SAndroid Build Coastguard Worker name: "test", 201*1fa6dee9SAndroid Build Coastguard Worker} 202*1fa6dee9SAndroid Build Coastguard Worker`) 203*1fa6dee9SAndroid Build Coastguard Worker 204*1fa6dee9SAndroid Build Coastguard Worker expectedErrors(t, errs, `path/Blueprint:2:1: unrecognized module type "test2"`) 205*1fa6dee9SAndroid Build Coastguard Worker }) 206*1fa6dee9SAndroid Build Coastguard Worker 207*1fa6dee9SAndroid Build Coastguard Worker t.Run("unknown property name", func(t *testing.T) { 208*1fa6dee9SAndroid Build Coastguard Worker errs := CheckBlueprintSyntax(factories, "path/Blueprint", ` 209*1fa6dee9SAndroid Build Coastguard Workertest { 210*1fa6dee9SAndroid Build Coastguard Worker nam: "test", 211*1fa6dee9SAndroid Build Coastguard Worker} 212*1fa6dee9SAndroid Build Coastguard Worker`) 213*1fa6dee9SAndroid Build Coastguard Worker 214*1fa6dee9SAndroid Build Coastguard Worker expectedErrors(t, errs, `path/Blueprint:3:5: unrecognized property "nam"`) 215*1fa6dee9SAndroid Build Coastguard Worker }) 216*1fa6dee9SAndroid Build Coastguard Worker 217*1fa6dee9SAndroid Build Coastguard Worker t.Run("invalid property type", func(t *testing.T) { 218*1fa6dee9SAndroid Build Coastguard Worker errs := CheckBlueprintSyntax(factories, "path/Blueprint", ` 219*1fa6dee9SAndroid Build Coastguard Workertest { 220*1fa6dee9SAndroid Build Coastguard Worker name: false, 221*1fa6dee9SAndroid Build Coastguard Worker} 222*1fa6dee9SAndroid Build Coastguard Worker`) 223*1fa6dee9SAndroid Build Coastguard Worker 224*1fa6dee9SAndroid Build Coastguard Worker expectedErrors(t, errs, `path/Blueprint:3:8: can't assign bool value to string property "name"`) 225*1fa6dee9SAndroid Build Coastguard Worker }) 226*1fa6dee9SAndroid Build Coastguard Worker 227*1fa6dee9SAndroid Build Coastguard Worker t.Run("multiple failures", func(t *testing.T) { 228*1fa6dee9SAndroid Build Coastguard Worker errs := CheckBlueprintSyntax(factories, "path/Blueprint", ` 229*1fa6dee9SAndroid Build Coastguard Workertest { 230*1fa6dee9SAndroid Build Coastguard Worker name: false, 231*1fa6dee9SAndroid Build Coastguard Worker} 232*1fa6dee9SAndroid Build Coastguard Worker 233*1fa6dee9SAndroid Build Coastguard Workertest2 { 234*1fa6dee9SAndroid Build Coastguard Worker name: false, 235*1fa6dee9SAndroid Build Coastguard Worker} 236*1fa6dee9SAndroid Build Coastguard Worker`) 237*1fa6dee9SAndroid Build Coastguard Worker 238*1fa6dee9SAndroid Build Coastguard Worker expectedErrors(t, errs, 239*1fa6dee9SAndroid Build Coastguard Worker `path/Blueprint:3:8: can't assign bool value to string property "name"`, 240*1fa6dee9SAndroid Build Coastguard Worker `path/Blueprint:6:1: unrecognized module type "test2"`, 241*1fa6dee9SAndroid Build Coastguard Worker ) 242*1fa6dee9SAndroid Build Coastguard Worker }) 243*1fa6dee9SAndroid Build Coastguard Worker} 244*1fa6dee9SAndroid Build Coastguard Worker 245*1fa6dee9SAndroid Build Coastguard Workertype addNinjaDepsTestModule struct { 246*1fa6dee9SAndroid Build Coastguard Worker SimpleName 247*1fa6dee9SAndroid Build Coastguard Worker} 248*1fa6dee9SAndroid Build Coastguard Worker 249*1fa6dee9SAndroid Build Coastguard Workerfunc addNinjaDepsTestModuleFactory() (Module, []interface{}) { 250*1fa6dee9SAndroid Build Coastguard Worker module := &addNinjaDepsTestModule{} 251*1fa6dee9SAndroid Build Coastguard Worker AddLoadHook(module, func(ctx LoadHookContext) { 252*1fa6dee9SAndroid Build Coastguard Worker ctx.AddNinjaFileDeps("LoadHookContext") 253*1fa6dee9SAndroid Build Coastguard Worker }) 254*1fa6dee9SAndroid Build Coastguard Worker return module, []interface{}{&module.SimpleName.Properties} 255*1fa6dee9SAndroid Build Coastguard Worker} 256*1fa6dee9SAndroid Build Coastguard Worker 257*1fa6dee9SAndroid Build Coastguard Workerfunc (m *addNinjaDepsTestModule) GenerateBuildActions(ctx ModuleContext) { 258*1fa6dee9SAndroid Build Coastguard Worker ctx.AddNinjaFileDeps("GenerateBuildActions") 259*1fa6dee9SAndroid Build Coastguard Worker} 260*1fa6dee9SAndroid Build Coastguard Worker 261*1fa6dee9SAndroid Build Coastguard Workerfunc addNinjaDepsTestBottomUpMutator(ctx BottomUpMutatorContext) { 262*1fa6dee9SAndroid Build Coastguard Worker ctx.AddNinjaFileDeps("BottomUpMutator") 263*1fa6dee9SAndroid Build Coastguard Worker} 264*1fa6dee9SAndroid Build Coastguard Worker 265*1fa6dee9SAndroid Build Coastguard Workerfunc addNinjaDepsTestTopDownMutator(ctx TopDownMutatorContext) { 266*1fa6dee9SAndroid Build Coastguard Worker ctx.AddNinjaFileDeps("TopDownMutator") 267*1fa6dee9SAndroid Build Coastguard Worker} 268*1fa6dee9SAndroid Build Coastguard Worker 269*1fa6dee9SAndroid Build Coastguard Workertype addNinjaDepsTestSingleton struct{} 270*1fa6dee9SAndroid Build Coastguard Worker 271*1fa6dee9SAndroid Build Coastguard Workerfunc addNinjaDepsTestSingletonFactory() Singleton { 272*1fa6dee9SAndroid Build Coastguard Worker return &addNinjaDepsTestSingleton{} 273*1fa6dee9SAndroid Build Coastguard Worker} 274*1fa6dee9SAndroid Build Coastguard Worker 275*1fa6dee9SAndroid Build Coastguard Workerfunc (s *addNinjaDepsTestSingleton) GenerateBuildActions(ctx SingletonContext) { 276*1fa6dee9SAndroid Build Coastguard Worker ctx.AddNinjaFileDeps("Singleton") 277*1fa6dee9SAndroid Build Coastguard Worker} 278*1fa6dee9SAndroid Build Coastguard Worker 279*1fa6dee9SAndroid Build Coastguard Workerfunc TestAddNinjaFileDeps(t *testing.T) { 280*1fa6dee9SAndroid Build Coastguard Worker ctx := NewContext() 281*1fa6dee9SAndroid Build Coastguard Worker ctx.MockFileSystem(map[string][]byte{ 282*1fa6dee9SAndroid Build Coastguard Worker "Android.bp": []byte(` 283*1fa6dee9SAndroid Build Coastguard Worker test { 284*1fa6dee9SAndroid Build Coastguard Worker name: "test", 285*1fa6dee9SAndroid Build Coastguard Worker } 286*1fa6dee9SAndroid Build Coastguard Worker `), 287*1fa6dee9SAndroid Build Coastguard Worker }) 288*1fa6dee9SAndroid Build Coastguard Worker 289*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterModuleType("test", addNinjaDepsTestModuleFactory) 290*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterBottomUpMutator("testBottomUpMutator", addNinjaDepsTestBottomUpMutator) 291*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterTopDownMutator("testTopDownMutator", addNinjaDepsTestTopDownMutator) 292*1fa6dee9SAndroid Build Coastguard Worker ctx.RegisterSingletonType("testSingleton", addNinjaDepsTestSingletonFactory, false) 293*1fa6dee9SAndroid Build Coastguard Worker parseDeps, errs := ctx.ParseBlueprintsFiles("Android.bp", nil) 294*1fa6dee9SAndroid Build Coastguard Worker if len(errs) > 0 { 295*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("unexpected parse errors:") 296*1fa6dee9SAndroid Build Coastguard Worker for _, err := range errs { 297*1fa6dee9SAndroid Build Coastguard Worker t.Errorf(" %s", err) 298*1fa6dee9SAndroid Build Coastguard Worker } 299*1fa6dee9SAndroid Build Coastguard Worker t.FailNow() 300*1fa6dee9SAndroid Build Coastguard Worker } 301*1fa6dee9SAndroid Build Coastguard Worker 302*1fa6dee9SAndroid Build Coastguard Worker resolveDeps, errs := ctx.ResolveDependencies(nil) 303*1fa6dee9SAndroid Build Coastguard Worker if len(errs) > 0 { 304*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("unexpected dep errors:") 305*1fa6dee9SAndroid Build Coastguard Worker for _, err := range errs { 306*1fa6dee9SAndroid Build Coastguard Worker t.Errorf(" %s", err) 307*1fa6dee9SAndroid Build Coastguard Worker } 308*1fa6dee9SAndroid Build Coastguard Worker t.FailNow() 309*1fa6dee9SAndroid Build Coastguard Worker } 310*1fa6dee9SAndroid Build Coastguard Worker 311*1fa6dee9SAndroid Build Coastguard Worker prepareDeps, errs := ctx.PrepareBuildActions(nil) 312*1fa6dee9SAndroid Build Coastguard Worker if len(errs) > 0 { 313*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("unexpected prepare errors:") 314*1fa6dee9SAndroid Build Coastguard Worker for _, err := range errs { 315*1fa6dee9SAndroid Build Coastguard Worker t.Errorf(" %s", err) 316*1fa6dee9SAndroid Build Coastguard Worker } 317*1fa6dee9SAndroid Build Coastguard Worker t.FailNow() 318*1fa6dee9SAndroid Build Coastguard Worker } 319*1fa6dee9SAndroid Build Coastguard Worker 320*1fa6dee9SAndroid Build Coastguard Worker if g, w := parseDeps, []string{"Android.bp", "LoadHookContext"}; !reflect.DeepEqual(g, w) { 321*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("ParseBlueprintsFiles: wanted deps %q, got %q", w, g) 322*1fa6dee9SAndroid Build Coastguard Worker } 323*1fa6dee9SAndroid Build Coastguard Worker 324*1fa6dee9SAndroid Build Coastguard Worker if g, w := resolveDeps, []string{"BottomUpMutator", "TopDownMutator"}; !reflect.DeepEqual(g, w) { 325*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("ResolveDependencies: wanted deps %q, got %q", w, g) 326*1fa6dee9SAndroid Build Coastguard Worker } 327*1fa6dee9SAndroid Build Coastguard Worker 328*1fa6dee9SAndroid Build Coastguard Worker if g, w := prepareDeps, []string{"GenerateBuildActions", "Singleton"}; !reflect.DeepEqual(g, w) { 329*1fa6dee9SAndroid Build Coastguard Worker t.Errorf("PrepareBuildActions: wanted deps %q, got %q", w, g) 330*1fa6dee9SAndroid Build Coastguard Worker } 331*1fa6dee9SAndroid Build Coastguard Worker 332*1fa6dee9SAndroid Build Coastguard Worker} 333