blob: d6dbe3c25c680922ae52ebf0bb50e81f4fc8254d [file] [log] [blame]
Sam Delmerico82602492022-06-10 17:05:42 +00001// Copyright 2022 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 "testing"
20)
21
22func TestAarImportProducesJniPackages(t *testing.T) {
23 ctx := android.GroupFixturePreparers(
24 PrepareForTestWithJavaDefaultModules,
25 ).RunTestWithBp(t, `
26 android_library_import {
27 name: "aar-no-jni",
28 aars: ["aary.aar"],
29 }
30 android_library_import {
31 name: "aar-jni",
32 aars: ["aary.aar"],
33 extract_jni: true,
34 }`)
35
36 testCases := []struct {
37 name string
38 hasPackage bool
39 }{
40 {
41 name: "aar-no-jni",
42 hasPackage: false,
43 },
44 {
45 name: "aar-jni",
46 hasPackage: true,
47 },
48 }
49
50 for _, tc := range testCases {
51 t.Run(tc.name, func(t *testing.T) {
52 appMod := ctx.Module(tc.name, "android_common")
53 appTestMod := ctx.ModuleForTests(tc.name, "android_common")
54
Colin Cross5a377182023-12-14 14:46:23 -080055 info, ok := android.SingletonModuleProvider(ctx, appMod, JniPackageProvider)
Sam Delmerico82602492022-06-10 17:05:42 +000056 if !ok {
57 t.Errorf("expected android_library_import to have JniPackageProvider")
58 }
59
60 if !tc.hasPackage {
61 if len(info.JniPackages) != 0 {
62 t.Errorf("expected JniPackages to be empty, but got %v", info.JniPackages)
63 }
64 outputFile := "arm64-v8a_jni.zip"
65 jniOutputLibZip := appTestMod.MaybeOutput(outputFile)
66 if jniOutputLibZip.Rule != nil {
67 t.Errorf("did not expect an output file, but found %v", outputFile)
68 }
69 return
70 }
71
72 if len(info.JniPackages) != 1 {
73 t.Errorf("expected a single JniPackage, but got %v", info.JniPackages)
74 }
75
76 outputFile := info.JniPackages[0].String()
77 jniOutputLibZip := appTestMod.Output(outputFile)
78 if jniOutputLibZip.Rule == nil {
79 t.Errorf("did not find output file %v", outputFile)
80 }
81 })
82 }
83}
Jihoon Kang9049c272024-03-19 21:57:36 +000084
85func TestLibraryFlagsPackages(t *testing.T) {
86 result := android.GroupFixturePreparers(
87 prepareForJavaTest,
88 ).RunTestWithBp(t, `
89 android_library {
90 name: "foo",
91 srcs: ["a.java"],
92 sdk_version: "current",
93 flags_packages: [
94 "bar",
95 "baz",
96 ],
97 }
98 aconfig_declarations {
99 name: "bar",
100 package: "com.example.package.bar",
101 srcs: [
102 "bar.aconfig",
103 ],
104 }
105 aconfig_declarations {
106 name: "baz",
107 package: "com.example.package.baz",
108 srcs: [
109 "baz.aconfig",
110 ],
111 }
112 `)
113
114 foo := result.ModuleForTests("foo", "android_common")
115
116 // android_library module depends on aconfig_declarations listed in flags_packages
117 android.AssertBoolEquals(t, "foo expected to depend on bar", true,
118 CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"))
119
120 android.AssertBoolEquals(t, "foo expected to depend on baz", true,
121 CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "baz"))
122
123 aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
124 linkInFlags := aapt2LinkRule.Args["inFlags"]
125 android.AssertStringDoesContain(t,
126 "aapt2 link command expected to pass feature flags arguments",
127 linkInFlags,
128 "--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
129 )
130}
Colin Cross28ac2ff2024-04-02 12:21:34 -0700131
132func TestAndroidLibraryOutputFilesRel(t *testing.T) {
133 result := android.GroupFixturePreparers(
134 PrepareForTestWithJavaDefaultModules,
135 ).RunTestWithBp(t, `
136 android_library {
137 name: "foo",
138 srcs: ["a.java"],
Colin Cross607bbd62024-04-12 13:44:45 -0700139 java_resources: ["foo.txt"],
Colin Cross28ac2ff2024-04-02 12:21:34 -0700140 }
141
142 android_library_import {
143 name: "bar",
Colin Cross607bbd62024-04-12 13:44:45 -0700144 aars: ["bar_prebuilt.aar"],
Colin Cross28ac2ff2024-04-02 12:21:34 -0700145
146 }
147
148 android_library_import {
149 name: "baz",
Colin Cross607bbd62024-04-12 13:44:45 -0700150 aars: ["baz_prebuilt.aar"],
151 static_libs: ["foo", "bar"],
Colin Cross28ac2ff2024-04-02 12:21:34 -0700152 }
153 `)
154
155 foo := result.ModuleForTests("foo", "android_common")
156 bar := result.ModuleForTests("bar", "android_common")
157 baz := result.ModuleForTests("baz", "android_common")
158
159 fooOutputPath := android.OutputFileForModule(android.PathContext(nil), foo.Module(), "")
160 barOutputPath := android.OutputFileForModule(android.PathContext(nil), bar.Module(), "")
161 bazOutputPath := android.OutputFileForModule(android.PathContext(nil), baz.Module(), "")
162
163 android.AssertPathRelativeToTopEquals(t, "foo output path",
Colin Cross607bbd62024-04-12 13:44:45 -0700164 "out/soong/.intermediates/foo/android_common/withres/foo.jar", fooOutputPath)
Colin Cross28ac2ff2024-04-02 12:21:34 -0700165 android.AssertPathRelativeToTopEquals(t, "bar output path",
166 "out/soong/.intermediates/bar/android_common/aar/bar.jar", barOutputPath)
167 android.AssertPathRelativeToTopEquals(t, "baz output path",
Colin Cross607bbd62024-04-12 13:44:45 -0700168 "out/soong/.intermediates/baz/android_common/withres/baz.jar", bazOutputPath)
Colin Cross28ac2ff2024-04-02 12:21:34 -0700169
170 android.AssertStringEquals(t, "foo relative output path",
171 "foo.jar", fooOutputPath.Rel())
172 android.AssertStringEquals(t, "bar relative output path",
173 "bar.jar", barOutputPath.Rel())
174 android.AssertStringEquals(t, "baz relative output path",
175 "baz.jar", bazOutputPath.Rel())
176}