blob: 799546e07bd0273c3bc09c975b4d110ff436093d [file] [log] [blame]
David Brazdil2b9c35b2018-01-12 15:44:43 +00001/*
2 * Copyright (C) 2017 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 <fstream>
18
19#include "base/unix_file/fd_file.h"
David Sehr79e26072018-04-06 17:58:50 -070020#include "base/zip_archive.h"
David Brazdil2b9c35b2018-01-12 15:44:43 +000021#include "common_runtime_test.h"
22#include "dex/art_dex_file_loader.h"
Mathieu Chartier396dc082018-08-06 12:29:57 -070023#include "dex/class_accessor-inl.h"
David Brazdil2b9c35b2018-01-12 15:44:43 +000024#include "dex/dex_file-inl.h"
25#include "exec_utils.h"
David Brazdil2b9c35b2018-01-12 15:44:43 +000026
27namespace art {
28
29class HiddenApiTest : public CommonRuntimeTest {
30 protected:
31 std::string GetHiddenApiCmd() {
32 std::string file_path = GetTestAndroidRoot();
33 file_path += "/bin/hiddenapi";
34 if (kIsDebugBuild) {
35 file_path += "d";
36 }
37 if (!OS::FileExists(file_path.c_str())) {
38 LOG(FATAL) << "Could not find binary " << file_path;
39 UNREACHABLE();
40 }
41 return file_path;
42 }
43
44 std::unique_ptr<const DexFile> RunHiddenApi(const ScratchFile& light_greylist,
45 const ScratchFile& dark_greylist,
46 const ScratchFile& blacklist,
47 const std::vector<std::string>& extra_args,
48 ScratchFile* out_dex) {
49 std::string error;
David Brazdil4572ade2018-01-17 09:26:47 +000050 std::unique_ptr<ZipArchive> jar(
51 ZipArchive::Open(GetTestDexFileName("HiddenApi").c_str(), &error));
David Brazdil2b9c35b2018-01-12 15:44:43 +000052 if (jar == nullptr) {
53 LOG(FATAL) << "Could not open test file " << GetTestDexFileName("HiddenApi") << ": " << error;
54 UNREACHABLE();
55 }
David Brazdil4572ade2018-01-17 09:26:47 +000056 std::unique_ptr<ZipEntry> jar_classes_dex(jar->Find("classes.dex", &error));
David Brazdil2b9c35b2018-01-12 15:44:43 +000057 if (jar_classes_dex == nullptr) {
58 LOG(FATAL) << "Could not find classes.dex in test file " << GetTestDexFileName("HiddenApi")
59 << ": " << error;
60 UNREACHABLE();
61 } else if (!jar_classes_dex->ExtractToFile(*out_dex->GetFile(), &error)) {
62 LOG(FATAL) << "Could not extract classes.dex from test file "
63 << GetTestDexFileName("HiddenApi") << ": " << error;
64 UNREACHABLE();
65 }
66
67 std::vector<std::string> argv_str;
68 argv_str.push_back(GetHiddenApiCmd());
69 argv_str.insert(argv_str.end(), extra_args.begin(), extra_args.end());
David Brazdil003e64b2018-06-27 13:20:52 +010070 argv_str.push_back("encode");
David Brazdil2b9c35b2018-01-12 15:44:43 +000071 argv_str.push_back("--dex=" + out_dex->GetFilename());
72 argv_str.push_back("--light-greylist=" + light_greylist.GetFilename());
73 argv_str.push_back("--dark-greylist=" + dark_greylist.GetFilename());
74 argv_str.push_back("--blacklist=" + blacklist.GetFilename());
75 int return_code = ExecAndReturnCode(argv_str, &error);
David Brazdil003e64b2018-06-27 13:20:52 +010076 if (return_code == 0) {
77 return OpenDex(*out_dex);
78 } else {
79 LOG(ERROR) << "HiddenApi binary exited with unexpected return code " << return_code;
80 return nullptr;
David Brazdil2b9c35b2018-01-12 15:44:43 +000081 }
David Brazdil2b9c35b2018-01-12 15:44:43 +000082 }
83
84 std::unique_ptr<const DexFile> OpenDex(const ScratchFile& file) {
85 ArtDexFileLoader dex_loader;
86 std::string error_msg;
87
Andreas Gampe9b031f72018-10-04 11:03:34 -070088 File fd(file.GetFilename(), O_RDONLY, /* check_usage= */ false);
David Brazdil2b9c35b2018-01-12 15:44:43 +000089 if (fd.Fd() == -1) {
90 LOG(FATAL) << "Unable to open file '" << file.GetFilename() << "': " << strerror(errno);
91 UNREACHABLE();
92 }
93
94 std::unique_ptr<const DexFile> dex_file(dex_loader.OpenDex(
Andreas Gampe9b031f72018-10-04 11:03:34 -070095 fd.Release(), /* location= */ file.GetFilename(), /* verify= */ false,
96 /* verify_checksum= */ true, /* mmap_shared= */ false, &error_msg));
David Brazdil2b9c35b2018-01-12 15:44:43 +000097 if (dex_file.get() == nullptr) {
98 LOG(FATAL) << "Open failed for '" << file.GetFilename() << "' " << error_msg;
99 UNREACHABLE();
100 } else if (!dex_file->IsStandardDexFile()) {
101 LOG(FATAL) << "Expected a standard dex file '" << file.GetFilename() << "'";
102 UNREACHABLE();
103 }
104
105 return dex_file;
106 }
107
108 std::ofstream OpenStream(const ScratchFile& file) {
109 std::ofstream ofs(file.GetFilename(), std::ofstream::out);
110 if (ofs.fail()) {
111 LOG(FATAL) << "Open failed for '" << file.GetFilename() << "' " << strerror(errno);
112 UNREACHABLE();
113 }
114 return ofs;
115 }
116
117 const DexFile::ClassDef& FindClass(const char* desc, const DexFile& dex_file) {
Mathieu Chartier396dc082018-08-06 12:29:57 -0700118 const DexFile::TypeId* type_id = dex_file.FindTypeId(desc);
119 CHECK(type_id != nullptr) << "Could not find class " << desc;
120 const DexFile::ClassDef* found = dex_file.FindClassDef(dex_file.GetIndexForTypeId(*type_id));
121 CHECK(found != nullptr) << "Could not find class " << desc;
122 return *found;
David Brazdil2b9c35b2018-01-12 15:44:43 +0000123 }
124
David Brazdilf6a8a552018-01-15 18:10:50 +0000125 HiddenApiAccessFlags::ApiList GetFieldHiddenFlags(const char* name,
David Brazdil2b9c35b2018-01-12 15:44:43 +0000126 uint32_t expected_visibility,
127 const DexFile::ClassDef& class_def,
128 const DexFile& dex_file) {
Mathieu Chartier396dc082018-08-06 12:29:57 -0700129 ClassAccessor accessor(dex_file, class_def);
130 CHECK(accessor.HasClassData()) << "Class " << accessor.GetDescriptor() << " has no data";
David Brazdil2b9c35b2018-01-12 15:44:43 +0000131
Mathieu Chartier396dc082018-08-06 12:29:57 -0700132 for (const ClassAccessor::Field& field : accessor.GetFields()) {
133 const DexFile::FieldId& fid = dex_file.GetFieldId(field.GetIndex());
David Brazdil2b9c35b2018-01-12 15:44:43 +0000134 if (strcmp(name, dex_file.GetFieldName(fid)) == 0) {
Mathieu Chartier396dc082018-08-06 12:29:57 -0700135 const uint32_t actual_visibility = field.GetAccessFlags() & kAccVisibilityFlags;
136 CHECK_EQ(actual_visibility, expected_visibility)
137 << "Field " << name << " in class " << accessor.GetDescriptor();
138 return field.DecodeHiddenAccessFlags();
David Brazdil2b9c35b2018-01-12 15:44:43 +0000139 }
140 }
141
142 LOG(FATAL) << "Could not find field " << name << " in class "
143 << dex_file.GetClassDescriptor(class_def);
144 UNREACHABLE();
145 }
146
David Brazdilf6a8a552018-01-15 18:10:50 +0000147 HiddenApiAccessFlags::ApiList GetMethodHiddenFlags(const char* name,
David Brazdil2b9c35b2018-01-12 15:44:43 +0000148 uint32_t expected_visibility,
149 bool expected_native,
150 const DexFile::ClassDef& class_def,
151 const DexFile& dex_file) {
Mathieu Chartier396dc082018-08-06 12:29:57 -0700152 ClassAccessor accessor(dex_file, class_def);
153 CHECK(accessor.HasClassData()) << "Class " << accessor.GetDescriptor() << " has no data";
David Brazdil2b9c35b2018-01-12 15:44:43 +0000154
Mathieu Chartier396dc082018-08-06 12:29:57 -0700155 for (const ClassAccessor::Method& method : accessor.GetMethods()) {
156 const DexFile::MethodId& mid = dex_file.GetMethodId(method.GetIndex());
David Brazdil2b9c35b2018-01-12 15:44:43 +0000157 if (strcmp(name, dex_file.GetMethodName(mid)) == 0) {
Mathieu Chartier396dc082018-08-06 12:29:57 -0700158 CHECK_EQ(expected_native, method.MemberIsNative())
159 << "Method " << name << " in class " << accessor.GetDescriptor();
160 const uint32_t actual_visibility = method.GetAccessFlags() & kAccVisibilityFlags;
161 CHECK_EQ(actual_visibility, expected_visibility)
162 << "Method " << name << " in class " << accessor.GetDescriptor();
163 return method.DecodeHiddenAccessFlags();
David Brazdil2b9c35b2018-01-12 15:44:43 +0000164 }
165 }
166
167 LOG(FATAL) << "Could not find method " << name << " in class "
168 << dex_file.GetClassDescriptor(class_def);
169 UNREACHABLE();
170 }
171
David Brazdilf6a8a552018-01-15 18:10:50 +0000172 HiddenApiAccessFlags::ApiList GetIFieldHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000173 return GetFieldHiddenFlags("ifield", kAccPublic, FindClass("LMain;", dex_file), dex_file);
174 }
175
David Brazdilf6a8a552018-01-15 18:10:50 +0000176 HiddenApiAccessFlags::ApiList GetSFieldHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000177 return GetFieldHiddenFlags("sfield", kAccPrivate, FindClass("LMain;", dex_file), dex_file);
178 }
179
David Brazdilf6a8a552018-01-15 18:10:50 +0000180 HiddenApiAccessFlags::ApiList GetIMethodHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000181 return GetMethodHiddenFlags(
Andreas Gampe9b031f72018-10-04 11:03:34 -0700182 "imethod", 0, /* expected_native= */ false, FindClass("LMain;", dex_file), dex_file);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000183 }
184
David Brazdilf6a8a552018-01-15 18:10:50 +0000185 HiddenApiAccessFlags::ApiList GetSMethodHiddenFlags(const DexFile& dex_file) {
Andreas Gampe9b031f72018-10-04 11:03:34 -0700186 return GetMethodHiddenFlags("smethod",
187 kAccPublic,
188 /* expected_native= */ false,
189 FindClass("LMain;", dex_file),
190 dex_file);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000191 }
192
David Brazdilf6a8a552018-01-15 18:10:50 +0000193 HiddenApiAccessFlags::ApiList GetINMethodHiddenFlags(const DexFile& dex_file) {
Andreas Gampe9b031f72018-10-04 11:03:34 -0700194 return GetMethodHiddenFlags("inmethod",
195 kAccPublic,
196 /* expected_native= */ true,
197 FindClass("LMain;", dex_file),
198 dex_file);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000199 }
200
David Brazdilf6a8a552018-01-15 18:10:50 +0000201 HiddenApiAccessFlags::ApiList GetSNMethodHiddenFlags(const DexFile& dex_file) {
Andreas Gampe9b031f72018-10-04 11:03:34 -0700202 return GetMethodHiddenFlags("snmethod",
203 kAccProtected,
204 /* expected_native= */ true,
205 FindClass("LMain;", dex_file),
206 dex_file);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000207 }
208};
209
210TEST_F(HiddenApiTest, InstanceFieldNoMatch) {
211 ScratchFile dex, light_greylist, dark_greylist, blacklist;
212 OpenStream(light_greylist) << "LMain;->ifield:LBadType1;" << std::endl;
213 OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl;
214 OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl;
215 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100216 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000217 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000218}
219
220TEST_F(HiddenApiTest, InstanceFieldLightGreylistMatch) {
221 ScratchFile dex, light_greylist, dark_greylist, blacklist;
222 OpenStream(light_greylist) << "LMain;->ifield:I" << std::endl;
223 OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl;
224 OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl;
225 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100226 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000227 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000228}
229
230TEST_F(HiddenApiTest, InstanceFieldDarkGreylistMatch) {
231 ScratchFile dex, light_greylist, dark_greylist, blacklist;
232 OpenStream(light_greylist) << "LMain;->ifield:LBadType1;" << std::endl;
233 OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl;
234 OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl;
235 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100236 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000237 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000238}
239
240TEST_F(HiddenApiTest, InstanceFieldBlacklistMatch) {
241 ScratchFile dex, light_greylist, dark_greylist, blacklist;
242 OpenStream(light_greylist) << "LMain;->ifield:LBadType1;" << std::endl;
243 OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl;
244 OpenStream(blacklist) << "LMain;->ifield:I" << std::endl;
245 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100246 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000247 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000248}
249
250TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch1) {
251 ScratchFile dex, light_greylist, dark_greylist, blacklist;
252 OpenStream(light_greylist) << "LMain;->ifield:LBadType1;" << std::endl;
253 OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl;
254 OpenStream(blacklist) << "LMain;->ifield:I" << std::endl;
255 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100256 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000257}
258
259TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch2) {
260 ScratchFile dex, light_greylist, dark_greylist, blacklist;
261 OpenStream(light_greylist) << "LMain;->ifield:I" << std::endl;
262 OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl;
263 OpenStream(blacklist) << "LMain;->ifield:I" << std::endl;
264 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100265 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000266}
267
268TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch3) {
269 ScratchFile dex, light_greylist, dark_greylist, blacklist;
270 OpenStream(light_greylist) << "LMain;->ifield:I" << std::endl;
271 OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl;
272 OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl;
273 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100274 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000275}
276
277TEST_F(HiddenApiTest, StaticFieldNoMatch) {
278 ScratchFile dex, light_greylist, dark_greylist, blacklist;
279 OpenStream(light_greylist) << "LMain;->sfield:LBadType1;" << std::endl;
280 OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl;
281 OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl;
282 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100283 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000284 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000285}
286
287TEST_F(HiddenApiTest, StaticFieldLightGreylistMatch) {
288 ScratchFile dex, light_greylist, dark_greylist, blacklist;
289 OpenStream(light_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
290 OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl;
291 OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl;
292 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100293 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000294 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000295}
296
297TEST_F(HiddenApiTest, StaticFieldDarkGreylistMatch) {
298 ScratchFile dex, light_greylist, dark_greylist, blacklist;
299 OpenStream(light_greylist) << "LMain;->sfield:LBadType1;" << std::endl;
300 OpenStream(dark_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
301 OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl;
302 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100303 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000304 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000305}
306
307TEST_F(HiddenApiTest, StaticFieldBlacklistMatch) {
308 ScratchFile dex, light_greylist, dark_greylist, blacklist;
309 OpenStream(light_greylist) << "LMain;->sfield:LBadType1;" << std::endl;
310 OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl;
311 OpenStream(blacklist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
312 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100313 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000314 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000315}
316
317TEST_F(HiddenApiTest, StaticFieldTwoListsMatch1) {
318 ScratchFile dex, light_greylist, dark_greylist, blacklist;
319 OpenStream(light_greylist) << "LMain;->sfield:LBadType1;" << std::endl;
320 OpenStream(dark_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
321 OpenStream(blacklist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
322 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100323 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000324}
325
326TEST_F(HiddenApiTest, StaticFieldTwoListsMatch2) {
327 ScratchFile dex, light_greylist, dark_greylist, blacklist;
328 OpenStream(light_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
329 OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl;
330 OpenStream(blacklist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
331 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100332 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000333}
334
335TEST_F(HiddenApiTest, StaticFieldTwoListsMatch3) {
336 ScratchFile dex, light_greylist, dark_greylist, blacklist;
337 OpenStream(light_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
338 OpenStream(dark_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
339 OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl;
340 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100341 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000342}
343
344TEST_F(HiddenApiTest, InstanceMethodNoMatch) {
345 ScratchFile dex, light_greylist, dark_greylist, blacklist;
346 OpenStream(light_greylist) << "LMain;->imethod(LBadType1;)V" << std::endl;
347 OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl;
348 OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl;
349 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100350 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000351 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000352}
353
354TEST_F(HiddenApiTest, InstanceMethodLightGreylistMatch) {
355 ScratchFile dex, light_greylist, dark_greylist, blacklist;
356 OpenStream(light_greylist) << "LMain;->imethod(J)V" << std::endl;
357 OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl;
358 OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl;
359 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100360 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000361 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000362}
363
364TEST_F(HiddenApiTest, InstanceMethodDarkGreylistMatch) {
365 ScratchFile dex, light_greylist, dark_greylist, blacklist;
366 OpenStream(light_greylist) << "LMain;->imethod(LBadType1;)V" << std::endl;
367 OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl;
368 OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl;
369 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100370 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000371 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000372}
373
374TEST_F(HiddenApiTest, InstanceMethodBlacklistMatch) {
375 ScratchFile dex, light_greylist, dark_greylist, blacklist;
376 OpenStream(light_greylist) << "LMain;->imethod(LBadType1;)V" << std::endl;
377 OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl;
378 OpenStream(blacklist) << "LMain;->imethod(J)V" << std::endl;
379 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100380 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000381 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000382}
383
384TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch1) {
385 ScratchFile dex, light_greylist, dark_greylist, blacklist;
386 OpenStream(light_greylist) << "LMain;->imethod(LBadType1;)V" << std::endl;
387 OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl;
388 OpenStream(blacklist) << "LMain;->imethod(J)V" << std::endl;
389 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100390 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000391}
392
393TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch2) {
394 ScratchFile dex, light_greylist, dark_greylist, blacklist;
395 OpenStream(light_greylist) << "LMain;->imethod(J)V" << std::endl;
396 OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl;
397 OpenStream(blacklist) << "LMain;->imethod(J)V" << std::endl;
398 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100399 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000400}
401
402TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch3) {
403 ScratchFile dex, light_greylist, dark_greylist, blacklist;
404 OpenStream(light_greylist) << "LMain;->imethod(J)V" << std::endl;
405 OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl;
406 OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl;
407 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100408 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000409}
410
411TEST_F(HiddenApiTest, StaticMethodNoMatch) {
412 ScratchFile dex, light_greylist, dark_greylist, blacklist;
413 OpenStream(light_greylist) << "LMain;->smethod(LBadType1;)V" << std::endl;
414 OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl;
415 OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl;
416 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100417 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000418 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000419}
420
421TEST_F(HiddenApiTest, StaticMethodLightGreylistMatch) {
422 ScratchFile dex, light_greylist, dark_greylist, blacklist;
423 OpenStream(light_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
424 OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl;
425 OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl;
426 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100427 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000428 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000429}
430
431TEST_F(HiddenApiTest, StaticMethodDarkGreylistMatch) {
432 ScratchFile dex, light_greylist, dark_greylist, blacklist;
433 OpenStream(light_greylist) << "LMain;->smethod(LBadType1;)V" << std::endl;
434 OpenStream(dark_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
435 OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl;
436 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100437 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000438 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000439}
440
441TEST_F(HiddenApiTest, StaticMethodBlacklistMatch) {
442 ScratchFile dex, light_greylist, dark_greylist, blacklist;
443 OpenStream(light_greylist) << "LMain;->smethod(LBadType1;)V" << std::endl;
444 OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl;
445 OpenStream(blacklist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
446 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100447 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000448 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000449}
450
451TEST_F(HiddenApiTest, StaticMethodTwoListsMatch1) {
452 ScratchFile dex, light_greylist, dark_greylist, blacklist;
453 OpenStream(light_greylist) << "LMain;->smethod(LBadType1;)V" << std::endl;
454 OpenStream(dark_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
455 OpenStream(blacklist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
456 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100457 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000458}
459
460TEST_F(HiddenApiTest, StaticMethodTwoListsMatch2) {
461 ScratchFile dex, light_greylist, dark_greylist, blacklist;
462 OpenStream(light_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
463 OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl;
464 OpenStream(blacklist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
465 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100466 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000467}
468
469TEST_F(HiddenApiTest, StaticMethodTwoListsMatch3) {
470 ScratchFile dex, light_greylist, dark_greylist, blacklist;
471 OpenStream(light_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
472 OpenStream(dark_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
473 OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl;
474 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100475 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000476}
477
478TEST_F(HiddenApiTest, InstanceNativeMethodNoMatch) {
479 ScratchFile dex, light_greylist, dark_greylist, blacklist;
480 OpenStream(light_greylist) << "LMain;->inmethod(LBadType1;)V" << std::endl;
481 OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl;
482 OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl;
483 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100484 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000485 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000486}
487
488TEST_F(HiddenApiTest, InstanceNativeMethodLightGreylistMatch) {
489 ScratchFile dex, light_greylist, dark_greylist, blacklist;
490 OpenStream(light_greylist) << "LMain;->inmethod(C)V" << std::endl;
491 OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl;
492 OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl;
493 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100494 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000495 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000496}
497
498TEST_F(HiddenApiTest, InstanceNativeMethodDarkGreylistMatch) {
499 ScratchFile dex, light_greylist, dark_greylist, blacklist;
500 OpenStream(light_greylist) << "LMain;->inmethod(LBadType1;)V" << std::endl;
501 OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl;
502 OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl;
503 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100504 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000505 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000506}
507
508TEST_F(HiddenApiTest, InstanceNativeMethodBlacklistMatch) {
509 ScratchFile dex, light_greylist, dark_greylist, blacklist;
510 OpenStream(light_greylist) << "LMain;->inmethod(LBadType1;)V" << std::endl;
511 OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl;
512 OpenStream(blacklist) << "LMain;->inmethod(C)V" << std::endl;
513 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100514 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000515 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000516}
517
518TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch1) {
519 ScratchFile dex, light_greylist, dark_greylist, blacklist;
520 OpenStream(light_greylist) << "LMain;->inmethod(LBadType1;)V" << std::endl;
521 OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl;
522 OpenStream(blacklist) << "LMain;->inmethod(C)V" << std::endl;
523 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100524 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000525}
526
527TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch2) {
528 ScratchFile dex, light_greylist, dark_greylist, blacklist;
529 OpenStream(light_greylist) << "LMain;->inmethod(C)V" << std::endl;
530 OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl;
531 OpenStream(blacklist) << "LMain;->inmethod(C)V" << std::endl;
532 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100533 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000534}
535
536TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch3) {
537 ScratchFile dex, light_greylist, dark_greylist, blacklist;
538 OpenStream(light_greylist) << "LMain;->inmethod(C)V" << std::endl;
539 OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl;
540 OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl;
541 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100542 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000543}
544
545TEST_F(HiddenApiTest, StaticNativeMethodNoMatch) {
546 ScratchFile dex, light_greylist, dark_greylist, blacklist;
547 OpenStream(light_greylist) << "LMain;->snmethod(LBadType1;)V" << std::endl;
548 OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl;
549 OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl;
550 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100551 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000552 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000553}
554
555TEST_F(HiddenApiTest, StaticNativeMethodLightGreylistMatch) {
556 ScratchFile dex, light_greylist, dark_greylist, blacklist;
557 OpenStream(light_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
558 OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl;
559 OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl;
560 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100561 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000562 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000563}
564
565TEST_F(HiddenApiTest, StaticNativeMethodDarkGreylistMatch) {
566 ScratchFile dex, light_greylist, dark_greylist, blacklist;
567 OpenStream(light_greylist) << "LMain;->snmethod(LBadType1;)V" << std::endl;
568 OpenStream(dark_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
569 OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl;
570 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100571 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000572 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000573}
574
575TEST_F(HiddenApiTest, StaticNativeMethodBlacklistMatch) {
576 ScratchFile dex, light_greylist, dark_greylist, blacklist;
577 OpenStream(light_greylist) << "LMain;->snmethod(LBadType1;)V" << std::endl;
578 OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl;
579 OpenStream(blacklist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
580 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100581 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000582 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000583}
584
585TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch1) {
586 ScratchFile dex, light_greylist, dark_greylist, blacklist;
587 OpenStream(light_greylist) << "LMain;->snmethod(LBadType1;)V" << std::endl;
588 OpenStream(dark_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
589 OpenStream(blacklist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
590 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100591 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000592}
593
594TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch2) {
595 ScratchFile dex, light_greylist, dark_greylist, blacklist;
596 OpenStream(light_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
597 OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl;
598 OpenStream(blacklist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
599 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100600 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000601}
602
603TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch3) {
604 ScratchFile dex, light_greylist, dark_greylist, blacklist;
605 OpenStream(light_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
606 OpenStream(dark_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
607 OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl;
608 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100609 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000610}
611
612} // namespace art