1// Copyright 2020 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 "github.com/google/blueprint/proptools" 22) 23 24// Module to be packaged 25type componentTestModule struct { 26 ModuleBase 27 props struct { 28 Deps []string 29 Skip_install *bool 30 } 31} 32 33// dep tag used in this test. All dependencies are considered as installable. 34type installDepTag struct { 35 blueprint.BaseDependencyTag 36 InstallAlwaysNeededDependencyTag 37} 38 39func componentTestModuleFactory() Module { 40 m := &componentTestModule{} 41 m.AddProperties(&m.props) 42 InitAndroidArchModule(m, HostAndDeviceSupported, MultilibBoth) 43 return m 44} 45 46func (m *componentTestModule) DepsMutator(ctx BottomUpMutatorContext) { 47 ctx.AddDependency(ctx.Module(), installDepTag{}, m.props.Deps...) 48} 49 50func (m *componentTestModule) GenerateAndroidBuildActions(ctx ModuleContext) { 51 builtFile := PathForModuleOut(ctx, m.Name()) 52 dir := ctx.Target().Arch.ArchType.Multilib 53 installDir := PathForModuleInstall(ctx, dir) 54 if proptools.Bool(m.props.Skip_install) { 55 m.SkipInstall() 56 } 57 ctx.InstallFile(installDir, m.Name(), builtFile) 58} 59 60// Module that itself is a package 61type packageTestModule struct { 62 ModuleBase 63 PackagingBase 64 properties struct { 65 Install_deps []string `android:` 66 } 67 entries []string 68} 69 70func packageMultiTargetTestModuleFactory() Module { 71 module := &packageTestModule{} 72 InitPackageModule(module) 73 InitAndroidMultiTargetsArchModule(module, DeviceSupported, MultilibCommon) 74 module.AddProperties(&module.properties) 75 return module 76} 77 78func packageTestModuleFactory() Module { 79 module := &packageTestModule{} 80 InitPackageModule(module) 81 InitAndroidArchModule(module, DeviceSupported, MultilibBoth) 82 module.AddProperties(&module.properties) 83 return module 84} 85 86type packagingDepTag struct { 87 blueprint.BaseDependencyTag 88 PackagingItemAlwaysDepTag 89} 90 91func (m *packageTestModule) DepsMutator(ctx BottomUpMutatorContext) { 92 m.AddDeps(ctx, packagingDepTag{}) 93 ctx.AddDependency(ctx.Module(), installDepTag{}, m.properties.Install_deps...) 94} 95 96func (m *packageTestModule) GenerateAndroidBuildActions(ctx ModuleContext) { 97 zipFile := PathForModuleOut(ctx, "myzip.zip") 98 m.entries = m.CopyDepsToZip(ctx, m.GatherPackagingSpecs(ctx), zipFile) 99} 100 101func runPackagingTest(t *testing.T, multitarget bool, bp string, expected []string) { 102 t.Helper() 103 104 var archVariant string 105 var moduleFactory ModuleFactory 106 if multitarget { 107 archVariant = "android_common" 108 moduleFactory = packageMultiTargetTestModuleFactory 109 } else { 110 archVariant = "android_arm64_armv8-a" 111 moduleFactory = packageTestModuleFactory 112 } 113 114 result := GroupFixturePreparers( 115 PrepareForTestWithArchMutator, 116 FixtureRegisterWithContext(func(ctx RegistrationContext) { 117 ctx.RegisterModuleType("component", componentTestModuleFactory) 118 ctx.RegisterModuleType("package_module", moduleFactory) 119 }), 120 FixtureWithRootAndroidBp(bp), 121 ).RunTest(t) 122 123 p := result.Module("package", archVariant).(*packageTestModule) 124 actual := p.entries 125 actual = SortedUniqueStrings(actual) 126 expected = SortedUniqueStrings(expected) 127 AssertDeepEquals(t, "package entries", expected, actual) 128} 129 130func TestPackagingBaseMultiTarget(t *testing.T) { 131 multiTarget := true 132 runPackagingTest(t, multiTarget, 133 ` 134 component { 135 name: "foo", 136 } 137 138 package_module { 139 name: "package", 140 deps: ["foo"], 141 } 142 `, []string{"lib64/foo"}) 143 144 runPackagingTest(t, multiTarget, 145 ` 146 component { 147 name: "foo", 148 deps: ["bar"], 149 } 150 151 component { 152 name: "bar", 153 } 154 155 package_module { 156 name: "package", 157 deps: ["foo"], 158 } 159 `, []string{"lib64/foo", "lib64/bar"}) 160 161 runPackagingTest(t, multiTarget, 162 ` 163 component { 164 name: "foo", 165 deps: ["bar"], 166 } 167 168 component { 169 name: "bar", 170 } 171 172 package_module { 173 name: "package", 174 deps: ["foo"], 175 compile_multilib: "both", 176 } 177 `, []string{"lib32/foo", "lib32/bar", "lib64/foo", "lib64/bar"}) 178 179 runPackagingTest(t, multiTarget, 180 ` 181 component { 182 name: "foo", 183 } 184 185 component { 186 name: "bar", 187 compile_multilib: "32", 188 } 189 190 package_module { 191 name: "package", 192 deps: ["foo"], 193 multilib: { 194 lib32: { 195 deps: ["bar"], 196 }, 197 }, 198 compile_multilib: "both", 199 } 200 `, []string{"lib32/foo", "lib32/bar", "lib64/foo"}) 201 202 runPackagingTest(t, multiTarget, 203 ` 204 component { 205 name: "foo", 206 } 207 208 component { 209 name: "bar", 210 } 211 212 package_module { 213 name: "package", 214 deps: ["foo"], 215 multilib: { 216 first: { 217 deps: ["bar"], 218 }, 219 }, 220 compile_multilib: "both", 221 } 222 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"}) 223 224 runPackagingTest(t, multiTarget, 225 ` 226 component { 227 name: "foo", 228 } 229 230 component { 231 name: "bar", 232 } 233 234 component { 235 name: "baz", 236 } 237 238 package_module { 239 name: "package", 240 deps: ["foo"], 241 arch: { 242 arm64: { 243 deps: ["bar"], 244 }, 245 x86_64: { 246 deps: ["baz"], 247 }, 248 }, 249 compile_multilib: "both", 250 } 251 `, []string{"lib32/foo", "lib64/foo", "lib64/bar"}) 252} 253 254func TestPackagingBaseSingleTarget(t *testing.T) { 255 multiTarget := false 256 runPackagingTest(t, multiTarget, 257 ` 258 component { 259 name: "foo", 260 } 261 262 package_module { 263 name: "package", 264 deps: ["foo"], 265 } 266 `, []string{"lib64/foo"}) 267 268 runPackagingTest(t, multiTarget, 269 ` 270 component { 271 name: "foo", 272 deps: ["bar"], 273 } 274 275 component { 276 name: "bar", 277 } 278 279 package_module { 280 name: "package", 281 deps: ["foo"], 282 } 283 `, []string{"lib64/foo", "lib64/bar"}) 284 285 runPackagingTest(t, multiTarget, 286 ` 287 component { 288 name: "foo", 289 } 290 291 component { 292 name: "bar", 293 compile_multilib: "32", 294 } 295 296 package_module { 297 name: "package", 298 deps: ["foo"], 299 multilib: { 300 lib32: { 301 deps: ["bar"], 302 }, 303 }, 304 } 305 `, []string{"lib64/foo"}) 306 307 runPackagingTest(t, multiTarget, 308 ` 309 component { 310 name: "foo", 311 } 312 313 component { 314 name: "bar", 315 } 316 317 package_module { 318 name: "package", 319 deps: ["foo"], 320 multilib: { 321 lib64: { 322 deps: ["bar"], 323 }, 324 }, 325 } 326 `, []string{"lib64/foo", "lib64/bar"}) 327 328 runPackagingTest(t, multiTarget, 329 ` 330 component { 331 name: "foo", 332 } 333 334 component { 335 name: "bar", 336 } 337 338 component { 339 name: "baz", 340 } 341 342 package_module { 343 name: "package", 344 deps: ["foo"], 345 arch: { 346 arm64: { 347 deps: ["bar"], 348 }, 349 x86_64: { 350 deps: ["baz"], 351 }, 352 }, 353 } 354 `, []string{"lib64/foo", "lib64/bar"}) 355 356 runPackagingTest(t, multiTarget, 357 ` 358 component { 359 name: "foo", 360 } 361 362 component { 363 name: "bar", 364 } 365 366 package_module { 367 name: "package", 368 deps: ["foo"], 369 install_deps: ["bar"], 370 } 371 `, []string{"lib64/foo"}) 372} 373 374func TestPackagingWithSkipInstallDeps(t *testing.T) { 375 // package -[dep]-> foo -[dep]-> bar -[dep]-> baz 376 // OK SKIPPED 377 multiTarget := false 378 runPackagingTest(t, multiTarget, 379 ` 380 component { 381 name: "foo", 382 deps: ["bar"], 383 } 384 385 component { 386 name: "bar", 387 deps: ["baz"], 388 skip_install: true, 389 } 390 391 component { 392 name: "baz", 393 } 394 395 package_module { 396 name: "package", 397 deps: ["foo"], 398 } 399 `, []string{"lib64/foo"}) 400} 401