xref: /aosp_15_r20/build/soong/sdk/member_trait_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright (C) 2021 The Android Open Source Project
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage sdk
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"fmt"
19*333d2b36SAndroid Build Coastguard Worker	"path/filepath"
20*333d2b36SAndroid Build Coastguard Worker	"testing"
21*333d2b36SAndroid Build Coastguard Worker
22*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
23*333d2b36SAndroid Build Coastguard Worker	"android/soong/java"
24*333d2b36SAndroid Build Coastguard Worker	"github.com/google/blueprint"
25*333d2b36SAndroid Build Coastguard Worker)
26*333d2b36SAndroid Build Coastguard Worker
27*333d2b36SAndroid Build Coastguard Workertype fakeMemberTrait struct {
28*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberTraitBase
29*333d2b36SAndroid Build Coastguard Worker}
30*333d2b36SAndroid Build Coastguard Worker
31*333d2b36SAndroid Build Coastguard Workertype fakeMemberType struct {
32*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberTypeBase
33*333d2b36SAndroid Build Coastguard Worker}
34*333d2b36SAndroid Build Coastguard Worker
35*333d2b36SAndroid Build Coastguard Workerfunc (t *fakeMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) {
36*333d2b36SAndroid Build Coastguard Worker	for _, name := range names {
37*333d2b36SAndroid Build Coastguard Worker		ctx.AddVariationDependencies(nil, dependencyTag, name)
38*333d2b36SAndroid Build Coastguard Worker
39*333d2b36SAndroid Build Coastguard Worker		if ctx.RequiresTrait(name, extraTrait) {
40*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, dependencyTag, name+"_extra")
41*333d2b36SAndroid Build Coastguard Worker		}
42*333d2b36SAndroid Build Coastguard Worker		if ctx.RequiresTrait(name, specialTrait) {
43*333d2b36SAndroid Build Coastguard Worker			ctx.AddVariationDependencies(nil, dependencyTag, name+"_special")
44*333d2b36SAndroid Build Coastguard Worker		}
45*333d2b36SAndroid Build Coastguard Worker	}
46*333d2b36SAndroid Build Coastguard Worker}
47*333d2b36SAndroid Build Coastguard Worker
48*333d2b36SAndroid Build Coastguard Workerfunc (t *fakeMemberType) IsInstance(module android.Module) bool {
49*333d2b36SAndroid Build Coastguard Worker	return true
50*333d2b36SAndroid Build Coastguard Worker}
51*333d2b36SAndroid Build Coastguard Worker
52*333d2b36SAndroid Build Coastguard Workerfunc (t *fakeMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule {
53*333d2b36SAndroid Build Coastguard Worker	moduleType := "java_import"
54*333d2b36SAndroid Build Coastguard Worker	if ctx.RequiresTrait(extraTrait) {
55*333d2b36SAndroid Build Coastguard Worker		moduleType = "java_test_import"
56*333d2b36SAndroid Build Coastguard Worker	}
57*333d2b36SAndroid Build Coastguard Worker	return ctx.SnapshotBuilder().AddPrebuiltModule(member, moduleType)
58*333d2b36SAndroid Build Coastguard Worker}
59*333d2b36SAndroid Build Coastguard Worker
60*333d2b36SAndroid Build Coastguard Workerfunc (t *fakeMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties {
61*333d2b36SAndroid Build Coastguard Worker	return &fakeMemberTypeProperties{}
62*333d2b36SAndroid Build Coastguard Worker}
63*333d2b36SAndroid Build Coastguard Worker
64*333d2b36SAndroid Build Coastguard Workertype fakeMemberTypeProperties struct {
65*333d2b36SAndroid Build Coastguard Worker	android.SdkMemberPropertiesBase
66*333d2b36SAndroid Build Coastguard Worker
67*333d2b36SAndroid Build Coastguard Worker	path android.Path
68*333d2b36SAndroid Build Coastguard Worker}
69*333d2b36SAndroid Build Coastguard Worker
70*333d2b36SAndroid Build Coastguard Workerfunc (t *fakeMemberTypeProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) {
71*333d2b36SAndroid Build Coastguard Worker	headerJars := variant.(java.ApexDependency).HeaderJars()
72*333d2b36SAndroid Build Coastguard Worker	if len(headerJars) != 1 {
73*333d2b36SAndroid Build Coastguard Worker		panic(fmt.Errorf("there must be only one header jar from %q", variant.Name()))
74*333d2b36SAndroid Build Coastguard Worker	}
75*333d2b36SAndroid Build Coastguard Worker
76*333d2b36SAndroid Build Coastguard Worker	t.path = headerJars[0]
77*333d2b36SAndroid Build Coastguard Worker}
78*333d2b36SAndroid Build Coastguard Worker
79*333d2b36SAndroid Build Coastguard Workerfunc (t *fakeMemberTypeProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) {
80*333d2b36SAndroid Build Coastguard Worker	if t.path != nil {
81*333d2b36SAndroid Build Coastguard Worker		relative := filepath.Join("javalibs", t.path.Base())
82*333d2b36SAndroid Build Coastguard Worker		ctx.SnapshotBuilder().CopyToSnapshot(t.path, relative)
83*333d2b36SAndroid Build Coastguard Worker		propertySet.AddProperty("jars", []string{relative})
84*333d2b36SAndroid Build Coastguard Worker	}
85*333d2b36SAndroid Build Coastguard Worker}
86*333d2b36SAndroid Build Coastguard Worker
87*333d2b36SAndroid Build Coastguard Workervar (
88*333d2b36SAndroid Build Coastguard Worker	extraTrait = &fakeMemberTrait{
89*333d2b36SAndroid Build Coastguard Worker		SdkMemberTraitBase: android.SdkMemberTraitBase{
90*333d2b36SAndroid Build Coastguard Worker			PropertyName: "extra",
91*333d2b36SAndroid Build Coastguard Worker		},
92*333d2b36SAndroid Build Coastguard Worker	}
93*333d2b36SAndroid Build Coastguard Worker
94*333d2b36SAndroid Build Coastguard Worker	specialTrait = &fakeMemberTrait{
95*333d2b36SAndroid Build Coastguard Worker		SdkMemberTraitBase: android.SdkMemberTraitBase{
96*333d2b36SAndroid Build Coastguard Worker			PropertyName: "special",
97*333d2b36SAndroid Build Coastguard Worker		},
98*333d2b36SAndroid Build Coastguard Worker	}
99*333d2b36SAndroid Build Coastguard Worker
100*333d2b36SAndroid Build Coastguard Worker	fakeType = &fakeMemberType{
101*333d2b36SAndroid Build Coastguard Worker		SdkMemberTypeBase: android.SdkMemberTypeBase{
102*333d2b36SAndroid Build Coastguard Worker			PropertyName: "fake_members",
103*333d2b36SAndroid Build Coastguard Worker			SupportsSdk:  true,
104*333d2b36SAndroid Build Coastguard Worker			Traits: []android.SdkMemberTrait{
105*333d2b36SAndroid Build Coastguard Worker				extraTrait,
106*333d2b36SAndroid Build Coastguard Worker				specialTrait,
107*333d2b36SAndroid Build Coastguard Worker			},
108*333d2b36SAndroid Build Coastguard Worker		},
109*333d2b36SAndroid Build Coastguard Worker	}
110*333d2b36SAndroid Build Coastguard Worker)
111*333d2b36SAndroid Build Coastguard Worker
112*333d2b36SAndroid Build Coastguard Workerfunc init() {
113*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberTrait(extraTrait)
114*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberTrait(specialTrait)
115*333d2b36SAndroid Build Coastguard Worker	android.RegisterSdkMemberType(fakeType)
116*333d2b36SAndroid Build Coastguard Worker}
117*333d2b36SAndroid Build Coastguard Worker
118*333d2b36SAndroid Build Coastguard Workerfunc TestBasicTrait_WithoutTrait(t *testing.T) {
119*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
120*333d2b36SAndroid Build Coastguard Worker		prepareForSdkTestWithJava,
121*333d2b36SAndroid Build Coastguard Worker		android.FixtureWithRootAndroidBp(`
122*333d2b36SAndroid Build Coastguard Worker			sdk {
123*333d2b36SAndroid Build Coastguard Worker				name: "mysdk",
124*333d2b36SAndroid Build Coastguard Worker				fake_members: ["myjavalib"],
125*333d2b36SAndroid Build Coastguard Worker			}
126*333d2b36SAndroid Build Coastguard Worker
127*333d2b36SAndroid Build Coastguard Worker			java_library {
128*333d2b36SAndroid Build Coastguard Worker				name: "myjavalib",
129*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
130*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
131*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
132*333d2b36SAndroid Build Coastguard Worker			}
133*333d2b36SAndroid Build Coastguard Worker		`),
134*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
135*333d2b36SAndroid Build Coastguard Worker
136*333d2b36SAndroid Build Coastguard Worker	CheckSnapshot(t, result, "mysdk", "",
137*333d2b36SAndroid Build Coastguard Worker		checkAndroidBpContents(`
138*333d2b36SAndroid Build Coastguard Worker// This is auto-generated. DO NOT EDIT.
139*333d2b36SAndroid Build Coastguard Worker
140*333d2b36SAndroid Build Coastguard Workerapex_contributions_defaults {
141*333d2b36SAndroid Build Coastguard Worker    name: "mysdk.contributions",
142*333d2b36SAndroid Build Coastguard Worker    contents: ["prebuilt_myjavalib"],
143*333d2b36SAndroid Build Coastguard Worker}
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Workerjava_import {
146*333d2b36SAndroid Build Coastguard Worker    name: "myjavalib",
147*333d2b36SAndroid Build Coastguard Worker    prefer: false,
148*333d2b36SAndroid Build Coastguard Worker    visibility: ["//visibility:public"],
149*333d2b36SAndroid Build Coastguard Worker    apex_available: ["//apex_available:platform"],
150*333d2b36SAndroid Build Coastguard Worker    jars: ["javalibs/myjavalib.jar"],
151*333d2b36SAndroid Build Coastguard Worker}
152*333d2b36SAndroid Build Coastguard Worker`),
153*333d2b36SAndroid Build Coastguard Worker	)
154*333d2b36SAndroid Build Coastguard Worker}
155*333d2b36SAndroid Build Coastguard Worker
156*333d2b36SAndroid Build Coastguard Workerfunc TestBasicTrait_MultipleTraits(t *testing.T) {
157*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
158*333d2b36SAndroid Build Coastguard Worker		prepareForSdkTestWithJava,
159*333d2b36SAndroid Build Coastguard Worker		android.FixtureWithRootAndroidBp(`
160*333d2b36SAndroid Build Coastguard Worker			sdk {
161*333d2b36SAndroid Build Coastguard Worker				name: "mysdk",
162*333d2b36SAndroid Build Coastguard Worker				fake_members: ["myjavalib", "anotherjavalib"],
163*333d2b36SAndroid Build Coastguard Worker				traits: {
164*333d2b36SAndroid Build Coastguard Worker					extra: ["myjavalib"],
165*333d2b36SAndroid Build Coastguard Worker					special: ["myjavalib", "anotherjavalib"],
166*333d2b36SAndroid Build Coastguard Worker				},
167*333d2b36SAndroid Build Coastguard Worker			}
168*333d2b36SAndroid Build Coastguard Worker
169*333d2b36SAndroid Build Coastguard Worker			java_library {
170*333d2b36SAndroid Build Coastguard Worker				name: "myjavalib",
171*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
172*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
173*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
174*333d2b36SAndroid Build Coastguard Worker			}
175*333d2b36SAndroid Build Coastguard Worker
176*333d2b36SAndroid Build Coastguard Worker			java_library {
177*333d2b36SAndroid Build Coastguard Worker				name: "myjavalib_extra",
178*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
179*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
180*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
181*333d2b36SAndroid Build Coastguard Worker			}
182*333d2b36SAndroid Build Coastguard Worker
183*333d2b36SAndroid Build Coastguard Worker			java_library {
184*333d2b36SAndroid Build Coastguard Worker				name: "myjavalib_special",
185*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
186*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
187*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
188*333d2b36SAndroid Build Coastguard Worker			}
189*333d2b36SAndroid Build Coastguard Worker
190*333d2b36SAndroid Build Coastguard Worker			java_library {
191*333d2b36SAndroid Build Coastguard Worker				name: "anotherjavalib",
192*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
193*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
194*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
195*333d2b36SAndroid Build Coastguard Worker			}
196*333d2b36SAndroid Build Coastguard Worker
197*333d2b36SAndroid Build Coastguard Worker			java_library {
198*333d2b36SAndroid Build Coastguard Worker				name: "anotherjavalib_special",
199*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
200*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
201*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
202*333d2b36SAndroid Build Coastguard Worker			}
203*333d2b36SAndroid Build Coastguard Worker		`),
204*333d2b36SAndroid Build Coastguard Worker	).RunTest(t)
205*333d2b36SAndroid Build Coastguard Worker
206*333d2b36SAndroid Build Coastguard Worker	CheckSnapshot(t, result, "mysdk", "",
207*333d2b36SAndroid Build Coastguard Worker		checkAndroidBpContents(`
208*333d2b36SAndroid Build Coastguard Worker// This is auto-generated. DO NOT EDIT.
209*333d2b36SAndroid Build Coastguard Worker
210*333d2b36SAndroid Build Coastguard Workerapex_contributions_defaults {
211*333d2b36SAndroid Build Coastguard Worker    name: "mysdk.contributions",
212*333d2b36SAndroid Build Coastguard Worker    contents: [
213*333d2b36SAndroid Build Coastguard Worker        "prebuilt_myjavalib",
214*333d2b36SAndroid Build Coastguard Worker        "prebuilt_myjavalib_extra",
215*333d2b36SAndroid Build Coastguard Worker        "prebuilt_myjavalib_special",
216*333d2b36SAndroid Build Coastguard Worker        "prebuilt_anotherjavalib",
217*333d2b36SAndroid Build Coastguard Worker        "prebuilt_anotherjavalib_special",
218*333d2b36SAndroid Build Coastguard Worker    ],
219*333d2b36SAndroid Build Coastguard Worker}
220*333d2b36SAndroid Build Coastguard Worker
221*333d2b36SAndroid Build Coastguard Workerjava_test_import {
222*333d2b36SAndroid Build Coastguard Worker    name: "myjavalib",
223*333d2b36SAndroid Build Coastguard Worker    prefer: false,
224*333d2b36SAndroid Build Coastguard Worker    visibility: ["//visibility:public"],
225*333d2b36SAndroid Build Coastguard Worker    apex_available: ["//apex_available:platform"],
226*333d2b36SAndroid Build Coastguard Worker    jars: ["javalibs/myjavalib.jar"],
227*333d2b36SAndroid Build Coastguard Worker}
228*333d2b36SAndroid Build Coastguard Worker
229*333d2b36SAndroid Build Coastguard Workerjava_import {
230*333d2b36SAndroid Build Coastguard Worker    name: "myjavalib_extra",
231*333d2b36SAndroid Build Coastguard Worker    prefer: false,
232*333d2b36SAndroid Build Coastguard Worker    visibility: ["//visibility:public"],
233*333d2b36SAndroid Build Coastguard Worker    apex_available: ["//apex_available:platform"],
234*333d2b36SAndroid Build Coastguard Worker    jars: ["javalibs/myjavalib_extra.jar"],
235*333d2b36SAndroid Build Coastguard Worker}
236*333d2b36SAndroid Build Coastguard Worker
237*333d2b36SAndroid Build Coastguard Workerjava_import {
238*333d2b36SAndroid Build Coastguard Worker    name: "myjavalib_special",
239*333d2b36SAndroid Build Coastguard Worker    prefer: false,
240*333d2b36SAndroid Build Coastguard Worker    visibility: ["//visibility:public"],
241*333d2b36SAndroid Build Coastguard Worker    apex_available: ["//apex_available:platform"],
242*333d2b36SAndroid Build Coastguard Worker    jars: ["javalibs/myjavalib_special.jar"],
243*333d2b36SAndroid Build Coastguard Worker}
244*333d2b36SAndroid Build Coastguard Worker
245*333d2b36SAndroid Build Coastguard Workerjava_import {
246*333d2b36SAndroid Build Coastguard Worker    name: "anotherjavalib",
247*333d2b36SAndroid Build Coastguard Worker    prefer: false,
248*333d2b36SAndroid Build Coastguard Worker    visibility: ["//visibility:public"],
249*333d2b36SAndroid Build Coastguard Worker    apex_available: ["//apex_available:platform"],
250*333d2b36SAndroid Build Coastguard Worker    jars: ["javalibs/anotherjavalib.jar"],
251*333d2b36SAndroid Build Coastguard Worker}
252*333d2b36SAndroid Build Coastguard Worker
253*333d2b36SAndroid Build Coastguard Workerjava_import {
254*333d2b36SAndroid Build Coastguard Worker    name: "anotherjavalib_special",
255*333d2b36SAndroid Build Coastguard Worker    prefer: false,
256*333d2b36SAndroid Build Coastguard Worker    visibility: ["//visibility:public"],
257*333d2b36SAndroid Build Coastguard Worker    apex_available: ["//apex_available:platform"],
258*333d2b36SAndroid Build Coastguard Worker    jars: ["javalibs/anotherjavalib_special.jar"],
259*333d2b36SAndroid Build Coastguard Worker}
260*333d2b36SAndroid Build Coastguard Worker`),
261*333d2b36SAndroid Build Coastguard Worker	)
262*333d2b36SAndroid Build Coastguard Worker}
263*333d2b36SAndroid Build Coastguard Worker
264*333d2b36SAndroid Build Coastguard Workerfunc TestTraitUnsupportedByMemberType(t *testing.T) {
265*333d2b36SAndroid Build Coastguard Worker	android.GroupFixturePreparers(
266*333d2b36SAndroid Build Coastguard Worker		prepareForSdkTestWithJava,
267*333d2b36SAndroid Build Coastguard Worker		android.FixtureWithRootAndroidBp(`
268*333d2b36SAndroid Build Coastguard Worker			sdk {
269*333d2b36SAndroid Build Coastguard Worker				name: "mysdk",
270*333d2b36SAndroid Build Coastguard Worker				java_header_libs: ["myjavalib"],
271*333d2b36SAndroid Build Coastguard Worker				traits: {
272*333d2b36SAndroid Build Coastguard Worker					extra: ["myjavalib"],
273*333d2b36SAndroid Build Coastguard Worker				},
274*333d2b36SAndroid Build Coastguard Worker			}
275*333d2b36SAndroid Build Coastguard Worker
276*333d2b36SAndroid Build Coastguard Worker			java_library {
277*333d2b36SAndroid Build Coastguard Worker				name: "myjavalib",
278*333d2b36SAndroid Build Coastguard Worker				srcs: ["Test.java"],
279*333d2b36SAndroid Build Coastguard Worker				system_modules: "none",
280*333d2b36SAndroid Build Coastguard Worker				sdk_version: "none",
281*333d2b36SAndroid Build Coastguard Worker			}
282*333d2b36SAndroid Build Coastguard Worker		`),
283*333d2b36SAndroid Build Coastguard Worker	).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern(
284*333d2b36SAndroid Build Coastguard Worker		`\Qsdk member "myjavalib" has traits [extra] that are unsupported by its member type "java_header_libs"\E`)).
285*333d2b36SAndroid Build Coastguard Worker		RunTest(t)
286*333d2b36SAndroid Build Coastguard Worker}
287