blob: 99caf13e32e93253285a7d7a9c2c2ce6c6124eb7 [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
140java_import {
141 name: "myjavalib",
142 prefer: false,
143 visibility: ["//visibility:public"],
144 apex_available: ["//apex_available:platform"],
145 jars: ["javalibs/myjavalib.jar"],
146}
147`),
Paul Duffind19f8942021-07-14 12:08:37 +0100148 )
149}
150
151func TestBasicTrait_MultipleTraits(t *testing.T) {
152 result := android.GroupFixturePreparers(
153 prepareForSdkTestWithJava,
154 android.FixtureWithRootAndroidBp(`
155 sdk {
156 name: "mysdk",
157 fake_members: ["myjavalib", "anotherjavalib"],
158 traits: {
159 extra: ["myjavalib"],
160 special: ["myjavalib", "anotherjavalib"],
161 },
162 }
163
164 java_library {
165 name: "myjavalib",
166 srcs: ["Test.java"],
167 system_modules: "none",
168 sdk_version: "none",
169 }
170
171 java_library {
172 name: "myjavalib_extra",
173 srcs: ["Test.java"],
174 system_modules: "none",
175 sdk_version: "none",
176 }
177
178 java_library {
179 name: "myjavalib_special",
180 srcs: ["Test.java"],
181 system_modules: "none",
182 sdk_version: "none",
183 }
184
185 java_library {
186 name: "anotherjavalib",
187 srcs: ["Test.java"],
188 system_modules: "none",
189 sdk_version: "none",
190 }
191
192 java_library {
193 name: "anotherjavalib_special",
194 srcs: ["Test.java"],
195 system_modules: "none",
196 sdk_version: "none",
197 }
198 `),
199 ).RunTest(t)
200
201 CheckSnapshot(t, result, "mysdk", "",
Paul Duffinb01ac4b2022-05-24 20:10:05 +0000202 checkAndroidBpContents(`
Paul Duffind19f8942021-07-14 12:08:37 +0100203// This is auto-generated. DO NOT EDIT.
204
205java_test_import {
206 name: "myjavalib",
207 prefer: false,
208 visibility: ["//visibility:public"],
209 apex_available: ["//apex_available:platform"],
210 jars: ["javalibs/myjavalib.jar"],
211}
212
213java_import {
214 name: "myjavalib_extra",
215 prefer: false,
216 visibility: ["//visibility:public"],
217 apex_available: ["//apex_available:platform"],
218 jars: ["javalibs/myjavalib_extra.jar"],
219}
220
221java_import {
222 name: "myjavalib_special",
223 prefer: false,
224 visibility: ["//visibility:public"],
225 apex_available: ["//apex_available:platform"],
226 jars: ["javalibs/myjavalib_special.jar"],
227}
228
229java_import {
230 name: "anotherjavalib",
231 prefer: false,
232 visibility: ["//visibility:public"],
233 apex_available: ["//apex_available:platform"],
234 jars: ["javalibs/anotherjavalib.jar"],
235}
236
237java_import {
238 name: "anotherjavalib_special",
239 prefer: false,
240 visibility: ["//visibility:public"],
241 apex_available: ["//apex_available:platform"],
242 jars: ["javalibs/anotherjavalib_special.jar"],
243}
244`),
245 )
246}
247
248func TestTraitUnsupportedByMemberType(t *testing.T) {
249 android.GroupFixturePreparers(
250 prepareForSdkTestWithJava,
251 android.FixtureWithRootAndroidBp(`
252 sdk {
253 name: "mysdk",
254 java_header_libs: ["myjavalib"],
255 traits: {
256 extra: ["myjavalib"],
257 },
258 }
259
260 java_library {
261 name: "myjavalib",
262 srcs: ["Test.java"],
263 system_modules: "none",
264 sdk_version: "none",
265 }
266 `),
267 ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
268 `\Qsdk member "myjavalib" has traits [extra] that are unsupported by its member type "java_header_libs"\E`)).
269 RunTest(t)
270}