blob: 9b41e9b7aa17d22e1b25f91d7a734137446f2ebe [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) {
Colin Crossaba8cd92025-02-05 16:39:18 -0800119 t.Parallel()
Paul Duffind19f8942021-07-14 12:08:37 +0100120 result := android.GroupFixturePreparers(
121 prepareForSdkTestWithJava,
122 android.FixtureWithRootAndroidBp(`
123 sdk {
124 name: "mysdk",
125 fake_members: ["myjavalib"],
126 }
127
128 java_library {
129 name: "myjavalib",
130 srcs: ["Test.java"],
131 system_modules: "none",
132 sdk_version: "none",
133 }
134 `),
135 ).RunTest(t)
136
137 CheckSnapshot(t, result, "mysdk", "",
Paul Duffinb01ac4b2022-05-24 20:10:05 +0000138 checkAndroidBpContents(`
Paul Duffind19f8942021-07-14 12:08:37 +0100139// This is auto-generated. DO NOT EDIT.
140
Spandan Dasa5e26d32024-03-06 14:04:36 +0000141apex_contributions_defaults {
142 name: "mysdk.contributions",
143 contents: ["prebuilt_myjavalib"],
144}
145
Paul Duffind19f8942021-07-14 12:08:37 +0100146java_import {
147 name: "myjavalib",
148 prefer: false,
149 visibility: ["//visibility:public"],
150 apex_available: ["//apex_available:platform"],
151 jars: ["javalibs/myjavalib.jar"],
152}
153`),
Paul Duffind19f8942021-07-14 12:08:37 +0100154 )
155}
156
157func TestBasicTrait_MultipleTraits(t *testing.T) {
Colin Crossaba8cd92025-02-05 16:39:18 -0800158 t.Parallel()
Paul Duffind19f8942021-07-14 12:08:37 +0100159 result := android.GroupFixturePreparers(
160 prepareForSdkTestWithJava,
161 android.FixtureWithRootAndroidBp(`
162 sdk {
163 name: "mysdk",
164 fake_members: ["myjavalib", "anotherjavalib"],
165 traits: {
166 extra: ["myjavalib"],
167 special: ["myjavalib", "anotherjavalib"],
168 },
169 }
170
171 java_library {
172 name: "myjavalib",
173 srcs: ["Test.java"],
174 system_modules: "none",
175 sdk_version: "none",
176 }
177
178 java_library {
179 name: "myjavalib_extra",
180 srcs: ["Test.java"],
181 system_modules: "none",
182 sdk_version: "none",
183 }
184
185 java_library {
186 name: "myjavalib_special",
187 srcs: ["Test.java"],
188 system_modules: "none",
189 sdk_version: "none",
190 }
191
192 java_library {
193 name: "anotherjavalib",
194 srcs: ["Test.java"],
195 system_modules: "none",
196 sdk_version: "none",
197 }
198
199 java_library {
200 name: "anotherjavalib_special",
201 srcs: ["Test.java"],
202 system_modules: "none",
203 sdk_version: "none",
204 }
205 `),
206 ).RunTest(t)
207
208 CheckSnapshot(t, result, "mysdk", "",
Paul Duffinb01ac4b2022-05-24 20:10:05 +0000209 checkAndroidBpContents(`
Paul Duffind19f8942021-07-14 12:08:37 +0100210// This is auto-generated. DO NOT EDIT.
211
Spandan Dasa5e26d32024-03-06 14:04:36 +0000212apex_contributions_defaults {
213 name: "mysdk.contributions",
214 contents: [
215 "prebuilt_myjavalib",
216 "prebuilt_myjavalib_extra",
217 "prebuilt_myjavalib_special",
218 "prebuilt_anotherjavalib",
219 "prebuilt_anotherjavalib_special",
220 ],
221}
222
Paul Duffind19f8942021-07-14 12:08:37 +0100223java_test_import {
224 name: "myjavalib",
225 prefer: false,
226 visibility: ["//visibility:public"],
227 apex_available: ["//apex_available:platform"],
228 jars: ["javalibs/myjavalib.jar"],
229}
230
231java_import {
232 name: "myjavalib_extra",
233 prefer: false,
234 visibility: ["//visibility:public"],
235 apex_available: ["//apex_available:platform"],
236 jars: ["javalibs/myjavalib_extra.jar"],
237}
238
239java_import {
240 name: "myjavalib_special",
241 prefer: false,
242 visibility: ["//visibility:public"],
243 apex_available: ["//apex_available:platform"],
244 jars: ["javalibs/myjavalib_special.jar"],
245}
246
247java_import {
248 name: "anotherjavalib",
249 prefer: false,
250 visibility: ["//visibility:public"],
251 apex_available: ["//apex_available:platform"],
252 jars: ["javalibs/anotherjavalib.jar"],
253}
254
255java_import {
256 name: "anotherjavalib_special",
257 prefer: false,
258 visibility: ["//visibility:public"],
259 apex_available: ["//apex_available:platform"],
260 jars: ["javalibs/anotherjavalib_special.jar"],
261}
262`),
263 )
264}
265
266func TestTraitUnsupportedByMemberType(t *testing.T) {
Colin Crossaba8cd92025-02-05 16:39:18 -0800267 t.Parallel()
Paul Duffind19f8942021-07-14 12:08:37 +0100268 android.GroupFixturePreparers(
269 prepareForSdkTestWithJava,
270 android.FixtureWithRootAndroidBp(`
271 sdk {
272 name: "mysdk",
273 java_header_libs: ["myjavalib"],
274 traits: {
275 extra: ["myjavalib"],
276 },
277 }
278
279 java_library {
280 name: "myjavalib",
281 srcs: ["Test.java"],
282 system_modules: "none",
283 sdk_version: "none",
284 }
285 `),
286 ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
287 `\Qsdk member "myjavalib" has traits [extra] that are unsupported by its member type "java_header_libs"\E`)).
288 RunTest(t)
289}