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