• 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	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
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`),
148	)
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", "",
202		checkAndroidBpContents(`
203// 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}
271