xref: /aosp_15_r20/build/soong/java/aar_test.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1*333d2b36SAndroid Build Coastguard Worker// Copyright 2022 Google Inc. All rights reserved.
2*333d2b36SAndroid Build Coastguard Worker//
3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License");
4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License.
5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at
6*333d2b36SAndroid Build Coastguard Worker//
7*333d2b36SAndroid Build Coastguard Worker//     http://www.apache.org/licenses/LICENSE-2.0
8*333d2b36SAndroid Build Coastguard Worker//
9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software
10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS,
11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and
13*333d2b36SAndroid Build Coastguard Worker// limitations under the License.
14*333d2b36SAndroid Build Coastguard Worker
15*333d2b36SAndroid Build Coastguard Workerpackage java
16*333d2b36SAndroid Build Coastguard Worker
17*333d2b36SAndroid Build Coastguard Workerimport (
18*333d2b36SAndroid Build Coastguard Worker	"testing"
19*333d2b36SAndroid Build Coastguard Worker
20*333d2b36SAndroid Build Coastguard Worker	"android/soong/android"
21*333d2b36SAndroid Build Coastguard Worker)
22*333d2b36SAndroid Build Coastguard Worker
23*333d2b36SAndroid Build Coastguard Workerfunc TestAarImportProducesJniPackages(t *testing.T) {
24*333d2b36SAndroid Build Coastguard Worker	ctx := android.GroupFixturePreparers(
25*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
26*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
27*333d2b36SAndroid Build Coastguard Worker		android_library_import {
28*333d2b36SAndroid Build Coastguard Worker			name: "aar-no-jni",
29*333d2b36SAndroid Build Coastguard Worker			aars: ["aary.aar"],
30*333d2b36SAndroid Build Coastguard Worker		}
31*333d2b36SAndroid Build Coastguard Worker		android_library_import {
32*333d2b36SAndroid Build Coastguard Worker			name: "aar-jni",
33*333d2b36SAndroid Build Coastguard Worker			aars: ["aary.aar"],
34*333d2b36SAndroid Build Coastguard Worker			extract_jni: true,
35*333d2b36SAndroid Build Coastguard Worker		}`)
36*333d2b36SAndroid Build Coastguard Worker
37*333d2b36SAndroid Build Coastguard Worker	testCases := []struct {
38*333d2b36SAndroid Build Coastguard Worker		name       string
39*333d2b36SAndroid Build Coastguard Worker		hasPackage bool
40*333d2b36SAndroid Build Coastguard Worker	}{
41*333d2b36SAndroid Build Coastguard Worker		{
42*333d2b36SAndroid Build Coastguard Worker			name:       "aar-no-jni",
43*333d2b36SAndroid Build Coastguard Worker			hasPackage: false,
44*333d2b36SAndroid Build Coastguard Worker		},
45*333d2b36SAndroid Build Coastguard Worker		{
46*333d2b36SAndroid Build Coastguard Worker			name:       "aar-jni",
47*333d2b36SAndroid Build Coastguard Worker			hasPackage: true,
48*333d2b36SAndroid Build Coastguard Worker		},
49*333d2b36SAndroid Build Coastguard Worker	}
50*333d2b36SAndroid Build Coastguard Worker
51*333d2b36SAndroid Build Coastguard Worker	for _, tc := range testCases {
52*333d2b36SAndroid Build Coastguard Worker		t.Run(tc.name, func(t *testing.T) {
53*333d2b36SAndroid Build Coastguard Worker			appMod := ctx.Module(tc.name, "android_common")
54*333d2b36SAndroid Build Coastguard Worker			appTestMod := ctx.ModuleForTests(tc.name, "android_common")
55*333d2b36SAndroid Build Coastguard Worker
56*333d2b36SAndroid Build Coastguard Worker			info, ok := android.OtherModuleProvider(ctx, appMod, JniPackageProvider)
57*333d2b36SAndroid Build Coastguard Worker			if !ok {
58*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected android_library_import to have JniPackageProvider")
59*333d2b36SAndroid Build Coastguard Worker			}
60*333d2b36SAndroid Build Coastguard Worker
61*333d2b36SAndroid Build Coastguard Worker			if !tc.hasPackage {
62*333d2b36SAndroid Build Coastguard Worker				if len(info.JniPackages) != 0 {
63*333d2b36SAndroid Build Coastguard Worker					t.Errorf("expected JniPackages to be empty, but got %v", info.JniPackages)
64*333d2b36SAndroid Build Coastguard Worker				}
65*333d2b36SAndroid Build Coastguard Worker				outputFile := "arm64-v8a_jni.zip"
66*333d2b36SAndroid Build Coastguard Worker				jniOutputLibZip := appTestMod.MaybeOutput(outputFile)
67*333d2b36SAndroid Build Coastguard Worker				if jniOutputLibZip.Rule != nil {
68*333d2b36SAndroid Build Coastguard Worker					t.Errorf("did not expect an output file, but found %v", outputFile)
69*333d2b36SAndroid Build Coastguard Worker				}
70*333d2b36SAndroid Build Coastguard Worker				return
71*333d2b36SAndroid Build Coastguard Worker			}
72*333d2b36SAndroid Build Coastguard Worker
73*333d2b36SAndroid Build Coastguard Worker			if len(info.JniPackages) != 1 {
74*333d2b36SAndroid Build Coastguard Worker				t.Errorf("expected a single JniPackage, but got %v", info.JniPackages)
75*333d2b36SAndroid Build Coastguard Worker			}
76*333d2b36SAndroid Build Coastguard Worker
77*333d2b36SAndroid Build Coastguard Worker			outputFile := info.JniPackages[0].String()
78*333d2b36SAndroid Build Coastguard Worker			jniOutputLibZip := appTestMod.Output(outputFile)
79*333d2b36SAndroid Build Coastguard Worker			if jniOutputLibZip.Rule == nil {
80*333d2b36SAndroid Build Coastguard Worker				t.Errorf("did not find output file %v", outputFile)
81*333d2b36SAndroid Build Coastguard Worker			}
82*333d2b36SAndroid Build Coastguard Worker		})
83*333d2b36SAndroid Build Coastguard Worker	}
84*333d2b36SAndroid Build Coastguard Worker}
85*333d2b36SAndroid Build Coastguard Worker
86*333d2b36SAndroid Build Coastguard Workerfunc TestLibraryFlagsPackages(t *testing.T) {
87*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
88*333d2b36SAndroid Build Coastguard Worker		prepareForJavaTest,
89*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
90*333d2b36SAndroid Build Coastguard Worker		android_library {
91*333d2b36SAndroid Build Coastguard Worker			name: "foo",
92*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
93*333d2b36SAndroid Build Coastguard Worker			sdk_version: "current",
94*333d2b36SAndroid Build Coastguard Worker			flags_packages: [
95*333d2b36SAndroid Build Coastguard Worker				"bar",
96*333d2b36SAndroid Build Coastguard Worker				"baz",
97*333d2b36SAndroid Build Coastguard Worker			],
98*333d2b36SAndroid Build Coastguard Worker		}
99*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
100*333d2b36SAndroid Build Coastguard Worker			name: "bar",
101*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.bar",
102*333d2b36SAndroid Build Coastguard Worker			container: "com.android.foo",
103*333d2b36SAndroid Build Coastguard Worker			srcs: [
104*333d2b36SAndroid Build Coastguard Worker				"bar.aconfig",
105*333d2b36SAndroid Build Coastguard Worker			],
106*333d2b36SAndroid Build Coastguard Worker		}
107*333d2b36SAndroid Build Coastguard Worker		aconfig_declarations {
108*333d2b36SAndroid Build Coastguard Worker			name: "baz",
109*333d2b36SAndroid Build Coastguard Worker			package: "com.example.package.baz",
110*333d2b36SAndroid Build Coastguard Worker			container: "com.android.foo",
111*333d2b36SAndroid Build Coastguard Worker			srcs: [
112*333d2b36SAndroid Build Coastguard Worker				"baz.aconfig",
113*333d2b36SAndroid Build Coastguard Worker			],
114*333d2b36SAndroid Build Coastguard Worker		}
115*333d2b36SAndroid Build Coastguard Worker	`)
116*333d2b36SAndroid Build Coastguard Worker
117*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
118*333d2b36SAndroid Build Coastguard Worker
119*333d2b36SAndroid Build Coastguard Worker	// android_library module depends on aconfig_declarations listed in flags_packages
120*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "foo expected to depend on bar", true,
121*333d2b36SAndroid Build Coastguard Worker		CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "bar"))
122*333d2b36SAndroid Build Coastguard Worker
123*333d2b36SAndroid Build Coastguard Worker	android.AssertBoolEquals(t, "foo expected to depend on baz", true,
124*333d2b36SAndroid Build Coastguard Worker		CheckModuleHasDependency(t, result.TestContext, "foo", "android_common", "baz"))
125*333d2b36SAndroid Build Coastguard Worker
126*333d2b36SAndroid Build Coastguard Worker	aapt2LinkRule := foo.Rule("android/soong/java.aapt2Link")
127*333d2b36SAndroid Build Coastguard Worker	linkInFlags := aapt2LinkRule.Args["inFlags"]
128*333d2b36SAndroid Build Coastguard Worker	android.AssertStringDoesContain(t,
129*333d2b36SAndroid Build Coastguard Worker		"aapt2 link command expected to pass feature flags arguments",
130*333d2b36SAndroid Build Coastguard Worker		linkInFlags,
131*333d2b36SAndroid Build Coastguard Worker		"--feature-flags @out/soong/.intermediates/bar/intermediate.txt --feature-flags @out/soong/.intermediates/baz/intermediate.txt",
132*333d2b36SAndroid Build Coastguard Worker	)
133*333d2b36SAndroid Build Coastguard Worker}
134*333d2b36SAndroid Build Coastguard Worker
135*333d2b36SAndroid Build Coastguard Workerfunc TestAndroidLibraryOutputFilesRel(t *testing.T) {
136*333d2b36SAndroid Build Coastguard Worker	result := android.GroupFixturePreparers(
137*333d2b36SAndroid Build Coastguard Worker		PrepareForTestWithJavaDefaultModules,
138*333d2b36SAndroid Build Coastguard Worker	).RunTestWithBp(t, `
139*333d2b36SAndroid Build Coastguard Worker		android_library {
140*333d2b36SAndroid Build Coastguard Worker			name: "foo",
141*333d2b36SAndroid Build Coastguard Worker			srcs: ["a.java"],
142*333d2b36SAndroid Build Coastguard Worker			java_resources: ["foo.txt"],
143*333d2b36SAndroid Build Coastguard Worker		}
144*333d2b36SAndroid Build Coastguard Worker
145*333d2b36SAndroid Build Coastguard Worker		android_library_import {
146*333d2b36SAndroid Build Coastguard Worker			name: "bar",
147*333d2b36SAndroid Build Coastguard Worker			aars: ["bar_prebuilt.aar"],
148*333d2b36SAndroid Build Coastguard Worker
149*333d2b36SAndroid Build Coastguard Worker		}
150*333d2b36SAndroid Build Coastguard Worker
151*333d2b36SAndroid Build Coastguard Worker		android_library_import {
152*333d2b36SAndroid Build Coastguard Worker			name: "baz",
153*333d2b36SAndroid Build Coastguard Worker			aars: ["baz_prebuilt.aar"],
154*333d2b36SAndroid Build Coastguard Worker			static_libs: ["foo", "bar"],
155*333d2b36SAndroid Build Coastguard Worker		}
156*333d2b36SAndroid Build Coastguard Worker	`)
157*333d2b36SAndroid Build Coastguard Worker
158*333d2b36SAndroid Build Coastguard Worker	foo := result.ModuleForTests("foo", "android_common")
159*333d2b36SAndroid Build Coastguard Worker	bar := result.ModuleForTests("bar", "android_common")
160*333d2b36SAndroid Build Coastguard Worker	baz := result.ModuleForTests("baz", "android_common")
161*333d2b36SAndroid Build Coastguard Worker
162*333d2b36SAndroid Build Coastguard Worker	fooOutputPaths := foo.OutputFiles(result.TestContext, t, "")
163*333d2b36SAndroid Build Coastguard Worker	barOutputPaths := bar.OutputFiles(result.TestContext, t, "")
164*333d2b36SAndroid Build Coastguard Worker	bazOutputPaths := baz.OutputFiles(result.TestContext, t, "")
165*333d2b36SAndroid Build Coastguard Worker
166*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "foo output path",
167*333d2b36SAndroid Build Coastguard Worker		[]string{"out/soong/.intermediates/foo/android_common/withres/foo.jar"}, fooOutputPaths)
168*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "bar output path",
169*333d2b36SAndroid Build Coastguard Worker		[]string{"out/soong/.intermediates/bar/android_common/aar/bar.jar"}, barOutputPaths)
170*333d2b36SAndroid Build Coastguard Worker	android.AssertPathsRelativeToTopEquals(t, "baz output path",
171*333d2b36SAndroid Build Coastguard Worker		[]string{"out/soong/.intermediates/baz/android_common/withres/baz.jar"}, bazOutputPaths)
172*333d2b36SAndroid Build Coastguard Worker
173*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "foo relative output path",
174*333d2b36SAndroid Build Coastguard Worker		"foo.jar", fooOutputPaths[0].Rel())
175*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "bar relative output path",
176*333d2b36SAndroid Build Coastguard Worker		"bar.jar", barOutputPaths[0].Rel())
177*333d2b36SAndroid Build Coastguard Worker	android.AssertStringEquals(t, "baz relative output path",
178*333d2b36SAndroid Build Coastguard Worker		"baz.jar", bazOutputPaths[0].Rel())
179*333d2b36SAndroid Build Coastguard Worker}
180