blob: 92d64817ea8f2b9b3f91d4cb929e68417ef339f8 [file] [log] [blame]
Colin Crossce75d2c2016-10-06 16:12:58 -07001// Copyright 2016 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 "github.com/google/blueprint"
21)
22
23var prebuiltsTests = []struct {
24 name string
25 modules string
26 prebuilt bool
27}{
28 {
29 name: "no prebuilt",
30 modules: `
31 source {
32 name: "bar",
33 }`,
34 prebuilt: false,
35 },
36 {
37 name: "no source prebuilt not preferred",
38 modules: `
39 prebuilt {
40 name: "bar",
41 prefer: false,
42 srcs: ["prebuilt"],
43 }`,
44 prebuilt: true,
45 },
46 {
47 name: "no source prebuilt preferred",
48 modules: `
49 prebuilt {
50 name: "bar",
51 prefer: true,
52 srcs: ["prebuilt"],
53 }`,
54 prebuilt: true,
55 },
56 {
57 name: "prebuilt not preferred",
58 modules: `
59 source {
60 name: "bar",
61 }
62
63 prebuilt {
64 name: "bar",
65 prefer: false,
66 srcs: ["prebuilt"],
67 }`,
68 prebuilt: false,
69 },
70 {
71 name: "prebuilt preferred",
72 modules: `
73 source {
74 name: "bar",
75 }
76
77 prebuilt {
78 name: "bar",
79 prefer: true,
80 srcs: ["prebuilt"],
81 }`,
82 prebuilt: true,
83 },
84}
85
86func TestPrebuilts(t *testing.T) {
87 for _, test := range prebuiltsTests {
88 t.Run(test.name, func(t *testing.T) {
89 ctx := NewContext()
90 ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
91 ctx.RegisterModuleType("source", newSourceModule)
92 ctx.MockFileSystem(map[string][]byte{
93 "Blueprints": []byte(`
94 source {
95 name: "foo",
96 deps: ["bar"],
97 }
98 ` + test.modules),
99 })
100
101 config := TestConfig()
102
103 _, errs := ctx.ParseBlueprintsFiles("Blueprints")
104 fail(t, errs)
105 _, errs = ctx.PrepareBuildActions(config)
106 fail(t, errs)
107
108 foo := findModule(ctx, "foo")
109 if foo == nil {
110 t.Fatalf("failed to find module foo")
111 }
112
113 if test.prebuilt {
114 if !foo.(*sourceModule).dependsOnPrebuiltModule {
115 t.Errorf("doesn't depend on prebuilt module")
116 }
117
118 if foo.(*sourceModule).dependsOnSourceModule {
119 t.Errorf("depends on source module")
120 }
121 } else {
122 if foo.(*sourceModule).dependsOnPrebuiltModule {
123 t.Errorf("depends on prebuilt module")
124 }
125
126 if !foo.(*sourceModule).dependsOnSourceModule {
127 t.Errorf("doens't depend on source module")
128 }
129 }
130 })
131 }
132
133}
134
135type prebuiltModule struct {
136 ModuleBase
137 prebuilt Prebuilt
138}
139
140func newPrebuiltModule() (blueprint.Module, []interface{}) {
141 m := &prebuiltModule{}
142 return InitAndroidModule(m, &m.prebuilt.Properties)
143}
144
145func (p *prebuiltModule) Name() string {
146 return p.prebuilt.Name(p.ModuleBase.Name())
147}
148
149func (p *prebuiltModule) DepsMutator(ctx BottomUpMutatorContext) {
150}
151
152func (p *prebuiltModule) GenerateAndroidBuildActions(ModuleContext) {
153}
154
155func (p *prebuiltModule) Prebuilt() *Prebuilt {
156 return &p.prebuilt
157}
158
159type sourceModule struct {
160 ModuleBase
161 properties struct {
162 Deps []string
163 }
164 dependsOnSourceModule, dependsOnPrebuiltModule bool
165}
166
167func newSourceModule() (blueprint.Module, []interface{}) {
168 m := &sourceModule{}
169 return InitAndroidModule(m, &m.properties)
170}
171
172func (s *sourceModule) DepsMutator(ctx BottomUpMutatorContext) {
173 for _, d := range s.properties.Deps {
174 ctx.AddDependency(ctx.Module(), nil, d)
175 }
176}
177
178func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
179 ctx.VisitDirectDeps(func(m blueprint.Module) {
180 if _, ok := m.(*sourceModule); ok {
181 s.dependsOnSourceModule = true
182 }
183 if _, ok := m.(*prebuiltModule); ok {
184 s.dependsOnPrebuiltModule = true
185 }
186 })
187}
188
189func findModule(ctx *blueprint.Context, name string) blueprint.Module {
190 var ret blueprint.Module
191 ctx.VisitAllModules(func(m blueprint.Module) {
192 if ctx.ModuleName(m) == name {
193 ret = m
194 }
195 })
196 return ret
197}
198
199func fail(t *testing.T, errs []error) {
200 if len(errs) > 0 {
201 for _, err := range errs {
202 t.Error(err)
203 }
204 t.FailNow()
205 }
206}