blob: 673d6fb6e22aecbb77dcf86f433b1bfd0f934c48 [file] [log] [blame]
Paul Duffind19f8942021-07-14 12:08:37 +01001// 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
15package sdk
16
17import (
18 "fmt"
19 "path/filepath"
20 "testing"
21
22 "android/soong/android"
23 "android/soong/java"
24 "github.com/google/blueprint"
25)
26
27type fakeMemberTrait struct {
28 android.SdkMemberTraitBase
29}
30
31type fakeMemberType struct {
32 android.SdkMemberTypeBase
33}
34
35func (t *fakeMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) {
36 for _, name := range names {
37 ctx.AddVariationDependencies(nil, dependencyTag, name)
38
39 if ctx.RequiresTrait(name, extraTrait) {
40 ctx.AddVariationDependencies(nil, dependencyTag, name+"_extra")
41 }
42 if ctx.RequiresTrait(name, specialTrait) {
43 ctx.AddVariationDependencies(nil, dependencyTag, name+"_special")
44 }
45 }
46}
47
48func (t *fakeMemberType) IsInstance(module android.Module) bool {
49 return true
50}
51
52func (t *fakeMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
53 moduleType := "java_import"
54 if ctx.RequiresTrait(extraTrait) {
55 moduleType = "java_test_import"
56 }
57 return ctx.SnapshotBuilder().AddPrebuiltModule(member, moduleType)
58}
59
60func (t *fakeMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
61 return &fakeMemberTypeProperties{}
62}
63
64type fakeMemberTypeProperties struct {
65 android.SdkMemberPropertiesBase
66
67 path android.Path
68}
69
70func (t *fakeMemberTypeProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
71 headerJars := variant.(java.ApexDependency).HeaderJars()
72 if len(headerJars) != 1 {
73 panic(fmt.Errorf("there must be only one header jar from %q", variant.Name()))
74 }
75
76 t.path = headerJars[0]
77}
78
79func (t *fakeMemberTypeProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
80 if t.path != nil {
81 relative := filepath.Join("javalibs", t.path.Base())
82 ctx.SnapshotBuilder().CopyToSnapshot(t.path, relative)
83 propertySet.AddProperty("jars", []string{relative})
84 }
85}
86
87var (
88 extraTrait = &fakeMemberTrait{
89 SdkMemberTraitBase: android.SdkMemberTraitBase{
90 PropertyName: "extra",
91 },
92 }
93
94 specialTrait = &fakeMemberTrait{
95 SdkMemberTraitBase: android.SdkMemberTraitBase{
96 PropertyName: "special",
97 },
98 }
99
100 fakeType = &fakeMemberType{
101 SdkMemberTypeBase: android.SdkMemberTypeBase{
102 PropertyName: "fake_members",
103 SupportsSdk: true,
104 Traits: []android.SdkMemberTrait{
105 extraTrait,
106 specialTrait,
107 },
108 },
109 }
110)
111
112func init() {
113 android.RegisterSdkMemberTrait(extraTrait)
114 android.RegisterSdkMemberTrait(specialTrait)
115 android.RegisterSdkMemberType(fakeType)
116}
117
118func TestBasicTrait_WithoutTrait(t *testing.T) {
119 result := android.GroupFixturePreparers(
120 prepareForSdkTestWithJava,
121 android.FixtureWithRootAndroidBp(`
122 sdk {
123 name: "mysdk",
124 fake_members: ["myjavalib"],
125 }
126
127 java_library {
128 name: "myjavalib",
129 srcs: ["Test.java"],
130 system_modules: "none",
131 sdk_version: "none",
132 }
133 `),
134 ).RunTest(t)
135
136 CheckSnapshot(t, result, "mysdk", "",
Paul Duffinb01ac4b2022-05-24 20:10:05 +0000137 checkAndroidBpContents(`
Paul Duffind19f8942021-07-14 12:08:37 +0100138// This is auto-generated. DO NOT EDIT.
139
Spandan Dasa5e26d32024-03-06 14:04:36 +0000140apex_contributions_defaults {
141 name: "mysdk.contributions",
142 contents: ["prebuilt_myjavalib"],
143}
144
Paul Duffind19f8942021-07-14 12:08:37 +0100145java_import {
146 name: "myjavalib",
147 prefer: false,
148 visibility: ["//visibility:public"],
149 apex_available: ["//apex_available:platform"],
150 jars: ["javalibs/myjavalib.jar"],
151}
152`),
Paul Duffind19f8942021-07-14 12:08:37 +0100153 )
154}
155
156func TestBasicTrait_MultipleTraits(t *testing.T) {
157 result := android.GroupFixturePreparers(
158 prepareForSdkTestWithJava,
159 android.FixtureWithRootAndroidBp(`
160 sdk {
161 name: "mysdk",
162 fake_members: ["myjavalib", "anotherjavalib"],
163 traits: {
164 extra: ["myjavalib"],
165 special: ["myjavalib", "anotherjavalib"],
166 },
167 }
168
169 java_library {
170 name: "myjavalib",
171 srcs: ["Test.java"],
172 system_modules: "none",
173 sdk_version: "none",
174 }
175
176 java_library {
177 name: "myjavalib_extra",
178 srcs: ["Test.java"],
179 system_modules: "none",
180 sdk_version: "none",
181 }
182
183 java_library {
184 name: "myjavalib_special",
185 srcs: ["Test.java"],
186 system_modules: "none",
187 sdk_version: "none",
188 }
189
190 java_library {
191 name: "anotherjavalib",
192 srcs: ["Test.java"],
193 system_modules: "none",
194 sdk_version: "none",
195 }
196
197 java_library {
198 name: "anotherjavalib_special",
199 srcs: ["Test.java"],
200 system_modules: "none",
201 sdk_version: "none",
202 }
203 `),
204 ).RunTest(t)
205
206 CheckSnapshot(t, result, "mysdk", "",
Paul Duffinb01ac4b2022-05-24 20:10:05 +0000207 checkAndroidBpContents(`
Paul Duffind19f8942021-07-14 12:08:37 +0100208// This is auto-generated. DO NOT EDIT.
209
Spandan Dasa5e26d32024-03-06 14:04:36 +0000210apex_contributions_defaults {
211 name: "mysdk.contributions",
212 contents: [
213 "prebuilt_myjavalib",
214 "prebuilt_myjavalib_extra",
215 "prebuilt_myjavalib_special",
216 "prebuilt_anotherjavalib",
217 "prebuilt_anotherjavalib_special",
218 ],
219}
220
Paul Duffind19f8942021-07-14 12:08:37 +0100221java_test_import {
222 name: "myjavalib",
223 prefer: false,
224 visibility: ["//visibility:public"],
225 apex_available: ["//apex_available:platform"],
226 jars: ["javalibs/myjavalib.jar"],
227}
228
229java_import {
230 name: "myjavalib_extra",
231 prefer: false,
232 visibility: ["//visibility:public"],
233 apex_available: ["//apex_available:platform"],
234 jars: ["javalibs/myjavalib_extra.jar"],
235}
236
237java_import {
238 name: "myjavalib_special",
239 prefer: false,
240 visibility: ["//visibility:public"],
241 apex_available: ["//apex_available:platform"],
242 jars: ["javalibs/myjavalib_special.jar"],
243}
244
245java_import {
246 name: "anotherjavalib",
247 prefer: false,
248 visibility: ["//visibility:public"],
249 apex_available: ["//apex_available:platform"],
250 jars: ["javalibs/anotherjavalib.jar"],
251}
252
253java_import {
254 name: "anotherjavalib_special",
255 prefer: false,
256 visibility: ["//visibility:public"],
257 apex_available: ["//apex_available:platform"],
258 jars: ["javalibs/anotherjavalib_special.jar"],
259}
260`),
261 )
262}
263
264func TestTraitUnsupportedByMemberType(t *testing.T) {
265 android.GroupFixturePreparers(
266 prepareForSdkTestWithJava,
267 android.FixtureWithRootAndroidBp(`
268 sdk {
269 name: "mysdk",
270 java_header_libs: ["myjavalib"],
271 traits: {
272 extra: ["myjavalib"],
273 },
274 }
275
276 java_library {
277 name: "myjavalib",
278 srcs: ["Test.java"],
279 system_modules: "none",
280 sdk_version: "none",
281 }
282 `),
283 ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
284 `\Qsdk member "myjavalib" has traits [extra] that are unsupported by its member type "java_header_libs"\E`)).
285 RunTest(t)
286}