blob: 99301bc5205d65ab0a8beb531f24caba1b317473 [file] [log] [blame]
Paul Duffindb284be2021-03-11 08:07:46 +00001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package java
16
17import (
Spandan Dascc530632024-01-19 00:22:22 +000018 "fmt"
Paul Duffindb284be2021-03-11 08:07:46 +000019 "testing"
Paul Duffinc52bea92021-03-11 08:10:19 +000020
21 "android/soong/android"
Paul Duffindb284be2021-03-11 08:07:46 +000022)
23
Paul Duffin29888b12021-03-29 00:04:10 +010024func getModuleHeaderJarsAsRelativeToTopPaths(result *android.TestResult, moduleNames ...string) []string {
Paul Duffinc52bea92021-03-11 08:10:19 +000025 paths := []string{}
26 for _, moduleName := range moduleNames {
27 module := result.Module(moduleName, "android_common")
Yu Liu663e4502024-08-12 18:23:59 +000028 info, _ := android.OtherModuleProvider(result, module, JavaInfoProvider)
Paul Duffin29888b12021-03-29 00:04:10 +010029 paths = append(paths, info.HeaderJars.RelativeToTop().Strings()...)
Paul Duffinc52bea92021-03-11 08:10:19 +000030 }
31 return paths
32}
33
34var addSourceSystemModules = android.FixtureAddTextFile("source/Android.bp", `
Paul Duffindb284be2021-03-11 08:07:46 +000035 java_system_modules {
36 name: "system-modules",
37 libs: ["system-module1", "system-module2"],
38 }
39 java_library {
40 name: "system-module1",
41 srcs: ["a.java"],
42 sdk_version: "none",
43 system_modules: "none",
44 }
45 java_library {
46 name: "system-module2",
47 srcs: ["b.java"],
48 sdk_version: "none",
49 system_modules: "none",
50 }
Paul Duffinc52bea92021-03-11 08:10:19 +000051`)
Paul Duffindb284be2021-03-11 08:07:46 +000052
Paul Duffinc52bea92021-03-11 08:10:19 +000053func TestJavaSystemModules(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080054 t.Parallel()
Paul Duffin55e740e2021-03-29 02:06:19 +010055 result := android.GroupFixturePreparers(prepareForJavaTest, addSourceSystemModules).RunTest(t)
Paul Duffindb284be2021-03-11 08:07:46 +000056
Paul Duffinc52bea92021-03-11 08:10:19 +000057 // check the existence of the source module
Colin Cross90607e92025-02-11 14:58:07 -080058 sourceSystemModules := result.ModuleForTests(t, "system-modules", "android_common")
Paul Duffinc52bea92021-03-11 08:10:19 +000059 sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs
Paul Duffindb284be2021-03-11 08:07:46 +000060
Paul Duffinc52bea92021-03-11 08:10:19 +000061 // The expected paths are the header jars from the source input modules.
Paul Duffin29888b12021-03-29 00:04:10 +010062 expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2")
63 android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings())
Paul Duffindb284be2021-03-11 08:07:46 +000064}
65
Paul Duffinc52bea92021-03-11 08:10:19 +000066var addPrebuiltSystemModules = android.FixtureAddTextFile("prebuilts/Android.bp", `
Paul Duffindb284be2021-03-11 08:07:46 +000067 java_system_modules_import {
68 name: "system-modules",
69 libs: ["system-module1", "system-module2"],
70 }
71 java_import {
72 name: "system-module1",
73 jars: ["a.jar"],
74 }
75 java_import {
76 name: "system-module2",
77 jars: ["b.jar"],
78 }
Paul Duffinc52bea92021-03-11 08:10:19 +000079`)
Paul Duffindb284be2021-03-11 08:07:46 +000080
Paul Duffinc52bea92021-03-11 08:10:19 +000081func TestJavaSystemModulesImport(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080082 t.Parallel()
Paul Duffin55e740e2021-03-29 02:06:19 +010083 result := android.GroupFixturePreparers(prepareForJavaTest, addPrebuiltSystemModules).RunTest(t)
Paul Duffindb284be2021-03-11 08:07:46 +000084
Paul Duffinc52bea92021-03-11 08:10:19 +000085 // check the existence of the renamed prebuilt module
Colin Cross90607e92025-02-11 14:58:07 -080086 prebuiltSystemModules := result.ModuleForTests(t, "system-modules", "android_common")
Paul Duffinc52bea92021-03-11 08:10:19 +000087 prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs
Paul Duffindb284be2021-03-11 08:07:46 +000088
Paul Duffinc52bea92021-03-11 08:10:19 +000089 // The expected paths are the header jars from the renamed prebuilt input modules.
Paul Duffin29888b12021-03-29 00:04:10 +010090 expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2")
91 android.AssertArrayString(t, "renamed prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings())
Paul Duffinc52bea92021-03-11 08:10:19 +000092}
93
94func TestJavaSystemModulesMixSourceAndPrebuilt(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -080095 t.Parallel()
Paul Duffin55e740e2021-03-29 02:06:19 +010096 result := android.GroupFixturePreparers(
97 prepareForJavaTest,
Paul Duffinc52bea92021-03-11 08:10:19 +000098 addSourceSystemModules,
99 addPrebuiltSystemModules,
Paul Duffin55e740e2021-03-29 02:06:19 +0100100 ).RunTest(t)
Paul Duffinc52bea92021-03-11 08:10:19 +0000101
102 // check the existence of the source module
Colin Cross90607e92025-02-11 14:58:07 -0800103 sourceSystemModules := result.ModuleForTests(t, "system-modules", "android_common")
Paul Duffinc52bea92021-03-11 08:10:19 +0000104 sourceInputs := sourceSystemModules.Rule("jarsTosystemModules").Inputs
105
106 // The expected paths are the header jars from the source input modules.
Paul Duffin29888b12021-03-29 00:04:10 +0100107 expectedSourcePaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "system-module1", "system-module2")
108 android.AssertArrayString(t, "source system modules inputs", expectedSourcePaths, sourceInputs.RelativeToTop().Strings())
Paul Duffinc52bea92021-03-11 08:10:19 +0000109
110 // check the existence of the renamed prebuilt module
Colin Cross90607e92025-02-11 14:58:07 -0800111 prebuiltSystemModules := result.ModuleForTests(t, "prebuilt_system-modules", "android_common")
Paul Duffinc52bea92021-03-11 08:10:19 +0000112 prebuiltInputs := prebuiltSystemModules.Rule("jarsTosystemModules").Inputs
113
114 // The expected paths are the header jars from the renamed prebuilt input modules.
Paul Duffin29888b12021-03-29 00:04:10 +0100115 expectedPrebuiltPaths := getModuleHeaderJarsAsRelativeToTopPaths(result, "prebuilt_system-module1", "prebuilt_system-module2")
116 android.AssertArrayString(t, "prebuilt system modules inputs", expectedPrebuiltPaths, prebuiltInputs.RelativeToTop().Strings())
Paul Duffindb284be2021-03-11 08:07:46 +0000117}
Spandan Dascc530632024-01-19 00:22:22 +0000118
119func TestMultipleSystemModulesPrebuilts(t *testing.T) {
Colin Cross844cb6a2025-01-29 15:53:21 -0800120 t.Parallel()
Spandan Dascc530632024-01-19 00:22:22 +0000121 bp := `
122 // an rdep
123 java_library {
124 name: "foo",
125 sdk_version: "none",
126 system_modules: "my_system_modules",
127 }
128
129 // multiple variations of java_system_modules
130 // source
131 java_system_modules {
132 name: "my_system_modules",
133 libs: ["bar"],
134 }
135 java_library {
136 name: "bar",
137 srcs: ["bar.java"],
138 }
139 // prebuilt "v1"
140 java_system_modules_import {
141 name: "my_system_modules.v1",
142 source_module_name: "my_system_modules",
143 libs: ["bar.v1"],
144 }
145 java_import {
146 name: "bar.v1",
147 source_module_name: "bar",
148 jars: ["bar.v1.jar"],
149 }
150 // prebuilt "v2"
151 java_system_modules_import {
152 name: "my_system_modules.v2",
153 source_module_name: "my_system_modules",
154 libs: ["bar.v2"],
155 }
156 java_import {
157 name: "bar.v2",
158 source_module_name: "bar",
159 jars: ["bar.v2.jar"],
160 }
161
162 // selectors
163 apex_contributions {
164 name: "myapex_contributions",
165 contents: ["%v"],
166 }
167 `
168 testCases := []struct {
169 desc string
170 selectedDependencyName string
171 }{
172 {
173 desc: "Source system_modules is selected using apex_contributions",
174 selectedDependencyName: "my_system_modules",
175 },
176 {
177 desc: "Prebuilt system_modules v1 is selected using apex_contributions",
178 selectedDependencyName: "prebuilt_my_system_modules.v1",
179 },
180 {
181 desc: "Prebuilt system_modules v2 is selected using apex_contributions",
182 selectedDependencyName: "prebuilt_my_system_modules.v2",
183 },
184 }
185
186 for _, tc := range testCases {
187 res := android.GroupFixturePreparers(
188 prepareForJavaTest,
Colin Crossa66b4632024-08-08 15:50:47 -0700189 android.PrepareForTestWithBuildFlag("RELEASE_APEX_CONTRIBUTIONS_ADSERVICES", "myapex_contributions"),
Spandan Dascc530632024-01-19 00:22:22 +0000190 ).RunTestWithBp(t, fmt.Sprintf(bp, tc.selectedDependencyName))
191
192 // check that rdep gets the correct variation of system_modules
193 hasDep := CheckModuleHasDependency(t, res.TestContext, "foo", "android_common", tc.selectedDependencyName)
194 android.AssertBoolEquals(t, fmt.Sprintf("expected dependency from foo to %s\n", tc.selectedDependencyName), true, hasDep)
195 }
196}