1*333d2b36SAndroid Build Coastguard Worker// Copyright 2021 Google Inc. All rights reserved. 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 java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "sort" 19*333d2b36SAndroid Build Coastguard Worker "strings" 20*333d2b36SAndroid Build Coastguard Worker "testing" 21*333d2b36SAndroid Build Coastguard Worker 22*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint" 25*333d2b36SAndroid Build Coastguard Worker) 26*333d2b36SAndroid Build Coastguard Worker 27*333d2b36SAndroid Build Coastguard Workerfunc intPtr(v int) *int { 28*333d2b36SAndroid Build Coastguard Worker return &v 29*333d2b36SAndroid Build Coastguard Worker} 30*333d2b36SAndroid Build Coastguard Worker 31*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltApis_SystemModulesCreation(t *testing.T) { 32*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 33*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 34*333d2b36SAndroid Build Coastguard Worker FixtureWithPrebuiltApis(map[string][]string{ 35*333d2b36SAndroid Build Coastguard Worker "31": {}, 36*333d2b36SAndroid Build Coastguard Worker "32": {}, 37*333d2b36SAndroid Build Coastguard Worker "current": {}, 38*333d2b36SAndroid Build Coastguard Worker }), 39*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Worker sdkSystemModules := []string{} 42*333d2b36SAndroid Build Coastguard Worker result.VisitAllModules(func(module blueprint.Module) { 43*333d2b36SAndroid Build Coastguard Worker name := android.RemoveOptionalPrebuiltPrefix(module.Name()) 44*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(name, "sdk_") && strings.HasSuffix(name, "_system_modules") { 45*333d2b36SAndroid Build Coastguard Worker sdkSystemModules = append(sdkSystemModules, name) 46*333d2b36SAndroid Build Coastguard Worker } 47*333d2b36SAndroid Build Coastguard Worker }) 48*333d2b36SAndroid Build Coastguard Worker sort.Strings(sdkSystemModules) 49*333d2b36SAndroid Build Coastguard Worker expected := []string{ 50*333d2b36SAndroid Build Coastguard Worker // 31 only has public system modules. 51*333d2b36SAndroid Build Coastguard Worker "sdk_public_31_system_modules", 52*333d2b36SAndroid Build Coastguard Worker 53*333d2b36SAndroid Build Coastguard Worker // 32 and current both have public and module-lib system modules. 54*333d2b36SAndroid Build Coastguard Worker "sdk_public_32_system_modules", 55*333d2b36SAndroid Build Coastguard Worker "sdk_module-lib_32_system_modules", 56*333d2b36SAndroid Build Coastguard Worker "sdk_public_current_system_modules", 57*333d2b36SAndroid Build Coastguard Worker "sdk_module-lib_current_system_modules", 58*333d2b36SAndroid Build Coastguard Worker } 59*333d2b36SAndroid Build Coastguard Worker sort.Strings(expected) 60*333d2b36SAndroid Build Coastguard Worker android.AssertArrayString(t, "sdk system modules", expected, sdkSystemModules) 61*333d2b36SAndroid Build Coastguard Worker} 62*333d2b36SAndroid Build Coastguard Worker 63*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltApis_WithExtensions(t *testing.T) { 64*333d2b36SAndroid Build Coastguard Worker runTestWithBaseExtensionLevel := func(v int) (foo_input, bar_input, baz_input string) { 65*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 66*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 67*333d2b36SAndroid Build Coastguard Worker android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { 68*333d2b36SAndroid Build Coastguard Worker variables.Platform_base_sdk_extension_version = intPtr(v) 69*333d2b36SAndroid Build Coastguard Worker }), 70*333d2b36SAndroid Build Coastguard Worker FixtureWithPrebuiltApisAndExtensions(map[string][]string{ 71*333d2b36SAndroid Build Coastguard Worker "31": {"foo"}, 72*333d2b36SAndroid Build Coastguard Worker "32": {"foo", "bar", "baz"}, 73*333d2b36SAndroid Build Coastguard Worker "current": {"foo", "bar"}, 74*333d2b36SAndroid Build Coastguard Worker }, map[string][]string{ 75*333d2b36SAndroid Build Coastguard Worker "1": {"foo"}, 76*333d2b36SAndroid Build Coastguard Worker "2": {"foo", "bar"}, 77*333d2b36SAndroid Build Coastguard Worker }), 78*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 79*333d2b36SAndroid Build Coastguard Worker foo_input = result.ModuleForTests("foo.api.public.latest", "").Rule("generator").Implicits[0].String() 80*333d2b36SAndroid Build Coastguard Worker bar_input = result.ModuleForTests("bar.api.public.latest", "").Rule("generator").Implicits[0].String() 81*333d2b36SAndroid Build Coastguard Worker baz_input = result.ModuleForTests("baz.api.public.latest", "").Rule("generator").Implicits[0].String() 82*333d2b36SAndroid Build Coastguard Worker return 83*333d2b36SAndroid Build Coastguard Worker } 84*333d2b36SAndroid Build Coastguard Worker // Extension 2 is the latest for both foo and bar, finalized after the base extension version. 85*333d2b36SAndroid Build Coastguard Worker foo_input, bar_input, baz_input := runTestWithBaseExtensionLevel(1) 86*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest foo = extension level 2", "prebuilts/sdk/extensions/2/public/api/foo.txt", foo_input) 87*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest bar = extension level 2", "prebuilts/sdk/extensions/2/public/api/bar.txt", bar_input) 88*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest baz = api level 32", "prebuilts/sdk/32/public/api/baz.txt", baz_input) 89*333d2b36SAndroid Build Coastguard Worker 90*333d2b36SAndroid Build Coastguard Worker // Extension 2 is the latest for both foo and bar, finalized together with 32 91*333d2b36SAndroid Build Coastguard Worker foo_input, bar_input, baz_input = runTestWithBaseExtensionLevel(2) 92*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest foo = extension level 2", "prebuilts/sdk/extensions/2/public/api/foo.txt", foo_input) 93*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest bar = extension level 2", "prebuilts/sdk/extensions/2/public/api/bar.txt", bar_input) 94*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest baz = api level 32", "prebuilts/sdk/32/public/api/baz.txt", baz_input) 95*333d2b36SAndroid Build Coastguard Worker 96*333d2b36SAndroid Build Coastguard Worker // Extension 3 is the current extension, but it has not yet been finalized. 97*333d2b36SAndroid Build Coastguard Worker foo_input, bar_input, baz_input = runTestWithBaseExtensionLevel(3) 98*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest foo = extension level 2", "prebuilts/sdk/extensions/2/public/api/foo.txt", foo_input) 99*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest bar = extension level 2", "prebuilts/sdk/extensions/2/public/api/bar.txt", bar_input) 100*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest baz = api level 32", "prebuilts/sdk/32/public/api/baz.txt", baz_input) 101*333d2b36SAndroid Build Coastguard Worker} 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Workerfunc TestPrebuiltApis_WithIncrementalApi(t *testing.T) { 104*333d2b36SAndroid Build Coastguard Worker runTestWithIncrementalApi := func() (foo_input, bar_input, baz_input string) { 105*333d2b36SAndroid Build Coastguard Worker result := android.GroupFixturePreparers( 106*333d2b36SAndroid Build Coastguard Worker prepareForJavaTest, 107*333d2b36SAndroid Build Coastguard Worker FixtureWithPrebuiltIncrementalApis(map[string][]string{ 108*333d2b36SAndroid Build Coastguard Worker "33.0": {"foo"}, 109*333d2b36SAndroid Build Coastguard Worker "33.1": {"foo", "bar", "baz"}, 110*333d2b36SAndroid Build Coastguard Worker "33.2": {"foo", "bar"}, 111*333d2b36SAndroid Build Coastguard Worker "current": {"foo", "bar"}, 112*333d2b36SAndroid Build Coastguard Worker }), 113*333d2b36SAndroid Build Coastguard Worker ).RunTest(t) 114*333d2b36SAndroid Build Coastguard Worker foo_input = result.ModuleForTests("foo.api.public.latest", "").Rule("generator").Implicits[0].String() 115*333d2b36SAndroid Build Coastguard Worker bar_input = result.ModuleForTests("bar.api.public.latest", "").Rule("generator").Implicits[0].String() 116*333d2b36SAndroid Build Coastguard Worker baz_input = result.ModuleForTests("baz.api.public.latest", "").Rule("generator").Implicits[0].String() 117*333d2b36SAndroid Build Coastguard Worker return 118*333d2b36SAndroid Build Coastguard Worker } 119*333d2b36SAndroid Build Coastguard Worker // 33.1 is the latest for baz, 33.2 is the latest for both foo & bar 120*333d2b36SAndroid Build Coastguard Worker foo_input, bar_input, baz_input := runTestWithIncrementalApi() 121*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest foo = api level 33.2", "prebuilts/sdk/33.2/public/api/foo.txt", foo_input) 122*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest bar = api level 33.2", "prebuilts/sdk/33.2/public/api/bar.txt", bar_input) 123*333d2b36SAndroid Build Coastguard Worker android.AssertStringEquals(t, "Expected latest baz = api level 33.1", "prebuilts/sdk/33.1/public/api/baz.txt", baz_input) 124*333d2b36SAndroid Build Coastguard Worker} 125