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