// Copyright (C) 2021 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package sdk import ( "fmt" "path/filepath" "testing" "android/soong/android" "android/soong/java" "github.com/google/blueprint" ) type fakeMemberTrait struct { android.SdkMemberTraitBase } type fakeMemberType struct { android.SdkMemberTypeBase } func (t *fakeMemberType) AddDependencies(ctx android.SdkDependencyContext, dependencyTag blueprint.DependencyTag, names []string) { for _, name := range names { ctx.AddVariationDependencies(nil, dependencyTag, name) if ctx.RequiresTrait(name, extraTrait) { ctx.AddVariationDependencies(nil, dependencyTag, name+"_extra") } if ctx.RequiresTrait(name, specialTrait) { ctx.AddVariationDependencies(nil, dependencyTag, name+"_special") } } } func (t *fakeMemberType) IsInstance(module android.Module) bool { return true } func (t *fakeMemberType) AddPrebuiltModule(ctx android.SdkMemberContext, member android.SdkMember) android.BpModule { moduleType := "java_import" if ctx.RequiresTrait(extraTrait) { moduleType = "java_test_import" } return ctx.SnapshotBuilder().AddPrebuiltModule(member, moduleType) } func (t *fakeMemberType) CreateVariantPropertiesStruct() android.SdkMemberProperties { return &fakeMemberTypeProperties{} } type fakeMemberTypeProperties struct { android.SdkMemberPropertiesBase path android.Path } func (t *fakeMemberTypeProperties) PopulateFromVariant(ctx android.SdkMemberContext, variant android.Module) { headerJars := variant.(java.ApexDependency).HeaderJars() if len(headerJars) != 1 { panic(fmt.Errorf("there must be only one header jar from %q", variant.Name())) } t.path = headerJars[0] } func (t *fakeMemberTypeProperties) AddToPropertySet(ctx android.SdkMemberContext, propertySet android.BpPropertySet) { if t.path != nil { relative := filepath.Join("javalibs", t.path.Base()) ctx.SnapshotBuilder().CopyToSnapshot(t.path, relative) propertySet.AddProperty("jars", []string{relative}) } } var ( extraTrait = &fakeMemberTrait{ SdkMemberTraitBase: android.SdkMemberTraitBase{ PropertyName: "extra", }, } specialTrait = &fakeMemberTrait{ SdkMemberTraitBase: android.SdkMemberTraitBase{ PropertyName: "special", }, } fakeType = &fakeMemberType{ SdkMemberTypeBase: android.SdkMemberTypeBase{ PropertyName: "fake_members", SupportsSdk: true, Traits: []android.SdkMemberTrait{ extraTrait, specialTrait, }, }, } ) func init() { android.RegisterSdkMemberTrait(extraTrait) android.RegisterSdkMemberTrait(specialTrait) android.RegisterSdkMemberType(fakeType) } func TestBasicTrait_WithoutTrait(t *testing.T) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureWithRootAndroidBp(` sdk { name: "mysdk", fake_members: ["myjavalib"], } java_library { name: "myjavalib", srcs: ["Test.java"], system_modules: "none", sdk_version: "none", } `), ).RunTest(t) CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_import { name: "myjavalib", prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], jars: ["javalibs/myjavalib.jar"], } `), ) } func TestBasicTrait_MultipleTraits(t *testing.T) { result := android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureWithRootAndroidBp(` sdk { name: "mysdk", fake_members: ["myjavalib", "anotherjavalib"], traits: { extra: ["myjavalib"], special: ["myjavalib", "anotherjavalib"], }, } java_library { name: "myjavalib", srcs: ["Test.java"], system_modules: "none", sdk_version: "none", } java_library { name: "myjavalib_extra", srcs: ["Test.java"], system_modules: "none", sdk_version: "none", } java_library { name: "myjavalib_special", srcs: ["Test.java"], system_modules: "none", sdk_version: "none", } java_library { name: "anotherjavalib", srcs: ["Test.java"], system_modules: "none", sdk_version: "none", } java_library { name: "anotherjavalib_special", srcs: ["Test.java"], system_modules: "none", sdk_version: "none", } `), ).RunTest(t) CheckSnapshot(t, result, "mysdk", "", checkAndroidBpContents(` // This is auto-generated. DO NOT EDIT. java_test_import { name: "myjavalib", prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], jars: ["javalibs/myjavalib.jar"], } java_import { name: "myjavalib_extra", prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], jars: ["javalibs/myjavalib_extra.jar"], } java_import { name: "myjavalib_special", prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], jars: ["javalibs/myjavalib_special.jar"], } java_import { name: "anotherjavalib", prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], jars: ["javalibs/anotherjavalib.jar"], } java_import { name: "anotherjavalib_special", prefer: false, visibility: ["//visibility:public"], apex_available: ["//apex_available:platform"], jars: ["javalibs/anotherjavalib_special.jar"], } `), ) } func TestTraitUnsupportedByMemberType(t *testing.T) { android.GroupFixturePreparers( prepareForSdkTestWithJava, android.FixtureWithRootAndroidBp(` sdk { name: "mysdk", java_header_libs: ["myjavalib"], traits: { extra: ["myjavalib"], }, } java_library { name: "myjavalib", srcs: ["Test.java"], system_modules: "none", sdk_version: "none", } `), ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( `\Qsdk member "myjavalib" has traits [extra] that are unsupported by its member type "java_header_libs"\E`)). RunTest(t) }