member_trait_test.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. // Copyright (C) 2021 The Android Open Source Project
  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 sdk
  15. import (
  16. "fmt"
  17. "path/filepath"
  18. "testing"
  19. "android/soong/android"
  20. "android/soong/java"
  21. "github.com/google/blueprint"
  22. )
  23. type fakeMemberTrait struct {
  24. android.SdkMemberTraitBase
  25. }
  26. type fakeMemberType struct {
  27. android.SdkMemberTypeBase
  28. }
  29. func (t *fakeMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) {
  30. for _, name := range names {
  31. ctx.AddVariationDependencies(nil, dependencyTag, name)
  32. if ctx.RequiresTrait(name, extraTrait) {
  33. ctx.AddVariationDependencies(nil, dependencyTag, name+"_extra")
  34. }
  35. if ctx.RequiresTrait(name, specialTrait) {
  36. ctx.AddVariationDependencies(nil, dependencyTag, name+"_special")
  37. }
  38. }
  39. }
  40. func (t *fakeMemberType) IsInstance(module android.Module) bool {
  41. return true
  42. }
  43. func (t *fakeMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
  44. moduleType := "java_import"
  45. if ctx.RequiresTrait(extraTrait) {
  46. moduleType = "java_test_import"
  47. }
  48. return ctx.SnapshotBuilder().AddPrebuiltModule(member, moduleType)
  49. }
  50. func (t *fakeMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
  51. return &fakeMemberTypeProperties{}
  52. }
  53. type fakeMemberTypeProperties struct {
  54. android.SdkMemberPropertiesBase
  55. path android.Path
  56. }
  57. func (t *fakeMemberTypeProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
  58. headerJars := variant.(java.ApexDependency).HeaderJars()
  59. if len(headerJars) != 1 {
  60. panic(fmt.Errorf("there must be only one header jar from %q", variant.Name()))
  61. }
  62. t.path = headerJars[0]
  63. }
  64. func (t *fakeMemberTypeProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
  65. if t.path != nil {
  66. relative := filepath.Join("javalibs", t.path.Base())
  67. ctx.SnapshotBuilder().CopyToSnapshot(t.path, relative)
  68. propertySet.AddProperty("jars", []string{relative})
  69. }
  70. }
  71. var (
  72. extraTrait = &fakeMemberTrait{
  73. SdkMemberTraitBase: android.SdkMemberTraitBase{
  74. PropertyName: "extra",
  75. },
  76. }
  77. specialTrait = &fakeMemberTrait{
  78. SdkMemberTraitBase: android.SdkMemberTraitBase{
  79. PropertyName: "special",
  80. },
  81. }
  82. fakeType = &fakeMemberType{
  83. SdkMemberTypeBase: android.SdkMemberTypeBase{
  84. PropertyName: "fake_members",
  85. SupportsSdk: true,
  86. Traits: []android.SdkMemberTrait{
  87. extraTrait,
  88. specialTrait,
  89. },
  90. },
  91. }
  92. )
  93. func init() {
  94. android.RegisterSdkMemberTrait(extraTrait)
  95. android.RegisterSdkMemberTrait(specialTrait)
  96. android.RegisterSdkMemberType(fakeType)
  97. }
  98. func TestBasicTrait_WithoutTrait(t *testing.T) {
  99. result := android.GroupFixturePreparers(
  100. prepareForSdkTestWithJava,
  101. android.FixtureWithRootAndroidBp(`
  102. sdk {
  103. name: "mysdk",
  104. fake_members: ["myjavalib"],
  105. }
  106. java_library {
  107. name: "myjavalib",
  108. srcs: ["Test.java"],
  109. system_modules: "none",
  110. sdk_version: "none",
  111. }
  112. `),
  113. ).RunTest(t)
  114. CheckSnapshot(t, result, "mysdk", "",
  115. checkAndroidBpContents(`
  116. // This is auto-generated. DO NOT EDIT.
  117. java_import {
  118. name: "myjavalib",
  119. prefer: false,
  120. visibility: ["//visibility:public"],
  121. apex_available: ["//apex_available:platform"],
  122. jars: ["javalibs/myjavalib.jar"],
  123. }
  124. `),
  125. )
  126. }
  127. func TestBasicTrait_MultipleTraits(t *testing.T) {
  128. result := android.GroupFixturePreparers(
  129. prepareForSdkTestWithJava,
  130. android.FixtureWithRootAndroidBp(`
  131. sdk {
  132. name: "mysdk",
  133. fake_members: ["myjavalib", "anotherjavalib"],
  134. traits: {
  135. extra: ["myjavalib"],
  136. special: ["myjavalib", "anotherjavalib"],
  137. },
  138. }
  139. java_library {
  140. name: "myjavalib",
  141. srcs: ["Test.java"],
  142. system_modules: "none",
  143. sdk_version: "none",
  144. }
  145. java_library {
  146. name: "myjavalib_extra",
  147. srcs: ["Test.java"],
  148. system_modules: "none",
  149. sdk_version: "none",
  150. }
  151. java_library {
  152. name: "myjavalib_special",
  153. srcs: ["Test.java"],
  154. system_modules: "none",
  155. sdk_version: "none",
  156. }
  157. java_library {
  158. name: "anotherjavalib",
  159. srcs: ["Test.java"],
  160. system_modules: "none",
  161. sdk_version: "none",
  162. }
  163. java_library {
  164. name: "anotherjavalib_special",
  165. srcs: ["Test.java"],
  166. system_modules: "none",
  167. sdk_version: "none",
  168. }
  169. `),
  170. ).RunTest(t)
  171. CheckSnapshot(t, result, "mysdk", "",
  172. checkAndroidBpContents(`
  173. // This is auto-generated. DO NOT EDIT.
  174. java_test_import {
  175. name: "myjavalib",
  176. prefer: false,
  177. visibility: ["//visibility:public"],
  178. apex_available: ["//apex_available:platform"],
  179. jars: ["javalibs/myjavalib.jar"],
  180. }
  181. java_import {
  182. name: "myjavalib_extra",
  183. prefer: false,
  184. visibility: ["//visibility:public"],
  185. apex_available: ["//apex_available:platform"],
  186. jars: ["javalibs/myjavalib_extra.jar"],
  187. }
  188. java_import {
  189. name: "myjavalib_special",
  190. prefer: false,
  191. visibility: ["//visibility:public"],
  192. apex_available: ["//apex_available:platform"],
  193. jars: ["javalibs/myjavalib_special.jar"],
  194. }
  195. java_import {
  196. name: "anotherjavalib",
  197. prefer: false,
  198. visibility: ["//visibility:public"],
  199. apex_available: ["//apex_available:platform"],
  200. jars: ["javalibs/anotherjavalib.jar"],
  201. }
  202. java_import {
  203. name: "anotherjavalib_special",
  204. prefer: false,
  205. visibility: ["//visibility:public"],
  206. apex_available: ["//apex_available:platform"],
  207. jars: ["javalibs/anotherjavalib_special.jar"],
  208. }
  209. `),
  210. )
  211. }
  212. func TestTraitUnsupportedByMemberType(t *testing.T) {
  213. android.GroupFixturePreparers(
  214. prepareForSdkTestWithJava,
  215. android.FixtureWithRootAndroidBp(`
  216. sdk {
  217. name: "mysdk",
  218. java_header_libs: ["myjavalib"],
  219. traits: {
  220. extra: ["myjavalib"],
  221. },
  222. }
  223. java_library {
  224. name: "myjavalib",
  225. srcs: ["Test.java"],
  226. system_modules: "none",
  227. sdk_version: "none",
  228. }
  229. `),
  230. ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
  231. `\Qsdk member "myjavalib" has traits [extra] that are unsupported by its member type "java_header_libs"\E`)).
  232. RunTest(t)
  233. }