platform_build_soong/sdk/sdk_test.go
Jooyung Han b8fa86ad6f Fix apex_available
Checking apex_available was missing some corner cases.
For example, the deps of share deps of cc_library modules are missed
while those from cc_library_shared are correctly tracked.

This was due to..

* calling DepIsInSameApex in WalkDeps: both work fine separately, but
when they are used together, it fails to work. It's due to how WalkDeps
works. (We might fix this bug too risky since it is used very widely)
* incorrect receiver for DepIsInSameApex in apex_deps mutator: receiver
is supposed to be parent, but child was used before. Interestingly lots
of deps are within the same group of module types(cc to cc, java to
java), it has worked. (note that receiver's DepIsInSameApex
implementation can be different).

This change fixes them by..

* walkPayloadDeps is now relying on ApexVariation, which is calculated
correctly by TopDown apex_deps mutator.
* use correct receiver for DepIsInSameApex in apex_deps mutator, which
requires for java.SdkLibrary to override the method and for
java.Library/Import to use passed dep instead of receiver to check its
membership of sdk.

Exempt-From-Owner-Approval: cherry-pick from aosp/master

Bug: 151071238
Test: build/boot
Merged-In: I0569ef4bb8e79635e4d97a89f421a8d8b7d26456
(cherry picked from commit 5e9013be22)
Change-Id: I0569ef4bb8e79635e4d97a89f421a8d8b7d26456
2020-03-11 16:38:21 +09:00

208 lines
4.5 KiB
Go

// Copyright 2019 Google Inc. All rights reserved.
//
// 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 (
"testing"
)
// Needed in an _test.go file in this package to ensure tests run correctly, particularly in IDE.
func TestMain(m *testing.M) {
runTestWithBuildDir(m)
}
func TestDepNotInRequiredSdks(t *testing.T) {
testSdkError(t, `module "myjavalib".*depends on "otherlib".*that isn't part of the required SDKs:.*`, `
sdk {
name: "mysdk",
java_header_libs: ["sdkmember"],
}
sdk_snapshot {
name: "mysdk@1",
java_header_libs: ["sdkmember_mysdk_1"],
}
java_import {
name: "sdkmember",
prefer: false,
host_supported: true,
}
java_import {
name: "sdkmember_mysdk_1",
sdk_member_name: "sdkmember",
host_supported: true,
}
java_library {
name: "myjavalib",
srcs: ["Test.java"],
libs: [
"sdkmember",
"otherlib",
],
system_modules: "none",
sdk_version: "none",
compile_dex: true,
host_supported: true,
apex_available: ["myapex"],
}
// this lib is no in mysdk
java_library {
name: "otherlib",
srcs: ["Test.java"],
system_modules: "none",
sdk_version: "none",
compile_dex: true,
host_supported: true,
}
apex {
name: "myapex",
java_libs: ["myjavalib"],
uses_sdks: ["mysdk@1"],
key: "myapex.key",
certificate: ":myapex.cert",
}
`)
}
// Ensure that prebuilt modules have the same effective visibility as the source
// modules.
func TestSnapshotVisibility(t *testing.T) {
packageBp := `
package {
default_visibility: ["//other/foo"],
}
sdk {
name: "mysdk",
visibility: [
"//other/foo",
// This short form will be replaced with //package:__subpackages__ in the
// generated sdk_snapshot.
":__subpackages__",
],
java_header_libs: [
"myjavalib",
"mypublicjavalib",
"mydefaultedjavalib",
],
}
java_library {
name: "myjavalib",
// Uses package default visibility
srcs: ["Test.java"],
system_modules: "none",
sdk_version: "none",
}
java_defaults {
name: "java-defaults",
visibility: ["//other/bar"],
}
java_library {
name: "mypublicjavalib",
defaults: ["java-defaults"],
visibility: ["//visibility:public"],
srcs: ["Test.java"],
system_modules: "none",
sdk_version: "none",
}
java_defaults {
name: "myjavadefaults",
visibility: ["//other/bar"],
}
java_library {
name: "mydefaultedjavalib",
defaults: ["myjavadefaults"],
srcs: ["Test.java"],
system_modules: "none",
sdk_version: "none",
}
`
result := testSdkWithFs(t, ``,
map[string][]byte{
"package/Test.java": nil,
"package/Android.bp": []byte(packageBp),
})
result.CheckSnapshot("mysdk", "android_common", "package",
checkAndroidBpContents(`
// This is auto-generated. DO NOT EDIT.
java_import {
name: "mysdk_myjavalib@current",
sdk_member_name: "myjavalib",
visibility: ["//other/foo:__pkg__"],
jars: ["java/myjavalib.jar"],
}
java_import {
name: "myjavalib",
prefer: false,
visibility: ["//other/foo:__pkg__"],
jars: ["java/myjavalib.jar"],
}
java_import {
name: "mysdk_mypublicjavalib@current",
sdk_member_name: "mypublicjavalib",
visibility: ["//visibility:public"],
jars: ["java/mypublicjavalib.jar"],
}
java_import {
name: "mypublicjavalib",
prefer: false,
visibility: ["//visibility:public"],
jars: ["java/mypublicjavalib.jar"],
}
java_import {
name: "mysdk_mydefaultedjavalib@current",
sdk_member_name: "mydefaultedjavalib",
visibility: ["//other/bar:__pkg__"],
jars: ["java/mydefaultedjavalib.jar"],
}
java_import {
name: "mydefaultedjavalib",
prefer: false,
visibility: ["//other/bar:__pkg__"],
jars: ["java/mydefaultedjavalib.jar"],
}
sdk_snapshot {
name: "mysdk@current",
visibility: [
"//other/foo:__pkg__",
"//package:__subpackages__",
],
java_header_libs: [
"mysdk_myjavalib@current",
"mysdk_mypublicjavalib@current",
"mysdk_mydefaultedjavalib@current",
],
}
`))
}