blob: e1826414d4299eb9c097d7b47ea0cdec55ac08dd [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 (
Colin Cross0d614dd2016-10-14 15:38:43 -070018 "io/ioutil"
19 "os"
Colin Crossce75d2c2016-10-06 16:12:58 -070020 "testing"
21
22 "github.com/google/blueprint"
23)
24
25var prebuiltsTests = []struct {
26 name string
27 modules string
28 prebuilt bool
29}{
30 {
31 name: "no prebuilt",
32 modules: `
33 source {
34 name: "bar",
35 }`,
36 prebuilt: false,
37 },
38 {
39 name: "no source prebuilt not preferred",
40 modules: `
41 prebuilt {
42 name: "bar",
43 prefer: false,
Jiyong Parkd4671112019-04-19 17:23:04 +090044 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070045 }`,
46 prebuilt: true,
47 },
48 {
49 name: "no source prebuilt preferred",
50 modules: `
51 prebuilt {
52 name: "bar",
53 prefer: true,
Jiyong Parkd4671112019-04-19 17:23:04 +090054 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070055 }`,
56 prebuilt: true,
57 },
58 {
59 name: "prebuilt not preferred",
60 modules: `
61 source {
62 name: "bar",
63 }
64
65 prebuilt {
66 name: "bar",
67 prefer: false,
Jiyong Parkd4671112019-04-19 17:23:04 +090068 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070069 }`,
70 prebuilt: false,
71 },
72 {
73 name: "prebuilt preferred",
74 modules: `
75 source {
76 name: "bar",
77 }
78
79 prebuilt {
80 name: "bar",
81 prefer: true,
Jiyong Parkd4671112019-04-19 17:23:04 +090082 srcs: ["prebuilt_file"],
Colin Crossce75d2c2016-10-06 16:12:58 -070083 }`,
84 prebuilt: true,
85 },
Colin Cross0d614dd2016-10-14 15:38:43 -070086 {
87 name: "prebuilt no file not preferred",
88 modules: `
89 source {
90 name: "bar",
91 }
92
93 prebuilt {
94 name: "bar",
95 prefer: false,
96 }`,
97 prebuilt: false,
98 },
99 {
100 name: "prebuilt no file preferred",
101 modules: `
102 source {
103 name: "bar",
104 }
105
106 prebuilt {
107 name: "bar",
108 prefer: true,
109 }`,
110 prebuilt: false,
111 },
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700112 {
113 name: "prebuilt file from filegroup preferred",
114 modules: `
115 filegroup {
116 name: "fg",
Jiyong Parkd4671112019-04-19 17:23:04 +0900117 srcs: ["prebuilt_file"],
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700118 }
119 prebuilt {
120 name: "bar",
121 prefer: true,
122 srcs: [":fg"],
123 }`,
124 prebuilt: true,
125 },
Colin Crossce75d2c2016-10-06 16:12:58 -0700126}
127
128func TestPrebuilts(t *testing.T) {
Colin Cross0d614dd2016-10-14 15:38:43 -0700129 buildDir, err := ioutil.TempDir("", "soong_prebuilt_test")
130 if err != nil {
131 t.Fatal(err)
132 }
133 defer os.RemoveAll(buildDir)
134
Colin Cross6ccbc912017-10-10 23:07:38 -0700135 config := TestConfig(buildDir, nil)
Colin Cross0d614dd2016-10-14 15:38:43 -0700136
Colin Crossce75d2c2016-10-06 16:12:58 -0700137 for _, test := range prebuiltsTests {
138 t.Run(test.name, func(t *testing.T) {
Colin Crosscec81712017-07-13 14:43:27 -0700139 ctx := NewTestContext()
Colin Cross5ea9bcc2017-07-27 15:41:32 -0700140 ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators)
141 ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators)
Pirama Arumuga Nainar955dc492018-04-17 14:58:42 -0700142 ctx.RegisterModuleType("filegroup", ModuleFactoryAdaptor(FileGroupFactory))
Colin Cross36242852017-06-23 15:06:31 -0700143 ctx.RegisterModuleType("prebuilt", ModuleFactoryAdaptor(newPrebuiltModule))
144 ctx.RegisterModuleType("source", ModuleFactoryAdaptor(newSourceModule))
Colin Crosscec81712017-07-13 14:43:27 -0700145 ctx.Register()
Colin Crossce75d2c2016-10-06 16:12:58 -0700146 ctx.MockFileSystem(map[string][]byte{
Jiyong Parkd4671112019-04-19 17:23:04 +0900147 "prebuilt_file": nil,
148 "source_file": nil,
Colin Crossce75d2c2016-10-06 16:12:58 -0700149 "Blueprints": []byte(`
150 source {
151 name: "foo",
Jiyong Parkd4671112019-04-19 17:23:04 +0900152 deps: [":bar"],
Colin Crossce75d2c2016-10-06 16:12:58 -0700153 }
154 ` + test.modules),
155 })
156
Colin Crossce75d2c2016-10-06 16:12:58 -0700157 _, errs := ctx.ParseBlueprintsFiles("Blueprints")
Logan Chien42039712018-03-12 16:29:17 +0800158 FailIfErrored(t, errs)
Colin Crossce75d2c2016-10-06 16:12:58 -0700159 _, errs = ctx.PrepareBuildActions(config)
Logan Chien42039712018-03-12 16:29:17 +0800160 FailIfErrored(t, errs)
Colin Crossce75d2c2016-10-06 16:12:58 -0700161
Colin Crosscec81712017-07-13 14:43:27 -0700162 foo := ctx.ModuleForTests("foo", "")
Colin Crossce75d2c2016-10-06 16:12:58 -0700163
Colin Crossc3e7fa62017-03-17 13:14:32 -0700164 var dependsOnSourceModule, dependsOnPrebuiltModule bool
Colin Crosscec81712017-07-13 14:43:27 -0700165 ctx.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
Colin Crossc3e7fa62017-03-17 13:14:32 -0700166 if _, ok := m.(*sourceModule); ok {
167 dependsOnSourceModule = true
168 }
169 if p, ok := m.(*prebuiltModule); ok {
170 dependsOnPrebuiltModule = true
Colin Cross74d73e22017-08-02 11:05:49 -0700171 if !p.Prebuilt().properties.UsePrebuilt {
Colin Crossc3e7fa62017-03-17 13:14:32 -0700172 t.Errorf("dependency on prebuilt module not marked used")
173 }
174 }
175 })
176
Jiyong Parkd4671112019-04-19 17:23:04 +0900177 deps := foo.Module().(*sourceModule).deps
178 if deps == nil || len(deps) != 1 {
179 t.Errorf("deps does not have single path, but is %v", deps)
180 }
181 var usingSourceFile, usingPrebuiltFile bool
182 if deps[0].String() == "source_file" {
183 usingSourceFile = true
184 }
185 if deps[0].String() == "prebuilt_file" {
186 usingPrebuiltFile = true
187 }
188
Colin Crossce75d2c2016-10-06 16:12:58 -0700189 if test.prebuilt {
Colin Crossc3e7fa62017-03-17 13:14:32 -0700190 if !dependsOnPrebuiltModule {
Colin Crossce75d2c2016-10-06 16:12:58 -0700191 t.Errorf("doesn't depend on prebuilt module")
192 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900193 if !usingPrebuiltFile {
194 t.Errorf("doesn't use prebuilt_file")
195 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700196
Colin Crossc3e7fa62017-03-17 13:14:32 -0700197 if dependsOnSourceModule {
Colin Crossce75d2c2016-10-06 16:12:58 -0700198 t.Errorf("depends on source module")
199 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900200 if usingSourceFile {
201 t.Errorf("using source_file")
202 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700203 } else {
Colin Crossc3e7fa62017-03-17 13:14:32 -0700204 if dependsOnPrebuiltModule {
Colin Crossce75d2c2016-10-06 16:12:58 -0700205 t.Errorf("depends on prebuilt module")
206 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900207 if usingPrebuiltFile {
208 t.Errorf("using prebuilt_file")
209 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700210
Colin Crossc3e7fa62017-03-17 13:14:32 -0700211 if !dependsOnSourceModule {
Jiyong Parkd4671112019-04-19 17:23:04 +0900212 t.Errorf("doesn't depend on source module")
213 }
214 if !usingSourceFile {
215 t.Errorf("doesn't use source_file")
Colin Crossce75d2c2016-10-06 16:12:58 -0700216 }
217 }
218 })
219 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700220}
221
222type prebuiltModule struct {
223 ModuleBase
Colin Cross74d73e22017-08-02 11:05:49 -0700224 prebuilt Prebuilt
225 properties struct {
Colin Cross27b922f2019-03-04 22:35:41 -0800226 Srcs []string `android:"path"`
Colin Cross74d73e22017-08-02 11:05:49 -0700227 }
Jiyong Parkd4671112019-04-19 17:23:04 +0900228 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700229}
230
Colin Cross36242852017-06-23 15:06:31 -0700231func newPrebuiltModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700232 m := &prebuiltModule{}
Colin Cross74d73e22017-08-02 11:05:49 -0700233 m.AddProperties(&m.properties)
234 InitPrebuiltModule(m, &m.properties.Srcs)
Colin Cross36242852017-06-23 15:06:31 -0700235 InitAndroidModule(m)
236 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700237}
238
239func (p *prebuiltModule) Name() string {
240 return p.prebuilt.Name(p.ModuleBase.Name())
241}
242
Jiyong Parkd4671112019-04-19 17:23:04 +0900243func (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
244 if len(p.properties.Srcs) >= 1 {
245 p.src = p.prebuilt.SingleSourcePath(ctx)
246 }
Colin Crossce75d2c2016-10-06 16:12:58 -0700247}
248
249func (p *prebuiltModule) Prebuilt() *Prebuilt {
250 return &p.prebuilt
251}
252
Jiyong Parkd4671112019-04-19 17:23:04 +0900253func (p *prebuiltModule) Srcs() Paths {
254 return Paths{p.src}
255}
256
Colin Crossce75d2c2016-10-06 16:12:58 -0700257type sourceModule struct {
258 ModuleBase
259 properties struct {
Jiyong Parkd4671112019-04-19 17:23:04 +0900260 Deps []string `android:"path"`
Colin Crossce75d2c2016-10-06 16:12:58 -0700261 }
262 dependsOnSourceModule, dependsOnPrebuiltModule bool
Jiyong Parkd4671112019-04-19 17:23:04 +0900263 deps Paths
264 src Path
Colin Crossce75d2c2016-10-06 16:12:58 -0700265}
266
Colin Cross36242852017-06-23 15:06:31 -0700267func newSourceModule() Module {
Colin Crossce75d2c2016-10-06 16:12:58 -0700268 m := &sourceModule{}
Colin Cross36242852017-06-23 15:06:31 -0700269 m.AddProperties(&m.properties)
270 InitAndroidModule(m)
271 return m
Colin Crossce75d2c2016-10-06 16:12:58 -0700272}
273
274func (s *sourceModule) DepsMutator(ctx BottomUpMutatorContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900275 // s.properties.Deps are annotated with android:path, so they are
276 // automatically added to the dependency by pathDeps mutator
Colin Crossce75d2c2016-10-06 16:12:58 -0700277}
278
279func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
Jiyong Parkd4671112019-04-19 17:23:04 +0900280 s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
281 s.src = PathForModuleSrc(ctx, "source_file")
282}
283
284func (s *sourceModule) Srcs() Paths {
285 return Paths{s.src}
Colin Crossce75d2c2016-10-06 16:12:58 -0700286}