blob: b50f684f092d90a2a3f42f96e3738cb70ba8c151 [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
88 File fd(file.GetFilename(), O_RDONLY, /* check_usage */ false);
89 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(
95 fd.Release(), /* location */ file.GetFilename(), /* verify */ false,
96 /* verify_checksum */ true, /* mmap_shared */ false, &error_msg));
97 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(
182 "imethod", 0, /* native */ false, FindClass("LMain;", dex_file), dex_file);
183 }
184
David Brazdilf6a8a552018-01-15 18:10:50 +0000185 HiddenApiAccessFlags::ApiList GetSMethodHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000186 return GetMethodHiddenFlags(
187 "smethod", kAccPublic, /* native */ false, FindClass("LMain;", dex_file), dex_file);
188 }
189
David Brazdilf6a8a552018-01-15 18:10:50 +0000190 HiddenApiAccessFlags::ApiList GetINMethodHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000191 return GetMethodHiddenFlags(
192 "inmethod", kAccPublic, /* native */ true, FindClass("LMain;", dex_file), dex_file);
193 }
194
David Brazdilf6a8a552018-01-15 18:10:50 +0000195 HiddenApiAccessFlags::ApiList GetSNMethodHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000196 return GetMethodHiddenFlags(
197 "snmethod", kAccProtected, /* native */ true, FindClass("LMain;", dex_file), dex_file);
198 }
199};
200
201TEST_F(HiddenApiTest, InstanceFieldNoMatch) {
202 ScratchFile dex, light_greylist, dark_greylist, blacklist;
203 OpenStream(light_greylist) << "LMain;->ifield:LBadType1;" << std::endl;
204 OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl;
205 OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl;
206 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100207 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000208 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000209}
210
211TEST_F(HiddenApiTest, InstanceFieldLightGreylistMatch) {
212 ScratchFile dex, light_greylist, dark_greylist, blacklist;
213 OpenStream(light_greylist) << "LMain;->ifield:I" << std::endl;
214 OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl;
215 OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl;
216 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100217 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000218 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000219}
220
221TEST_F(HiddenApiTest, InstanceFieldDarkGreylistMatch) {
222 ScratchFile dex, light_greylist, dark_greylist, blacklist;
223 OpenStream(light_greylist) << "LMain;->ifield:LBadType1;" << std::endl;
224 OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl;
225 OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl;
226 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100227 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000228 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000229}
230
231TEST_F(HiddenApiTest, InstanceFieldBlacklistMatch) {
232 ScratchFile dex, light_greylist, dark_greylist, blacklist;
233 OpenStream(light_greylist) << "LMain;->ifield:LBadType1;" << std::endl;
234 OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl;
235 OpenStream(blacklist) << "LMain;->ifield:I" << std::endl;
236 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100237 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000238 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000239}
240
241TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch1) {
242 ScratchFile dex, light_greylist, dark_greylist, blacklist;
243 OpenStream(light_greylist) << "LMain;->ifield:LBadType1;" << std::endl;
244 OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl;
245 OpenStream(blacklist) << "LMain;->ifield:I" << std::endl;
246 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100247 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000248}
249
250TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch2) {
251 ScratchFile dex, light_greylist, dark_greylist, blacklist;
252 OpenStream(light_greylist) << "LMain;->ifield:I" << std::endl;
253 OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << 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, InstanceFieldTwoListsMatch3) {
260 ScratchFile dex, light_greylist, dark_greylist, blacklist;
261 OpenStream(light_greylist) << "LMain;->ifield:I" << std::endl;
262 OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl;
263 OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << 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, StaticFieldNoMatch) {
269 ScratchFile dex, light_greylist, dark_greylist, blacklist;
270 OpenStream(light_greylist) << "LMain;->sfield:LBadType1;" << std::endl;
271 OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl;
272 OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl;
273 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100274 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000275 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000276}
277
278TEST_F(HiddenApiTest, StaticFieldLightGreylistMatch) {
279 ScratchFile dex, light_greylist, dark_greylist, blacklist;
280 OpenStream(light_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
281 OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl;
282 OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl;
283 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100284 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000285 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000286}
287
288TEST_F(HiddenApiTest, StaticFieldDarkGreylistMatch) {
289 ScratchFile dex, light_greylist, dark_greylist, blacklist;
290 OpenStream(light_greylist) << "LMain;->sfield:LBadType1;" << std::endl;
291 OpenStream(dark_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
292 OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl;
293 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100294 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000295 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000296}
297
298TEST_F(HiddenApiTest, StaticFieldBlacklistMatch) {
299 ScratchFile dex, light_greylist, dark_greylist, blacklist;
300 OpenStream(light_greylist) << "LMain;->sfield:LBadType1;" << std::endl;
301 OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl;
302 OpenStream(blacklist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
303 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100304 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000305 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000306}
307
308TEST_F(HiddenApiTest, StaticFieldTwoListsMatch1) {
309 ScratchFile dex, light_greylist, dark_greylist, blacklist;
310 OpenStream(light_greylist) << "LMain;->sfield:LBadType1;" << std::endl;
311 OpenStream(dark_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
312 OpenStream(blacklist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
313 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100314 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000315}
316
317TEST_F(HiddenApiTest, StaticFieldTwoListsMatch2) {
318 ScratchFile dex, light_greylist, dark_greylist, blacklist;
319 OpenStream(light_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl;
320 OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << 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, StaticFieldTwoListsMatch3) {
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:Ljava/lang/Object;" << std::endl;
330 OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << 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, InstanceMethodNoMatch) {
336 ScratchFile dex, light_greylist, dark_greylist, blacklist;
337 OpenStream(light_greylist) << "LMain;->imethod(LBadType1;)V" << std::endl;
338 OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl;
339 OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl;
340 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100341 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000342 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000343}
344
345TEST_F(HiddenApiTest, InstanceMethodLightGreylistMatch) {
346 ScratchFile dex, light_greylist, dark_greylist, blacklist;
347 OpenStream(light_greylist) << "LMain;->imethod(J)V" << std::endl;
348 OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl;
349 OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl;
350 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100351 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000352 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000353}
354
355TEST_F(HiddenApiTest, InstanceMethodDarkGreylistMatch) {
356 ScratchFile dex, light_greylist, dark_greylist, blacklist;
357 OpenStream(light_greylist) << "LMain;->imethod(LBadType1;)V" << std::endl;
358 OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl;
359 OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl;
360 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100361 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000362 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000363}
364
365TEST_F(HiddenApiTest, InstanceMethodBlacklistMatch) {
366 ScratchFile dex, light_greylist, dark_greylist, blacklist;
367 OpenStream(light_greylist) << "LMain;->imethod(LBadType1;)V" << std::endl;
368 OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl;
369 OpenStream(blacklist) << "LMain;->imethod(J)V" << std::endl;
370 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100371 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000372 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000373}
374
375TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch1) {
376 ScratchFile dex, light_greylist, dark_greylist, blacklist;
377 OpenStream(light_greylist) << "LMain;->imethod(LBadType1;)V" << std::endl;
378 OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl;
379 OpenStream(blacklist) << "LMain;->imethod(J)V" << std::endl;
380 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100381 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000382}
383
384TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch2) {
385 ScratchFile dex, light_greylist, dark_greylist, blacklist;
386 OpenStream(light_greylist) << "LMain;->imethod(J)V" << std::endl;
387 OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)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, InstanceMethodTwoListsMatch3) {
394 ScratchFile dex, light_greylist, dark_greylist, blacklist;
395 OpenStream(light_greylist) << "LMain;->imethod(J)V" << std::endl;
396 OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl;
397 OpenStream(blacklist) << "LMain;->imethod(LBadType3;)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, StaticMethodNoMatch) {
403 ScratchFile dex, light_greylist, dark_greylist, blacklist;
404 OpenStream(light_greylist) << "LMain;->smethod(LBadType1;)V" << std::endl;
405 OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl;
406 OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl;
407 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100408 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000409 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000410}
411
412TEST_F(HiddenApiTest, StaticMethodLightGreylistMatch) {
413 ScratchFile dex, light_greylist, dark_greylist, blacklist;
414 OpenStream(light_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
415 OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl;
416 OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl;
417 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100418 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000419 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000420}
421
422TEST_F(HiddenApiTest, StaticMethodDarkGreylistMatch) {
423 ScratchFile dex, light_greylist, dark_greylist, blacklist;
424 OpenStream(light_greylist) << "LMain;->smethod(LBadType1;)V" << std::endl;
425 OpenStream(dark_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
426 OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl;
427 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100428 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000429 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000430}
431
432TEST_F(HiddenApiTest, StaticMethodBlacklistMatch) {
433 ScratchFile dex, light_greylist, dark_greylist, blacklist;
434 OpenStream(light_greylist) << "LMain;->smethod(LBadType1;)V" << std::endl;
435 OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl;
436 OpenStream(blacklist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
437 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100438 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000439 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000440}
441
442TEST_F(HiddenApiTest, StaticMethodTwoListsMatch1) {
443 ScratchFile dex, light_greylist, dark_greylist, blacklist;
444 OpenStream(light_greylist) << "LMain;->smethod(LBadType1;)V" << std::endl;
445 OpenStream(dark_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
446 OpenStream(blacklist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
447 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100448 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000449}
450
451TEST_F(HiddenApiTest, StaticMethodTwoListsMatch2) {
452 ScratchFile dex, light_greylist, dark_greylist, blacklist;
453 OpenStream(light_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl;
454 OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)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, StaticMethodTwoListsMatch3) {
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(Ljava/lang/Object;)V" << std::endl;
464 OpenStream(blacklist) << "LMain;->smethod(LBadType3;)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, InstanceNativeMethodNoMatch) {
470 ScratchFile dex, light_greylist, dark_greylist, blacklist;
471 OpenStream(light_greylist) << "LMain;->inmethod(LBadType1;)V" << std::endl;
472 OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl;
473 OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl;
474 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100475 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000476 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000477}
478
479TEST_F(HiddenApiTest, InstanceNativeMethodLightGreylistMatch) {
480 ScratchFile dex, light_greylist, dark_greylist, blacklist;
481 OpenStream(light_greylist) << "LMain;->inmethod(C)V" << std::endl;
482 OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl;
483 OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl;
484 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100485 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000486 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000487}
488
489TEST_F(HiddenApiTest, InstanceNativeMethodDarkGreylistMatch) {
490 ScratchFile dex, light_greylist, dark_greylist, blacklist;
491 OpenStream(light_greylist) << "LMain;->inmethod(LBadType1;)V" << std::endl;
492 OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl;
493 OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl;
494 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100495 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000496 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000497}
498
499TEST_F(HiddenApiTest, InstanceNativeMethodBlacklistMatch) {
500 ScratchFile dex, light_greylist, dark_greylist, blacklist;
501 OpenStream(light_greylist) << "LMain;->inmethod(LBadType1;)V" << std::endl;
502 OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl;
503 OpenStream(blacklist) << "LMain;->inmethod(C)V" << std::endl;
504 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100505 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000506 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000507}
508
509TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch1) {
510 ScratchFile dex, light_greylist, dark_greylist, blacklist;
511 OpenStream(light_greylist) << "LMain;->inmethod(LBadType1;)V" << std::endl;
512 OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl;
513 OpenStream(blacklist) << "LMain;->inmethod(C)V" << std::endl;
514 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100515 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000516}
517
518TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch2) {
519 ScratchFile dex, light_greylist, dark_greylist, blacklist;
520 OpenStream(light_greylist) << "LMain;->inmethod(C)V" << std::endl;
521 OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)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, InstanceNativeMethodTwoListsMatch3) {
528 ScratchFile dex, light_greylist, dark_greylist, blacklist;
529 OpenStream(light_greylist) << "LMain;->inmethod(C)V" << std::endl;
530 OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl;
531 OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)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, StaticNativeMethodNoMatch) {
537 ScratchFile dex, light_greylist, dark_greylist, blacklist;
538 OpenStream(light_greylist) << "LMain;->snmethod(LBadType1;)V" << std::endl;
539 OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl;
540 OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl;
541 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100542 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000543 ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000544}
545
546TEST_F(HiddenApiTest, StaticNativeMethodLightGreylistMatch) {
547 ScratchFile dex, light_greylist, dark_greylist, blacklist;
548 OpenStream(light_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
549 OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl;
550 OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl;
551 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100552 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000553 ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000554}
555
556TEST_F(HiddenApiTest, StaticNativeMethodDarkGreylistMatch) {
557 ScratchFile dex, light_greylist, dark_greylist, blacklist;
558 OpenStream(light_greylist) << "LMain;->snmethod(LBadType1;)V" << std::endl;
559 OpenStream(dark_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
560 OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl;
561 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100562 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000563 ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000564}
565
566TEST_F(HiddenApiTest, StaticNativeMethodBlacklistMatch) {
567 ScratchFile dex, light_greylist, dark_greylist, blacklist;
568 OpenStream(light_greylist) << "LMain;->snmethod(LBadType1;)V" << std::endl;
569 OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl;
570 OpenStream(blacklist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
571 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100572 ASSERT_NE(dex_file.get(), nullptr);
David Brazdilf6a8a552018-01-15 18:10:50 +0000573 ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000574}
575
576TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch1) {
577 ScratchFile dex, light_greylist, dark_greylist, blacklist;
578 OpenStream(light_greylist) << "LMain;->snmethod(LBadType1;)V" << std::endl;
579 OpenStream(dark_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
580 OpenStream(blacklist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
581 auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100582 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000583}
584
585TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch2) {
586 ScratchFile dex, light_greylist, dark_greylist, blacklist;
587 OpenStream(light_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl;
588 OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)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, StaticNativeMethodTwoListsMatch3) {
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(Ljava/lang/Integer;)V" << std::endl;
598 OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)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
603} // namespace art