xref: /aosp_15_r20/build/blueprint/module_ctx_test.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
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