Add test to TestJavaStableSdkVersion for legacy core platform

Adds a test case to TestJavaStableSdkVersion for the case where a
module uses sdk_version: "core_platform" but is in the list of modules
that can use the legacy version.

This required storing the lookup map in the Config to allow it to be
customized for the test.

Bug: 180399951
Test: m nothing
Change-Id: I404705c3fd8a559649c6ab2624856cf78f49f85c
This commit is contained in:
Paul Duffin 2021-03-15 09:39:13 +00:00
parent 05732954c6
commit 1ea7c9fa52
4 changed files with 76 additions and 11 deletions

View file

@ -2187,6 +2187,7 @@ func TestJavaStableSdkVersion(t *testing.T) {
name string name string
expectedError string expectedError string
bp string bp string
preparer android.FixturePreparer
}{ }{
{ {
name: "Non-updatable apex with non-stable dep", name: "Non-updatable apex with non-stable dep",
@ -2257,6 +2258,30 @@ func TestJavaStableSdkVersion(t *testing.T) {
} }
`, `,
}, },
{
name: "Updatable apex with non-stable legacy core platform dep",
expectedError: `\Qcannot depend on "myjar-uses-legacy": non stable SDK core_platform_current - uses legacy core platform\E`,
bp: `
apex {
name: "myapex",
java_libs: ["myjar-uses-legacy"],
key: "myapex.key",
updatable: true,
}
apex_key {
name: "myapex.key",
public_key: "testkey.avbpubkey",
private_key: "testkey.pem",
}
java_library {
name: "myjar-uses-legacy",
srcs: ["foo/bar/MyClass.java"],
sdk_version: "core_platform",
apex_available: ["myapex"],
}
`,
preparer: java.FixtureUseLegacyCorePlatformApi("myjar-uses-legacy"),
},
{ {
name: "Updatable apex with non-stable transitive dep", name: "Updatable apex with non-stable transitive dep",
// This is not actually detecting that the transitive dependency is unstable, rather it is // This is not actually detecting that the transitive dependency is unstable, rather it is
@ -2293,12 +2318,22 @@ func TestJavaStableSdkVersion(t *testing.T) {
} }
for _, test := range testCases { for _, test := range testCases {
if test.name != "Updatable apex with non-stable legacy core platform dep" {
continue
}
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
if test.expectedError == "" { errorHandler := android.FixtureExpectsNoErrors
testApex(t, test.bp) if test.expectedError != "" {
} else { errorHandler = android.FixtureExpectsAtLeastOneErrorMatchingPattern(test.expectedError)
testApexError(t, test.expectedError, test.bp)
} }
android.GroupFixturePreparers(
java.PrepareForTestWithJavaDefaultModules,
PrepareForTestWithApexBuildComponents,
prepareForTestWithMyapex,
android.OptionalFixturePreparer(test.preparer),
).
ExtendWithErrorHandler(errorHandler).
RunTestWithBp(t, test.bp)
}) })
} }
} }

View file

@ -382,7 +382,7 @@ func (j *Module) CheckStableSdkVersion(ctx android.BaseModuleContext) error {
return nil return nil
} }
if sdkVersion.Kind == android.SdkCorePlatform { if sdkVersion.Kind == android.SdkCorePlatform {
if useLegacyCorePlatformApiByName(j.BaseModuleName()) { if useLegacyCorePlatformApi(ctx, j.BaseModuleName()) {
return fmt.Errorf("non stable SDK %v - uses legacy core platform", sdkVersion) return fmt.Errorf("non stable SDK %v - uses legacy core platform", sdkVersion)
} else { } else {
// Treat stable core platform as stable. // Treat stable core platform as stable.

View file

@ -163,17 +163,27 @@ func init() {
} }
} }
func useLegacyCorePlatformApi(ctx android.EarlyModuleContext) bool { var legacyCorePlatformApiLookupKey = android.NewOnceKey("legacyCorePlatformApiLookup")
return useLegacyCorePlatformApiByName(ctx.ModuleName())
func getLegacyCorePlatformApiLookup(config android.Config) map[string]struct{} {
return config.Once(legacyCorePlatformApiLookupKey, func() interface{} {
return legacyCorePlatformApiLookup
}).(map[string]struct{})
} }
func useLegacyCorePlatformApiByName(name string) bool { // useLegacyCorePlatformApi checks to see whether the supplied module name is in the list of modules
_, found := legacyCorePlatformApiLookup[name] // that are able to use the legacy core platform API and returns true if it does, false otherwise.
//
// This method takes the module name separately from the context as this may be being called for a
// module that is not the target of the supplied context.
func useLegacyCorePlatformApi(ctx android.EarlyModuleContext, moduleName string) bool {
lookup := getLegacyCorePlatformApiLookup(ctx.Config())
_, found := lookup[moduleName]
return found return found
} }
func corePlatformSystemModules(ctx android.EarlyModuleContext) string { func corePlatformSystemModules(ctx android.EarlyModuleContext) string {
if useLegacyCorePlatformApi(ctx) { if useLegacyCorePlatformApi(ctx, ctx.ModuleName()) {
return config.LegacyCorePlatformSystemModules return config.LegacyCorePlatformSystemModules
} else { } else {
return config.StableCorePlatformSystemModules return config.StableCorePlatformSystemModules
@ -181,7 +191,7 @@ func corePlatformSystemModules(ctx android.EarlyModuleContext) string {
} }
func corePlatformBootclasspathLibraries(ctx android.EarlyModuleContext) []string { func corePlatformBootclasspathLibraries(ctx android.EarlyModuleContext) []string {
if useLegacyCorePlatformApi(ctx) { if useLegacyCorePlatformApi(ctx, ctx.ModuleName()) {
return config.LegacyCorePlatformBootclasspathLibraries return config.LegacyCorePlatformBootclasspathLibraries
} else { } else {
return config.StableCorePlatformBootclasspathLibraries return config.StableCorePlatformBootclasspathLibraries

View file

@ -229,6 +229,26 @@ func FixtureConfigureApexBootJars(bootJars ...string) android.FixturePreparer {
) )
} }
// FixtureUseLegacyCorePlatformApi prepares the fixture by setting the exception list of those
// modules that are allowed to use the legacy core platform API to be the ones supplied.
func FixtureUseLegacyCorePlatformApi(moduleNames ...string) android.FixturePreparer {
lookup := make(map[string]struct{})
for _, moduleName := range moduleNames {
lookup[moduleName] = struct{}{}
}
return android.FixtureModifyConfig(func(config android.Config) {
// Try and set the legacyCorePlatformApiLookup in the config, the returned value will be the
// actual value that is set.
cached := config.Once(legacyCorePlatformApiLookupKey, func() interface{} {
return lookup
})
// Make sure that the cached value is the one we need.
if !reflect.DeepEqual(cached, lookup) {
panic(fmt.Errorf("attempting to set legacyCorePlatformApiLookupKey to %q but it has already been set to %q", lookup, cached))
}
})
}
// registerRequiredBuildComponentsForTest registers the build components used by // registerRequiredBuildComponentsForTest registers the build components used by
// PrepareForTestWithJavaDefaultModules. // PrepareForTestWithJavaDefaultModules.
// //