|  | // Copyright 2021 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 java | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | "testing" | 
|  |  | 
|  | "android/soong/android" | 
|  | ) | 
|  |  | 
|  | func getModuleHeaderJarsAsRelativeToTopPaths(result *android.TestResult, moduleNames ...string) []string { | 
|  | paths := []string{} | 
|  | for _, moduleName := range moduleNames { | 
|  | module := result.Module(moduleName, "android_common") | 
|  | info, _ := android.SingletonModuleProvider(result, module, JavaInfoProvider) | 
|  | paths = append(paths, info.HeaderJars.RelativeToTop().Strings()...) | 
|  | } | 
|  | return paths | 
|  | } | 
|  |  | 
|  | var addSourceSystemModules = android.FixtureAddTextFile("source/Android.bp", ` | 
|  | java_system_modules { | 
|  | name: "system-modules", | 
|  | libs: ["system-module1", "system-module2"], | 
|  | } | 
|  | java_library { | 
|  | name: "system-module1", | 
|  | srcs: ["a.java"], | 
|  | sdk_version: "none", | 
|  | system_modules: "none", | 
|  | } | 
|  | java_library { | 
|  | name: "system-module2", | 
|  | srcs: ["b.java"], | 
|  | sdk_version: "none", | 
|  | system_modules: "none", | 
|  | } | 
|  | `) | 
|  |  | 
|  | func TestJavaSystemModules(t *testing.T) { | 
|  | result := android.GroupFixturePreparers(prepareForJavaTest, addSourceSystemModules).RunTest(t) | 
|  |  | 
|  | // check the existence of the source module | 
|  | sourceSystemModules := result.ModuleForTests("system-modules", "android_common") | 
|  | sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs | 
|  |  | 
|  | // The expected paths are the header jars from the source input modules. | 
|  | expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") | 
|  | android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) | 
|  | } | 
|  |  | 
|  | var addPrebuiltSystemModules = android.FixtureAddTextFile("prebuilts/Android.bp", ` | 
|  | java_system_modules_import { | 
|  | name: "system-modules", | 
|  | libs: ["system-module1", "system-module2"], | 
|  | } | 
|  | java_import { | 
|  | name: "system-module1", | 
|  | jars: ["a.jar"], | 
|  | } | 
|  | java_import { | 
|  | name: "system-module2", | 
|  | jars: ["b.jar"], | 
|  | } | 
|  | `) | 
|  |  | 
|  | func TestJavaSystemModulesImport(t *testing.T) { | 
|  | result := android.GroupFixturePreparers(prepareForJavaTest, addPrebuiltSystemModules).RunTest(t) | 
|  |  | 
|  | // check the existence of the renamed prebuilt module | 
|  | prebuiltSystemModules := result.ModuleForTests("system-modules", "android_common") | 
|  | prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs | 
|  |  | 
|  | // The expected paths are the header jars from the renamed prebuilt input modules. | 
|  | expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") | 
|  | android.AssertArrayString(t, "renamed prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings()) | 
|  | } | 
|  |  | 
|  | func TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) { | 
|  | result := android.GroupFixturePreparers( | 
|  | prepareForJavaTest, | 
|  | addSourceSystemModules, | 
|  | addPrebuiltSystemModules, | 
|  | ).RunTest(t) | 
|  |  | 
|  | // check the existence of the source module | 
|  | sourceSystemModules := result.ModuleForTests("system-modules", "android_common") | 
|  | sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs | 
|  |  | 
|  | // The expected paths are the header jars from the source input modules. | 
|  | expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2") | 
|  | android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings()) | 
|  |  | 
|  | // check the existence of the renamed prebuilt module | 
|  | prebuiltSystemModules := result.ModuleForTests("prebuilt_system-modules", "android_common") | 
|  | prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs | 
|  |  | 
|  | // The expected paths are the header jars from the renamed prebuilt input modules. | 
|  | expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "prebuilt_system-module1", "prebuilt_system-module2") | 
|  | android.AssertArrayString(t, "prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings()) | 
|  | } | 
|  |  | 
|  | func TestMultipleSystemModulesPrebuilts(t *testing.T) { | 
|  | bp := ` | 
|  | // an rdep | 
|  | java_library { | 
|  | name: "foo", | 
|  | sdk_version: "none", | 
|  | system_modules: "my_system_modules", | 
|  | } | 
|  |  | 
|  | // multiple variations of java_system_modules | 
|  | // source | 
|  | java_system_modules { | 
|  | name: "my_system_modules", | 
|  | libs: ["bar"], | 
|  | } | 
|  | java_library { | 
|  | name: "bar", | 
|  | srcs: ["bar.java"], | 
|  | } | 
|  | // prebuilt "v1" | 
|  | java_system_modules_import { | 
|  | name: "my_system_modules.v1", | 
|  | source_module_name: "my_system_modules", | 
|  | libs: ["bar.v1"], | 
|  | } | 
|  | java_import { | 
|  | name: "bar.v1", | 
|  | source_module_name: "bar", | 
|  | jars: ["bar.v1.jar"], | 
|  | } | 
|  | // prebuilt "v2" | 
|  | java_system_modules_import { | 
|  | name: "my_system_modules.v2", | 
|  | source_module_name: "my_system_modules", | 
|  | libs: ["bar.v2"], | 
|  | } | 
|  | java_import { | 
|  | name: "bar.v2", | 
|  | source_module_name: "bar", | 
|  | jars: ["bar.v2.jar"], | 
|  | } | 
|  |  | 
|  | // selectors | 
|  | apex_contributions { | 
|  | name: "myapex_contributions", | 
|  | contents: ["%v"], | 
|  | } | 
|  | ` | 
|  | testCases := []struct { | 
|  | desc                   string | 
|  | selectedDependencyName string | 
|  | }{ | 
|  | { | 
|  | desc:                   "Source system_modules is selected using apex_contributions", | 
|  | selectedDependencyName: "my_system_modules", | 
|  | }, | 
|  | { | 
|  | desc:                   "Prebuilt system_modules v1 is selected using apex_contributions", | 
|  | selectedDependencyName: "prebuilt_my_system_modules.v1", | 
|  | }, | 
|  | { | 
|  | desc:                   "Prebuilt system_modules v2 is selected using apex_contributions", | 
|  | selectedDependencyName: "prebuilt_my_system_modules.v2", | 
|  | }, | 
|  | } | 
|  |  | 
|  | for _, tc := range testCases { | 
|  | res := android.GroupFixturePreparers( | 
|  | prepareForJavaTest, | 
|  | android.FixtureModifyProductVariables(func(variables android.FixtureProductVariables) { | 
|  | variables.BuildFlags = map[string]string{ | 
|  | "RELEASE_APEX_CONTRIBUTIONS_ADSERVICES": "myapex_contributions", | 
|  | } | 
|  | }), | 
|  | ).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName)) | 
|  |  | 
|  | // check that rdep gets the correct variation of system_modules | 
|  | hasDep := CheckModuleHasDependency(t, res.TestContext, "foo", "android_common", tc.selectedDependencyName) | 
|  | android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from foo to %s\n", tc.selectedDependencyName), true, hasDep) | 
|  | } | 
|  | } |