xref: /aosp_15_r20/build/soong/sdk/member_trait_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
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
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", "",
137		checkAndroidBpContents(`
138// This is auto-generated. DO NOT EDIT.
139
140apex_contributions_defaults {
141    name: "mysdk.contributions",
142    contents: ["prebuilt_myjavalib"],
143}
144
145java_import {
146    name: "myjavalib",
147    prefer: false,
148    visibility: ["//visibility:public"],
149    apex_available: ["//apex_available:platform"],
150    jars: ["javalibs/myjavalib.jar"],
151}
152`),
153	)
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", "",
207		checkAndroidBpContents(`
208// This is auto-generated. DO NOT EDIT.
209
210apex_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
221java_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}
287