| // 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.OtherModuleProvider(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.PrepareForTestWithBuildFlag("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) | 
 | 	} | 
 | } |