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