github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/android/prebuilt_test.go (about) 1 // 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 15 package android 16 17 import ( 18 "io/ioutil" 19 "os" 20 "testing" 21 22 "github.com/google/blueprint" 23 ) 24 25 var 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, 44 srcs: ["prebuilt"], 45 }`, 46 prebuilt: true, 47 }, 48 { 49 name: "no source prebuilt preferred", 50 modules: ` 51 prebuilt { 52 name: "bar", 53 prefer: true, 54 srcs: ["prebuilt"], 55 }`, 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, 68 srcs: ["prebuilt"], 69 }`, 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, 82 srcs: ["prebuilt"], 83 }`, 84 prebuilt: true, 85 }, 86 { 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 }, 112 } 113 114 func TestPrebuilts(t *testing.T) { 115 buildDir, err := ioutil.TempDir("", "soong_prebuilt_test") 116 if err != nil { 117 t.Fatal(err) 118 } 119 defer os.RemoveAll(buildDir) 120 121 config := TestConfig(buildDir, nil) 122 123 for _, test := range prebuiltsTests { 124 t.Run(test.name, func(t *testing.T) { 125 ctx := NewTestContext() 126 ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators) 127 ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators) 128 ctx.RegisterModuleType("prebuilt", ModuleFactoryAdaptor(newPrebuiltModule)) 129 ctx.RegisterModuleType("source", ModuleFactoryAdaptor(newSourceModule)) 130 ctx.Register() 131 ctx.MockFileSystem(map[string][]byte{ 132 "Blueprints": []byte(` 133 source { 134 name: "foo", 135 deps: ["bar"], 136 } 137 ` + test.modules), 138 }) 139 140 _, errs := ctx.ParseBlueprintsFiles("Blueprints") 141 FailIfErrored(t, errs) 142 _, errs = ctx.PrepareBuildActions(config) 143 FailIfErrored(t, errs) 144 145 foo := ctx.ModuleForTests("foo", "") 146 147 var dependsOnSourceModule, dependsOnPrebuiltModule bool 148 ctx.VisitDirectDeps(foo.Module(), func(m blueprint.Module) { 149 if _, ok := m.(*sourceModule); ok { 150 dependsOnSourceModule = true 151 } 152 if p, ok := m.(*prebuiltModule); ok { 153 dependsOnPrebuiltModule = true 154 if !p.Prebuilt().properties.UsePrebuilt { 155 t.Errorf("dependency on prebuilt module not marked used") 156 } 157 } 158 }) 159 160 if test.prebuilt { 161 if !dependsOnPrebuiltModule { 162 t.Errorf("doesn't depend on prebuilt module") 163 } 164 165 if dependsOnSourceModule { 166 t.Errorf("depends on source module") 167 } 168 } else { 169 if dependsOnPrebuiltModule { 170 t.Errorf("depends on prebuilt module") 171 } 172 173 if !dependsOnSourceModule { 174 t.Errorf("doens't depend on source module") 175 } 176 } 177 }) 178 } 179 } 180 181 type prebuiltModule struct { 182 ModuleBase 183 prebuilt Prebuilt 184 properties struct { 185 Srcs []string 186 } 187 } 188 189 func newPrebuiltModule() Module { 190 m := &prebuiltModule{} 191 m.AddProperties(&m.properties) 192 InitPrebuiltModule(m, &m.properties.Srcs) 193 InitAndroidModule(m) 194 return m 195 } 196 197 func (p *prebuiltModule) Name() string { 198 return p.prebuilt.Name(p.ModuleBase.Name()) 199 } 200 201 func (p *prebuiltModule) DepsMutator(ctx BottomUpMutatorContext) { 202 } 203 204 func (p *prebuiltModule) GenerateAndroidBuildActions(ModuleContext) { 205 } 206 207 func (p *prebuiltModule) Prebuilt() *Prebuilt { 208 return &p.prebuilt 209 } 210 211 type sourceModule struct { 212 ModuleBase 213 properties struct { 214 Deps []string 215 } 216 dependsOnSourceModule, dependsOnPrebuiltModule bool 217 } 218 219 func newSourceModule() Module { 220 m := &sourceModule{} 221 m.AddProperties(&m.properties) 222 InitAndroidModule(m) 223 return m 224 } 225 226 func (s *sourceModule) DepsMutator(ctx BottomUpMutatorContext) { 227 for _, d := range s.properties.Deps { 228 ctx.AddDependency(ctx.Module(), nil, d) 229 } 230 } 231 232 func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) { 233 }