blob: 4a6baa9ef444b1a1cc41b3b12753fe5422b49026 [file] [log] [blame]
Colin Cross72bb3632017-07-13 16:23:21 -07001// Copyright 2017 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 (
18 "android/soong/android"
19 "fmt"
20 "io/ioutil"
21 "os"
22 "path/filepath"
Colin Cross227d4362017-08-30 14:14:52 -070023 "reflect"
Colin Cross72bb3632017-07-13 16:23:21 -070024 "strings"
25 "testing"
26)
27
28var buildDir string
29
30func setUp() {
31 var err error
32 buildDir, err = ioutil.TempDir("", "soong_java_test")
33 if err != nil {
34 panic(err)
35 }
36}
37
38func tearDown() {
39 os.RemoveAll(buildDir)
40}
41
42func TestMain(m *testing.M) {
43 run := func() int {
44 setUp()
45 defer tearDown()
46
47 return m.Run()
48 }
49
50 os.Exit(run())
51}
52
53func testJava(t *testing.T, bp string) *android.TestContext {
Colin Cross4c428df2017-09-15 17:36:05 -070054 config := android.TestArchConfig(buildDir)
Colin Cross72bb3632017-07-13 16:23:21 -070055
Colin Cross4c428df2017-09-15 17:36:05 -070056 ctx := android.NewTestArchContext()
Colin Cross72bb3632017-07-13 16:23:21 -070057 ctx.RegisterModuleType("android_app", android.ModuleFactoryAdaptor(AndroidAppFactory))
Colin Crossf506d872017-07-19 15:53:04 -070058 ctx.RegisterModuleType("java_library", android.ModuleFactoryAdaptor(LibraryFactory))
Colin Cross74d73e22017-08-02 11:05:49 -070059 ctx.RegisterModuleType("java_import", android.ModuleFactoryAdaptor(ImportFactory))
Colin Cross89536d42017-07-07 14:35:50 -070060 ctx.RegisterModuleType("java_defaults", android.ModuleFactoryAdaptor(defaultsFactory))
Colin Cross5ea9bcc2017-07-27 15:41:32 -070061 ctx.PreArchMutators(android.RegisterPrebuiltsPreArchMutators)
62 ctx.PreArchMutators(android.RegisterPrebuiltsPostDepsMutators)
Colin Cross89536d42017-07-07 14:35:50 -070063 ctx.PreArchMutators(android.RegisterDefaultsPreArchMutators)
Colin Cross72bb3632017-07-13 16:23:21 -070064 ctx.Register()
65
Colin Cross4c428df2017-09-15 17:36:05 -070066 extraModules := []string{
67 "core-oj",
68 "core-libart",
69 "framework",
70 "ext",
71 "okhttp",
72 "sdk_v14",
73 }
Colin Cross72bb3632017-07-13 16:23:21 -070074
75 for _, extra := range extraModules {
76 bp += fmt.Sprintf(`
77 java_library {
78 name: "%s",
Colin Cross0a6e0072017-08-30 14:24:55 -070079 srcs: ["a.java"],
Colin Cross76b5f0c2017-08-29 16:02:06 -070080 no_standard_libs: true,
Colin Cross72bb3632017-07-13 16:23:21 -070081 }
82 `, extra)
83 }
84
85 ctx.MockFileSystem(map[string][]byte{
86 "Android.bp": []byte(bp),
87 "a.java": nil,
88 "b.java": nil,
89 "c.java": nil,
90 "a.jar": nil,
91 "b.jar": nil,
92 })
93
94 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
95 fail(t, errs)
96 _, errs = ctx.PrepareBuildActions(config)
97 fail(t, errs)
98
99 return ctx
100}
101
102func TestSimple(t *testing.T) {
103 ctx := testJava(t, `
104 java_library {
105 name: "foo",
106 srcs: ["a.java"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700107 libs: ["bar"],
108 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700109 }
110
111 java_library {
112 name: "bar",
113 srcs: ["b.java"],
114 }
115
116 java_library {
117 name: "baz",
118 srcs: ["c.java"],
119 }
120 `)
121
Colin Cross4c428df2017-09-15 17:36:05 -0700122 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
123 combineJar := ctx.ModuleForTests("foo", "android_common").Rule("combineJar")
Colin Cross72bb3632017-07-13 16:23:21 -0700124
125 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
126 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
127 }
128
Colin Cross4c428df2017-09-15 17:36:05 -0700129 bar := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "classes-desugar.jar")
130 baz := filepath.Join(buildDir, ".intermediates", "baz", "android_common", "classes-desugar.jar")
Colin Cross0a6e0072017-08-30 14:24:55 -0700131
Colin Cross72bb3632017-07-13 16:23:21 -0700132 if !strings.Contains(javac.Args["classpath"], bar) {
133 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bar)
134 }
135
Colin Cross0a6e0072017-08-30 14:24:55 -0700136 if !strings.Contains(javac.Args["classpath"], baz) {
137 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], baz)
138 }
139
140 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
141 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross72bb3632017-07-13 16:23:21 -0700142 }
143}
144
145func TestSdk(t *testing.T) {
Colin Cross4c428df2017-09-15 17:36:05 -0700146 t.Skip("not working yet")
147
Colin Cross72bb3632017-07-13 16:23:21 -0700148 ctx := testJava(t, `
149 java_library {
150 name: "foo1",
151 srcs: ["a.java"],
152 }
153
154 java_library {
155 name: "foo2",
156 srcs: ["a.java"],
157 sdk_version: "",
158 }
159
160 java_library {
161 name: "foo3",
162 srcs: ["a.java"],
163 sdk_version: "14",
164 }
165
166 java_library {
167 name: "foo4",
168 srcs: ["a.java"],
169 sdk_version: "current",
170 }
171
172 java_library {
173 name: "foo5",
174 srcs: ["a.java"],
175 sdk_version: "system_current",
176 }
177
178 java_library {
179 name: "foo6",
180 srcs: ["a.java"],
181 sdk_version: "test_current",
182 }
183 `)
184
185 type depType int
186 const (
187 staticLib = iota
188 classpathLib
189 bootclasspathLib
190 )
191
Colin Cross227d4362017-08-30 14:14:52 -0700192 check := func(module string, depType depType, deps ...string) {
193 for i := range deps {
Colin Cross6ade34f2017-09-15 13:00:47 -0700194 deps[i] = filepath.Join(buildDir, ".intermediates", deps[i], "classes-desugar.jar")
Colin Cross72bb3632017-07-13 16:23:21 -0700195 }
Colin Cross227d4362017-08-30 14:14:52 -0700196 dep := strings.Join(deps, ":")
Colin Cross72bb3632017-07-13 16:23:21 -0700197
198 javac := ctx.ModuleForTests(module, "").Rule("javac")
199
200 if depType == bootclasspathLib {
201 got := strings.TrimPrefix(javac.Args["bootClasspath"], "-bootclasspath ")
202 if got != dep {
203 t.Errorf("module %q bootclasspath %q != %q", module, got, dep)
204 }
205 } else if depType == classpathLib {
206 got := strings.TrimPrefix(javac.Args["classpath"], "-classpath ")
207 if got != dep {
208 t.Errorf("module %q classpath %q != %q", module, got, dep)
209 }
210 }
211
Colin Cross227d4362017-08-30 14:14:52 -0700212 if !reflect.DeepEqual(javac.Implicits.Strings(), deps) {
213 t.Errorf("module %q implicits %q != %q", module, javac.Implicits.Strings(), deps)
Colin Cross72bb3632017-07-13 16:23:21 -0700214 }
215 }
216
Colin Cross227d4362017-08-30 14:14:52 -0700217 check("foo1", bootclasspathLib, "core-oj", "core-libart")
218 check("foo2", bootclasspathLib, "core-oj", "core-libart")
219 // TODO(ccross): these need the arch mutator to run to work correctly
220 //check("foo3", bootclasspathLib, "sdk_v14")
221 //check("foo4", bootclasspathLib, "android_stubs_current")
222 //check("foo5", bootclasspathLib, "android_system_stubs_current")
223 //check("foo6", bootclasspathLib, "android_test_stubs_current")
Colin Cross72bb3632017-07-13 16:23:21 -0700224}
225
226func TestPrebuilts(t *testing.T) {
227 ctx := testJava(t, `
228 java_library {
229 name: "foo",
230 srcs: ["a.java"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700231 libs: ["bar"],
232 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700233 }
234
Colin Cross74d73e22017-08-02 11:05:49 -0700235 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700236 name: "bar",
Colin Cross74d73e22017-08-02 11:05:49 -0700237 jars: ["a.jar"],
Colin Cross72bb3632017-07-13 16:23:21 -0700238 }
239
Colin Cross74d73e22017-08-02 11:05:49 -0700240 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700241 name: "baz",
Colin Cross74d73e22017-08-02 11:05:49 -0700242 jars: ["b.jar"],
Colin Cross72bb3632017-07-13 16:23:21 -0700243 }
244 `)
245
Colin Cross4c428df2017-09-15 17:36:05 -0700246 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
247 combineJar := ctx.ModuleForTests("foo", "android_common").Rule("combineJar")
Colin Cross72bb3632017-07-13 16:23:21 -0700248
249 bar := "a.jar"
250 if !strings.Contains(javac.Args["classpath"], bar) {
251 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bar)
252 }
253
Colin Cross0a6e0072017-08-30 14:24:55 -0700254 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != "b.jar" {
255 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, "b.jar")
Colin Cross72bb3632017-07-13 16:23:21 -0700256 }
257}
258
Colin Cross89536d42017-07-07 14:35:50 -0700259func TestDefaults(t *testing.T) {
260 ctx := testJava(t, `
261 java_defaults {
262 name: "defaults",
263 srcs: ["a.java"],
264 libs: ["bar"],
265 static_libs: ["baz"],
266 }
267
268 java_library {
269 name: "foo",
270 defaults: ["defaults"],
271 }
272
273 java_library {
274 name: "bar",
275 srcs: ["b.java"],
276 }
277
278 java_library {
279 name: "baz",
280 srcs: ["c.java"],
281 }
282 `)
283
Colin Cross4c428df2017-09-15 17:36:05 -0700284 javac := ctx.ModuleForTests("foo", "android_common").Rule("javac")
285 combineJar := ctx.ModuleForTests("foo", "android_common").Rule("combineJar")
Colin Cross89536d42017-07-07 14:35:50 -0700286
287 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
288 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
289 }
290
Colin Cross4c428df2017-09-15 17:36:05 -0700291 bar := filepath.Join(buildDir, ".intermediates", "bar", "android_common", "classes-desugar.jar")
Colin Cross89536d42017-07-07 14:35:50 -0700292 if !strings.Contains(javac.Args["classpath"], bar) {
293 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bar)
294 }
295
Colin Cross4c428df2017-09-15 17:36:05 -0700296 baz := filepath.Join(buildDir, ".intermediates", "baz", "android_common", "classes-desugar.jar")
Colin Cross0a6e0072017-08-30 14:24:55 -0700297 if len(combineJar.Inputs) != 2 || combineJar.Inputs[1].String() != baz {
298 t.Errorf("foo combineJar inputs %v does not contain %q", combineJar.Inputs, baz)
Colin Cross89536d42017-07-07 14:35:50 -0700299 }
300}
301
Colin Cross72bb3632017-07-13 16:23:21 -0700302func fail(t *testing.T, errs []error) {
303 if len(errs) > 0 {
304 for _, err := range errs {
305 t.Error(err)
306 }
307 t.FailNow()
308 }
309}