prebuilt_test.go 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483
  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. package android
  15. import (
  16. "fmt"
  17. "testing"
  18. "github.com/google/blueprint"
  19. )
  20. var prebuiltsTests = []struct {
  21. name string
  22. replaceBp bool // modules is added to default bp boilerplate if false.
  23. modules string
  24. prebuilt []OsType
  25. }{
  26. {
  27. name: "no prebuilt",
  28. modules: `
  29. source {
  30. name: "bar",
  31. }`,
  32. prebuilt: nil,
  33. },
  34. {
  35. name: "no source prebuilt not preferred",
  36. modules: `
  37. prebuilt {
  38. name: "bar",
  39. prefer: false,
  40. srcs: ["prebuilt_file"],
  41. }`,
  42. prebuilt: []OsType{Android, BuildOs},
  43. },
  44. {
  45. name: "no source prebuilt preferred",
  46. modules: `
  47. prebuilt {
  48. name: "bar",
  49. prefer: true,
  50. srcs: ["prebuilt_file"],
  51. }`,
  52. prebuilt: []OsType{Android, BuildOs},
  53. },
  54. {
  55. name: "prebuilt not preferred",
  56. modules: `
  57. source {
  58. name: "bar",
  59. }
  60. prebuilt {
  61. name: "bar",
  62. prefer: false,
  63. srcs: ["prebuilt_file"],
  64. }`,
  65. prebuilt: nil,
  66. },
  67. {
  68. name: "prebuilt preferred",
  69. modules: `
  70. source {
  71. name: "bar",
  72. }
  73. prebuilt {
  74. name: "bar",
  75. prefer: true,
  76. srcs: ["prebuilt_file"],
  77. }`,
  78. prebuilt: []OsType{Android, BuildOs},
  79. },
  80. {
  81. name: "prebuilt no file not preferred",
  82. modules: `
  83. source {
  84. name: "bar",
  85. }
  86. prebuilt {
  87. name: "bar",
  88. prefer: false,
  89. }`,
  90. prebuilt: nil,
  91. },
  92. {
  93. name: "prebuilt no file preferred",
  94. modules: `
  95. source {
  96. name: "bar",
  97. }
  98. prebuilt {
  99. name: "bar",
  100. prefer: true,
  101. }`,
  102. prebuilt: nil,
  103. },
  104. {
  105. name: "prebuilt file from filegroup preferred",
  106. modules: `
  107. filegroup {
  108. name: "fg",
  109. srcs: ["prebuilt_file"],
  110. }
  111. prebuilt {
  112. name: "bar",
  113. prefer: true,
  114. srcs: [":fg"],
  115. }`,
  116. prebuilt: []OsType{Android, BuildOs},
  117. },
  118. {
  119. name: "prebuilt module for device only",
  120. modules: `
  121. source {
  122. name: "bar",
  123. }
  124. prebuilt {
  125. name: "bar",
  126. host_supported: false,
  127. prefer: true,
  128. srcs: ["prebuilt_file"],
  129. }`,
  130. prebuilt: []OsType{Android},
  131. },
  132. {
  133. name: "prebuilt file for host only",
  134. modules: `
  135. source {
  136. name: "bar",
  137. }
  138. prebuilt {
  139. name: "bar",
  140. prefer: true,
  141. target: {
  142. host: {
  143. srcs: ["prebuilt_file"],
  144. },
  145. },
  146. }`,
  147. prebuilt: []OsType{BuildOs},
  148. },
  149. {
  150. name: "prebuilt override not preferred",
  151. modules: `
  152. source {
  153. name: "baz",
  154. }
  155. override_source {
  156. name: "bar",
  157. base: "baz",
  158. }
  159. prebuilt {
  160. name: "bar",
  161. prefer: false,
  162. srcs: ["prebuilt_file"],
  163. }`,
  164. prebuilt: nil,
  165. },
  166. {
  167. name: "prebuilt override preferred",
  168. modules: `
  169. source {
  170. name: "baz",
  171. }
  172. override_source {
  173. name: "bar",
  174. base: "baz",
  175. }
  176. prebuilt {
  177. name: "bar",
  178. prefer: true,
  179. srcs: ["prebuilt_file"],
  180. }`,
  181. prebuilt: []OsType{Android, BuildOs},
  182. },
  183. {
  184. name: "prebuilt including default-disabled OS",
  185. replaceBp: true,
  186. modules: `
  187. source {
  188. name: "foo",
  189. deps: [":bar"],
  190. target: {
  191. windows: {
  192. enabled: true,
  193. },
  194. },
  195. }
  196. source {
  197. name: "bar",
  198. target: {
  199. windows: {
  200. enabled: true,
  201. },
  202. },
  203. }
  204. prebuilt {
  205. name: "bar",
  206. prefer: true,
  207. srcs: ["prebuilt_file"],
  208. target: {
  209. windows: {
  210. enabled: true,
  211. },
  212. },
  213. }`,
  214. prebuilt: []OsType{Android, BuildOs, Windows},
  215. },
  216. {
  217. name: "fall back to source for default-disabled OS",
  218. replaceBp: true,
  219. modules: `
  220. source {
  221. name: "foo",
  222. deps: [":bar"],
  223. target: {
  224. windows: {
  225. enabled: true,
  226. },
  227. },
  228. }
  229. source {
  230. name: "bar",
  231. target: {
  232. windows: {
  233. enabled: true,
  234. },
  235. },
  236. }
  237. prebuilt {
  238. name: "bar",
  239. prefer: true,
  240. srcs: ["prebuilt_file"],
  241. }`,
  242. prebuilt: []OsType{Android, BuildOs},
  243. },
  244. }
  245. func TestPrebuilts(t *testing.T) {
  246. fs := map[string][]byte{
  247. "prebuilt_file": nil,
  248. "source_file": nil,
  249. }
  250. for _, test := range prebuiltsTests {
  251. t.Run(test.name, func(t *testing.T) {
  252. bp := test.modules
  253. if !test.replaceBp {
  254. bp = bp + `
  255. source {
  256. name: "foo",
  257. deps: [":bar"],
  258. }`
  259. }
  260. config := TestArchConfig(buildDir, nil, bp, fs)
  261. // Add windows to the target list to test the logic when a variant is
  262. // disabled by default.
  263. if !Windows.DefaultDisabled {
  264. t.Errorf("windows is assumed to be disabled by default")
  265. }
  266. config.config.Targets[Windows] = []Target{
  267. {Windows, Arch{ArchType: X86_64}, NativeBridgeDisabled, "", "", true},
  268. }
  269. ctx := NewTestArchContext()
  270. registerTestPrebuiltBuildComponents(ctx)
  271. ctx.RegisterModuleType("filegroup", FileGroupFactory)
  272. ctx.Register(config)
  273. _, errs := ctx.ParseBlueprintsFiles("Android.bp")
  274. FailIfErrored(t, errs)
  275. _, errs = ctx.PrepareBuildActions(config)
  276. FailIfErrored(t, errs)
  277. for _, variant := range ctx.ModuleVariantsForTests("foo") {
  278. foo := ctx.ModuleForTests("foo", variant)
  279. t.Run(foo.Module().Target().Os.String(), func(t *testing.T) {
  280. var dependsOnSourceModule, dependsOnPrebuiltModule bool
  281. ctx.VisitDirectDeps(foo.Module(), func(m blueprint.Module) {
  282. if _, ok := m.(*sourceModule); ok {
  283. dependsOnSourceModule = true
  284. }
  285. if p, ok := m.(*prebuiltModule); ok {
  286. dependsOnPrebuiltModule = true
  287. if !p.Prebuilt().properties.UsePrebuilt {
  288. t.Errorf("dependency on prebuilt module not marked used")
  289. }
  290. }
  291. })
  292. moduleIsDisabled := !foo.Module().Enabled()
  293. deps := foo.Module().(*sourceModule).deps
  294. if moduleIsDisabled {
  295. if len(deps) > 0 {
  296. t.Errorf("disabled module got deps: %v", deps)
  297. }
  298. } else {
  299. if len(deps) != 1 {
  300. t.Errorf("deps does not have single path, but is %v", deps)
  301. }
  302. }
  303. var usingSourceFile, usingPrebuiltFile bool
  304. if len(deps) > 0 && deps[0].String() == "source_file" {
  305. usingSourceFile = true
  306. }
  307. if len(deps) > 0 && deps[0].String() == "prebuilt_file" {
  308. usingPrebuiltFile = true
  309. }
  310. prebuilt := false
  311. for _, os := range test.prebuilt {
  312. if os == foo.Module().Target().Os {
  313. prebuilt = true
  314. }
  315. }
  316. if prebuilt {
  317. if moduleIsDisabled {
  318. t.Errorf("dependent module for prebuilt is disabled")
  319. }
  320. if !dependsOnPrebuiltModule {
  321. t.Errorf("doesn't depend on prebuilt module")
  322. }
  323. if !usingPrebuiltFile {
  324. t.Errorf("doesn't use prebuilt_file")
  325. }
  326. if dependsOnSourceModule {
  327. t.Errorf("depends on source module")
  328. }
  329. if usingSourceFile {
  330. t.Errorf("using source_file")
  331. }
  332. } else if !moduleIsDisabled {
  333. if dependsOnPrebuiltModule {
  334. t.Errorf("depends on prebuilt module")
  335. }
  336. if usingPrebuiltFile {
  337. t.Errorf("using prebuilt_file")
  338. }
  339. if !dependsOnSourceModule {
  340. t.Errorf("doesn't depend on source module")
  341. }
  342. if !usingSourceFile {
  343. t.Errorf("doesn't use source_file")
  344. }
  345. }
  346. })
  347. }
  348. })
  349. }
  350. }
  351. func registerTestPrebuiltBuildComponents(ctx RegistrationContext) {
  352. ctx.RegisterModuleType("prebuilt", newPrebuiltModule)
  353. ctx.RegisterModuleType("source", newSourceModule)
  354. ctx.RegisterModuleType("override_source", newOverrideSourceModule)
  355. RegisterPrebuiltMutators(ctx)
  356. ctx.PostDepsMutators(RegisterOverridePostDepsMutators)
  357. }
  358. type prebuiltModule struct {
  359. ModuleBase
  360. prebuilt Prebuilt
  361. properties struct {
  362. Srcs []string `android:"path,arch_variant"`
  363. }
  364. src Path
  365. }
  366. func newPrebuiltModule() Module {
  367. m := &prebuiltModule{}
  368. m.AddProperties(&m.properties)
  369. InitPrebuiltModule(m, &m.properties.Srcs)
  370. InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
  371. return m
  372. }
  373. func (p *prebuiltModule) Name() string {
  374. return p.prebuilt.Name(p.ModuleBase.Name())
  375. }
  376. func (p *prebuiltModule) GenerateAndroidBuildActions(ctx ModuleContext) {
  377. if len(p.properties.Srcs) >= 1 {
  378. p.src = p.prebuilt.SingleSourcePath(ctx)
  379. }
  380. }
  381. func (p *prebuiltModule) Prebuilt() *Prebuilt {
  382. return &p.prebuilt
  383. }
  384. func (p *prebuiltModule) OutputFiles(tag string) (Paths, error) {
  385. switch tag {
  386. case "":
  387. return Paths{p.src}, nil
  388. default:
  389. return nil, fmt.Errorf("unsupported module reference tag %q", tag)
  390. }
  391. }
  392. type sourceModuleProperties struct {
  393. Deps []string `android:"path,arch_variant"`
  394. }
  395. type sourceModule struct {
  396. ModuleBase
  397. OverridableModuleBase
  398. properties sourceModuleProperties
  399. dependsOnSourceModule, dependsOnPrebuiltModule bool
  400. deps Paths
  401. src Path
  402. }
  403. func newSourceModule() Module {
  404. m := &sourceModule{}
  405. m.AddProperties(&m.properties)
  406. InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
  407. InitOverridableModule(m, nil)
  408. return m
  409. }
  410. func (s *sourceModule) OverridablePropertiesDepsMutator(ctx BottomUpMutatorContext) {
  411. // s.properties.Deps are annotated with android:path, so they are
  412. // automatically added to the dependency by pathDeps mutator
  413. }
  414. func (s *sourceModule) GenerateAndroidBuildActions(ctx ModuleContext) {
  415. s.deps = PathsForModuleSrc(ctx, s.properties.Deps)
  416. s.src = PathForModuleSrc(ctx, "source_file")
  417. }
  418. func (s *sourceModule) Srcs() Paths {
  419. return Paths{s.src}
  420. }
  421. type overrideSourceModule struct {
  422. ModuleBase
  423. OverrideModuleBase
  424. }
  425. func (o *overrideSourceModule) GenerateAndroidBuildActions(_ ModuleContext) {
  426. }
  427. func newOverrideSourceModule() Module {
  428. m := &overrideSourceModule{}
  429. m.AddProperties(&sourceModuleProperties{})
  430. InitAndroidArchModule(m, HostAndDeviceDefault, MultilibCommon)
  431. InitOverrideModule(m)
  432. return m
  433. }