blob: 6d9445b6db864dc8aae034a5e908be68f6d0664f [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 {
54 config := android.TestConfig(buildDir)
55
56 ctx := android.NewTestContext()
57 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 Cross227d4362017-08-30 14:14:52 -070066 extraModules := []string{"core-oj", "core-libart", "frameworks", "sdk_v14"}
Colin Cross72bb3632017-07-13 16:23:21 -070067
68 for _, extra := range extraModules {
69 bp += fmt.Sprintf(`
70 java_library {
71 name: "%s",
Colin Cross76b5f0c2017-08-29 16:02:06 -070072 no_standard_libs: true,
Colin Cross72bb3632017-07-13 16:23:21 -070073 }
74 `, extra)
75 }
76
77 ctx.MockFileSystem(map[string][]byte{
78 "Android.bp": []byte(bp),
79 "a.java": nil,
80 "b.java": nil,
81 "c.java": nil,
82 "a.jar": nil,
83 "b.jar": nil,
84 })
85
86 _, errs := ctx.ParseBlueprintsFiles("Android.bp")
87 fail(t, errs)
88 _, errs = ctx.PrepareBuildActions(config)
89 fail(t, errs)
90
91 return ctx
92}
93
94func TestSimple(t *testing.T) {
95 ctx := testJava(t, `
96 java_library {
97 name: "foo",
98 srcs: ["a.java"],
Colin Crosse8dc34a2017-07-19 11:22:16 -070099 libs: ["bar"],
100 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700101 }
102
103 java_library {
104 name: "bar",
105 srcs: ["b.java"],
106 }
107
108 java_library {
109 name: "baz",
110 srcs: ["c.java"],
111 }
112 `)
113
114 javac := ctx.ModuleForTests("foo", "").Rule("javac")
115 jar := ctx.ModuleForTests("foo", "").Rule("jar")
116
117 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
118 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
119 }
120
121 bar := filepath.Join(buildDir, ".intermediates", "bar", "classes-full-debug.jar")
122 if !strings.Contains(javac.Args["classpath"], bar) {
123 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bar)
124 }
125
126 baz := filepath.Join(buildDir, ".intermediates", "baz", "classes.list")
127 if !strings.Contains(jar.Args["jarArgs"], baz) {
128 t.Errorf("foo jarArgs %v does not contain %q", jar.Args["jarArgs"], baz)
129 }
130}
131
132func TestSdk(t *testing.T) {
133 ctx := testJava(t, `
134 java_library {
135 name: "foo1",
136 srcs: ["a.java"],
137 }
138
139 java_library {
140 name: "foo2",
141 srcs: ["a.java"],
142 sdk_version: "",
143 }
144
145 java_library {
146 name: "foo3",
147 srcs: ["a.java"],
148 sdk_version: "14",
149 }
150
151 java_library {
152 name: "foo4",
153 srcs: ["a.java"],
154 sdk_version: "current",
155 }
156
157 java_library {
158 name: "foo5",
159 srcs: ["a.java"],
160 sdk_version: "system_current",
161 }
162
163 java_library {
164 name: "foo6",
165 srcs: ["a.java"],
166 sdk_version: "test_current",
167 }
168 `)
169
170 type depType int
171 const (
172 staticLib = iota
173 classpathLib
174 bootclasspathLib
175 )
176
Colin Cross227d4362017-08-30 14:14:52 -0700177 check := func(module string, depType depType, deps ...string) {
178 for i := range deps {
179 deps[i] = filepath.Join(buildDir, ".intermediates", deps[i], "classes-full-debug.jar")
Colin Cross72bb3632017-07-13 16:23:21 -0700180 }
Colin Cross227d4362017-08-30 14:14:52 -0700181 dep := strings.Join(deps, ":")
Colin Cross72bb3632017-07-13 16:23:21 -0700182
183 javac := ctx.ModuleForTests(module, "").Rule("javac")
184
185 if depType == bootclasspathLib {
186 got := strings.TrimPrefix(javac.Args["bootClasspath"], "-bootclasspath ")
187 if got != dep {
188 t.Errorf("module %q bootclasspath %q != %q", module, got, dep)
189 }
190 } else if depType == classpathLib {
191 got := strings.TrimPrefix(javac.Args["classpath"], "-classpath ")
192 if got != dep {
193 t.Errorf("module %q classpath %q != %q", module, got, dep)
194 }
195 }
196
Colin Cross227d4362017-08-30 14:14:52 -0700197 if !reflect.DeepEqual(javac.Implicits.Strings(), deps) {
198 t.Errorf("module %q implicits %q != %q", module, javac.Implicits.Strings(), deps)
Colin Cross72bb3632017-07-13 16:23:21 -0700199 }
200 }
201
Colin Cross227d4362017-08-30 14:14:52 -0700202 check("foo1", bootclasspathLib, "core-oj", "core-libart")
203 check("foo2", bootclasspathLib, "core-oj", "core-libart")
204 // TODO(ccross): these need the arch mutator to run to work correctly
205 //check("foo3", bootclasspathLib, "sdk_v14")
206 //check("foo4", bootclasspathLib, "android_stubs_current")
207 //check("foo5", bootclasspathLib, "android_system_stubs_current")
208 //check("foo6", bootclasspathLib, "android_test_stubs_current")
Colin Cross72bb3632017-07-13 16:23:21 -0700209}
210
211func TestPrebuilts(t *testing.T) {
212 ctx := testJava(t, `
213 java_library {
214 name: "foo",
215 srcs: ["a.java"],
Colin Crosse8dc34a2017-07-19 11:22:16 -0700216 libs: ["bar"],
217 static_libs: ["baz"],
Colin Cross72bb3632017-07-13 16:23:21 -0700218 }
219
Colin Cross74d73e22017-08-02 11:05:49 -0700220 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700221 name: "bar",
Colin Cross74d73e22017-08-02 11:05:49 -0700222 jars: ["a.jar"],
Colin Cross72bb3632017-07-13 16:23:21 -0700223 }
224
Colin Cross74d73e22017-08-02 11:05:49 -0700225 java_import {
Colin Cross72bb3632017-07-13 16:23:21 -0700226 name: "baz",
Colin Cross74d73e22017-08-02 11:05:49 -0700227 jars: ["b.jar"],
Colin Cross72bb3632017-07-13 16:23:21 -0700228 }
229 `)
230
231 javac := ctx.ModuleForTests("foo", "").Rule("javac")
232 jar := ctx.ModuleForTests("foo", "").Rule("jar")
233
234 bar := "a.jar"
235 if !strings.Contains(javac.Args["classpath"], bar) {
236 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bar)
237 }
238
Colin Cross74d73e22017-08-02 11:05:49 -0700239 baz := filepath.Join(buildDir, ".intermediates", "baz", "extracted0", "classes.list")
Colin Cross72bb3632017-07-13 16:23:21 -0700240 if !strings.Contains(jar.Args["jarArgs"], baz) {
241 t.Errorf("foo jarArgs %v does not contain %q", jar.Args["jarArgs"], baz)
242 }
243}
244
Colin Cross89536d42017-07-07 14:35:50 -0700245func TestDefaults(t *testing.T) {
246 ctx := testJava(t, `
247 java_defaults {
248 name: "defaults",
249 srcs: ["a.java"],
250 libs: ["bar"],
251 static_libs: ["baz"],
252 }
253
254 java_library {
255 name: "foo",
256 defaults: ["defaults"],
257 }
258
259 java_library {
260 name: "bar",
261 srcs: ["b.java"],
262 }
263
264 java_library {
265 name: "baz",
266 srcs: ["c.java"],
267 }
268 `)
269
270 javac := ctx.ModuleForTests("foo", "").Rule("javac")
271 jar := ctx.ModuleForTests("foo", "").Rule("jar")
272
273 if len(javac.Inputs) != 1 || javac.Inputs[0].String() != "a.java" {
274 t.Errorf(`foo inputs %v != ["a.java"]`, javac.Inputs)
275 }
276
277 bar := filepath.Join(buildDir, ".intermediates", "bar", "classes-full-debug.jar")
278 if !strings.Contains(javac.Args["classpath"], bar) {
279 t.Errorf("foo classpath %v does not contain %q", javac.Args["classpath"], bar)
280 }
281
282 baz := filepath.Join(buildDir, ".intermediates", "baz", "classes.list")
283 if !strings.Contains(jar.Args["jarArgs"], baz) {
284 t.Errorf("foo jarArgs %v does not contain %q", jar.Args["jarArgs"], baz)
285 }
286}
287
Colin Cross72bb3632017-07-13 16:23:21 -0700288func fail(t *testing.T, errs []error) {
289 if len(errs) > 0 {
290 for _, err := range errs {
291 t.Error(err)
292 }
293 t.FailNow()
294 }
295}