• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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	t.Parallel()
120	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", "",
138		checkAndroidBpContents(`
139// This is auto-generated. DO NOT EDIT.
140
141apex_contributions_defaults {
142    name: "mysdk.contributions",
143    contents: ["prebuilt_myjavalib"],
144}
145
146java_import {
147    name: "myjavalib",
148    prefer: false,
149    visibility: ["//visibility:public"],
150    apex_available: ["//apex_available:platform"],
151    jars: ["javalibs/myjavalib.jar"],
152}
153`),
154	)
155}
156
157func TestBasicTrait_MultipleTraits(t *testing.T) {
158	t.Parallel()
159	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", "",
209		checkAndroidBpContents(`
210// This is auto-generated. DO NOT EDIT.
211
212apex_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
223java_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) {
267	t.Parallel()
268	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}
290