blob: e73c5d63a259a7567349a055bd4b357cc31e7f36 [file] [log] [blame]
Victor Hsieh73c4f792021-10-01 18:13:52 +00001/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "libdexopt.h"
18
19#include <string>
20#include <vector>
21
22#include "android-base/result.h"
23#include "android-base/strings.h"
24#include "base/common_art_test.h"
25#include "gmock/gmock.h"
26#include "gtest/gtest.h"
27
28#include "aidl/com/android/art/CompilerFilter.h"
29#include "aidl/com/android/art/DexoptBcpExtArgs.h"
30#include "aidl/com/android/art/DexoptSystemServerArgs.h"
31#include "aidl/com/android/art/Isa.h"
32
33namespace art {
34
35using ::testing::AllOf;
36using ::testing::Contains;
37using ::testing::HasSubstr;
38using ::testing::Not;
39using aidl::com::android::art::CompilerFilter;
40using aidl::com::android::art::DexoptBcpExtArgs;
41using aidl::com::android::art::DexoptSystemServerArgs;
42using aidl::com::android::art::Isa;
43using android::base::Result;
44
45std::string GetEnvironmentVariableOrDie(const char* name) {
46 const char* value = getenv(name);
47 EXPECT_NE(value, nullptr);
48 return value;
49}
50
51// See art_artd_tests.xml for *CLASSPATH setup.
52class LibDexoptTest : public CommonArtTest {
53 protected:
54 void SetUp() override {
55 CommonArtTest::SetUp();
56
57 default_bcp_ext_args_.dexFds = {10, 11};
58 default_bcp_ext_args_.bootClasspaths = android::base::Split(
59 GetEnvironmentVariableOrDie("DEX2OATBOOTCLASSPATH"), ":"); // from art_artd_tests.xml
60 default_bcp_ext_args_.bootClasspathFds = {21, 22};
61 default_bcp_ext_args_.profileFd = 30;
62 default_bcp_ext_args_.dirtyImageObjectsFd = 31;
63 default_bcp_ext_args_.imageFd = 90;
64 default_bcp_ext_args_.vdexFd = 91;
65 default_bcp_ext_args_.oatFd = 92;
66 default_bcp_ext_args_.dexPaths = {"/path/to/foo.jar", "/path/to/bar.jar"};
67 default_bcp_ext_args_.oatLocation = "/oat/location/bar.odex";
68 default_bcp_ext_args_.isa = Isa::X86_64;
69 default_bcp_ext_args_.cpuSet = {0, 1};
70 default_bcp_ext_args_.threads = 42;
71 ASSERT_EQ(default_bcp_ext_args_.bootClasspaths.size(),
72 default_bcp_ext_args_.bootClasspathFds.size());
73
74 default_system_server_args_.dexFd = 10;
75 default_system_server_args_.profileFd = 11;
76 default_system_server_args_.bootClasspaths = android::base::Split(
77 GetEnvironmentVariableOrDie("BOOTCLASSPATH"), ":"); // from art_artd_tests.xml
78 default_system_server_args_.bootClasspathFds = {21, 22, 23};
79 default_system_server_args_.bootClasspathImageFds = {-1, 31, -1};
80 default_system_server_args_.bootClasspathVdexFds = {-1, 32, -1};
81 default_system_server_args_.bootClasspathOatFds = {-1, 33, -1};
82 default_system_server_args_.classloaderFds = {40, 41};
83 default_system_server_args_.classloaderContext = {"/cl/abc.jar", "/cl/def.jar"};
84 default_system_server_args_.imageFd = 90;
85 default_system_server_args_.vdexFd = 91;
86 default_system_server_args_.oatFd = 92;
87 default_system_server_args_.dexPath = "/path/to/foo.jar";
88 default_system_server_args_.oatLocation = "/oat/location/bar.odex";
89 default_system_server_args_.isa = Isa::X86_64;
90 default_system_server_args_.compilerFilter = CompilerFilter::SPEED_PROFILE;
91 default_system_server_args_.cpuSet = {0, 1};
92 default_system_server_args_.threads = 42;
93 default_system_server_args_.isBootImageOnSystem = true;
94 ASSERT_EQ(default_system_server_args_.bootClasspaths.size(),
95 default_system_server_args_.bootClasspathFds.size());
96 }
97
98 void TearDown() override {
99 CommonArtTest::TearDown();
100 }
101
102 std::vector<std::string> Dex2oatArgsFromBcpExtensionArgs(const DexoptBcpExtArgs& args) {
103 std::vector<std::string> cmdline;
104 Result<void> result = AddDex2oatArgsFromBcpExtensionArgs(args, cmdline);
105 EXPECT_TRUE(result.ok()) << "Failed expectation: " << result.error().message();
106 return cmdline;
107 }
108
109 std::vector<std::string> Dex2oatArgsFromSystemServerArgs(const DexoptSystemServerArgs& args) {
110 std::vector<std::string> cmdline;
111 Result<void> result = AddDex2oatArgsFromSystemServerArgs(args, cmdline);
112 EXPECT_TRUE(result.ok()) << "Failed expectation: " << result.error().message();
113 return cmdline;
114 }
115
116 bool DexoptBcpExtArgsIsInvalid(const DexoptBcpExtArgs& args) {
117 std::vector<std::string> cmdline;
118 Result<void> result = AddDex2oatArgsFromBcpExtensionArgs(args, cmdline);
119 return result.ok();
120 }
121
122 bool DexoptSystemServerArgsIsInvalid(const DexoptSystemServerArgs& args) {
123 std::vector<std::string> cmdline;
124 Result<void> result = AddDex2oatArgsFromSystemServerArgs(args, cmdline);
125 return result.ok();
126 }
127
128 DexoptBcpExtArgs default_bcp_ext_args_;
129 DexoptSystemServerArgs default_system_server_args_;
130};
131
132TEST_F(LibDexoptTest, AddDex2oatArgsFromBcpExtensionArgs) {
133 // Test basics with default args
134 {
135 std::vector<std::string> cmdline = Dex2oatArgsFromBcpExtensionArgs(default_bcp_ext_args_);
136
137 EXPECT_THAT(cmdline, AllOf(
138 Contains("--dex-fd=10"),
139 Contains("--dex-fd=11"),
140 Contains("--dex-file=/path/to/foo.jar"),
141 Contains("--dex-file=/path/to/bar.jar"),
142 Contains(HasSubstr("-Xbootclasspath:")),
143 Contains("-Xbootclasspathfds:21:22"),
144
145 Contains("--profile-file-fd=30"),
146 Contains("--compiler-filter=speed-profile"),
147
148 Contains("--image-fd=90"),
149 Contains("--output-vdex-fd=91"),
150 Contains("--oat-fd=92"),
151 Contains("--oat-location=/oat/location/bar.odex"),
152
153 Contains("--dirty-image-objects-fd=31"),
154 Contains("--instruction-set=x86_64"),
155 Contains("--cpu-set=0,1"),
156 Contains("-j42")));
157 }
158
159 // No profile
160 {
161 auto args = default_bcp_ext_args_;
162 args.profileFd = -1;
163 std::vector<std::string> cmdline = Dex2oatArgsFromBcpExtensionArgs(args);
164
165 EXPECT_THAT(cmdline, AllOf(
166 Not(Contains(HasSubstr("--profile-file-fd="))),
167 Contains("--compiler-filter=speed")));
168 }
169
170 // No dirty image objects fd
171 {
172 auto args = default_bcp_ext_args_;
173 args.dirtyImageObjectsFd = -1;
174 std::vector<std::string> cmdline = Dex2oatArgsFromBcpExtensionArgs(args);
175
176 EXPECT_THAT(cmdline, Not(Contains(HasSubstr("--dirty-image-objects-fd"))));
177 }
178}
179
180TEST_F(LibDexoptTest, AddDex2oatArgsFromBcpExtensionArgs_InvalidArguments) {
181 // Mismatched dex number
182 {
183 auto args = default_bcp_ext_args_;
184 args.dexPaths = {"/path/to/foo.jar", "/path/to/bar.jar"};
185 args.dexFds = {100, 101, 102};
186
187 EXPECT_FALSE(DexoptBcpExtArgsIsInvalid(args));
188 }
189
190 // Mismatched classpath arguments
191 {
192 auto args = default_bcp_ext_args_;
193 args.bootClasspathFds.emplace_back(200);
194
195 EXPECT_FALSE(DexoptBcpExtArgsIsInvalid(args));
196 }
197
198 // Mismatched classpath arguments
199 {
200 auto args = default_bcp_ext_args_;
201 args.bootClasspaths.emplace_back("/unrecognized/jar");
202
203 EXPECT_FALSE(DexoptBcpExtArgsIsInvalid(args));
204 }
205
206 // Missing output fds
207 {
208 auto args = default_bcp_ext_args_;
209 args.imageFd = -1;
210 EXPECT_FALSE(DexoptBcpExtArgsIsInvalid(args));
211
212 args = default_bcp_ext_args_;
213 args.vdexFd = -1;
214 EXPECT_FALSE(DexoptBcpExtArgsIsInvalid(args));
215
216 args = default_bcp_ext_args_;
217 args.oatFd = -1;
218 EXPECT_FALSE(DexoptBcpExtArgsIsInvalid(args));
219 }
220}
221
222TEST_F(LibDexoptTest, AddDex2oatArgsFromSystemServerArgs) {
223 // Test basics with default args
224 {
225 std::vector<std::string> cmdline = Dex2oatArgsFromSystemServerArgs(default_system_server_args_);
226
227 EXPECT_THAT(cmdline, AllOf(
228 Contains("--dex-fd=10"),
229 Contains("--dex-file=/path/to/foo.jar"),
230 Contains(HasSubstr("-Xbootclasspath:")),
231 Contains("-Xbootclasspathfds:21:22:23"),
232 Contains("-Xbootclasspathimagefds:-1:31:-1"),
233 Contains("-Xbootclasspathvdexfds:-1:32:-1"),
234 Contains("-Xbootclasspathoatfds:-1:33:-1"),
235
236 Contains("--profile-file-fd=11"),
237 Contains("--compiler-filter=speed-profile"),
238
239 Contains("--app-image-fd=90"),
240 Contains("--output-vdex-fd=91"),
241 Contains("--oat-fd=92"),
242 Contains("--oat-location=/oat/location/bar.odex"),
243
244 Contains("--class-loader-context-fds=40:41"),
245 Contains("--class-loader-context=PCL[/cl/abc.jar:/cl/def.jar]"),
246
247 Contains("--instruction-set=x86_64"),
248 Contains("--cpu-set=0,1"),
249 Contains("-j42")));
250 }
251
252 // Test different compiler filters
253 {
254 // speed
255 auto args = default_system_server_args_;
256 args.compilerFilter = CompilerFilter::SPEED;
257 std::vector<std::string> cmdline = Dex2oatArgsFromSystemServerArgs(args);
258
259 EXPECT_THAT(cmdline, AllOf(
260 Not(Contains(HasSubstr("--profile-file-fd="))),
261 Contains("--compiler-filter=speed")));
262
263 // verify
264 args = default_system_server_args_;
265 args.compilerFilter = CompilerFilter::VERIFY;
266 cmdline = Dex2oatArgsFromSystemServerArgs(args);
267
268 EXPECT_THAT(cmdline, AllOf(
269 Not(Contains(HasSubstr("--profile-file-fd="))),
270 Contains("--compiler-filter=verify")));
271 }
272
Jiakai Zhang9b7ddf62021-11-01 11:36:52 +0000273 // Test empty classloader context
Victor Hsieh73c4f792021-10-01 18:13:52 +0000274 {
275 auto args = default_system_server_args_;
276 args.classloaderFds = {};
277 args.classloaderContext = {};
278 std::vector<std::string> cmdline = Dex2oatArgsFromSystemServerArgs(args);
279
280 EXPECT_THAT(cmdline, AllOf(
281 Not(Contains(HasSubstr("--class-loader-context-fds"))),
282 Contains("--class-loader-context=PCL[]")));
283 }
Jiakai Zhang9b7ddf62021-11-01 11:36:52 +0000284
285 // Test classloader context as parent
286 {
287 auto args = default_system_server_args_;
288 args.classloaderContextAsParent = true;
289 std::vector<std::string> cmdline = Dex2oatArgsFromSystemServerArgs(args);
290
291 EXPECT_THAT(cmdline, Contains("--class-loader-context=PCL[];PCL[/cl/abc.jar:/cl/def.jar]"));
292 }
Victor Hsieh73c4f792021-10-01 18:13:52 +0000293}
294
295TEST_F(LibDexoptTest, AddDex2oatArgsFromSystemServerArgs_InvalidArguments) {
296 // Mismatched classpath arguments
297 {
298 auto args = default_system_server_args_;
299 args.bootClasspathFds.emplace_back(200);
300
301 EXPECT_FALSE(DexoptSystemServerArgsIsInvalid(args));
302 }
303
304 // Unrecognized jar path
305 {
306 auto args = default_system_server_args_;
307 args.bootClasspaths.emplace_back("/unrecognized/jar");
308
309 EXPECT_FALSE(DexoptSystemServerArgsIsInvalid(args));
310 }
311
312 // speed-profile without profile fd
313 {
314 auto args = default_system_server_args_;
315 args.compilerFilter = CompilerFilter::SPEED_PROFILE;
316 args.profileFd = -1;
317 EXPECT_FALSE(DexoptSystemServerArgsIsInvalid(args));
318 }
319
320 // Missing output fds
321 {
322 auto args = default_system_server_args_;
323 args.imageFd = -1;
324 EXPECT_FALSE(DexoptSystemServerArgsIsInvalid(args));
325
326 args = default_system_server_args_;
327 args.vdexFd = -1;
328 EXPECT_FALSE(DexoptSystemServerArgsIsInvalid(args));
329
330 args = default_system_server_args_;
331 args.oatFd = -1;
332 EXPECT_FALSE(DexoptSystemServerArgsIsInvalid(args));
333 }
334}
335
336} // namespace art