blob: 7c9a95cbfdc7de1fefc0ffee94314cc345d497c1 [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
David Brazdil2da3cbb2019-01-30 16:17:50 +000019#include "android-base/strings.h"
20
David Brazdil2b9c35b2018-01-12 15:44:43 +000021#include "base/unix_file/fd_file.h"
David Sehr79e26072018-04-06 17:58:50 -070022#include "base/zip_archive.h"
David Brazdil2b9c35b2018-01-12 15:44:43 +000023#include "common_runtime_test.h"
24#include "dex/art_dex_file_loader.h"
Mathieu Chartier396dc082018-08-06 12:29:57 -070025#include "dex/class_accessor-inl.h"
David Brazdil2b9c35b2018-01-12 15:44:43 +000026#include "dex/dex_file-inl.h"
27#include "exec_utils.h"
David Brazdil2b9c35b2018-01-12 15:44:43 +000028
29namespace art {
30
31class HiddenApiTest : public CommonRuntimeTest {
32 protected:
33 std::string GetHiddenApiCmd() {
Roland Levillainfb6a5c02019-03-29 20:20:16 +000034 std::string file_path = GetAndroidRuntimeBinDir() + "/hiddenapi";
David Brazdil2b9c35b2018-01-12 15:44:43 +000035 if (kIsDebugBuild) {
Roland Levillainfb6a5c02019-03-29 20:20:16 +000036 file_path += 'd';
David Brazdil2b9c35b2018-01-12 15:44:43 +000037 }
38 if (!OS::FileExists(file_path.c_str())) {
39 LOG(FATAL) << "Could not find binary " << file_path;
40 UNREACHABLE();
41 }
42 return file_path;
43 }
44
David Brazdil2da3cbb2019-01-30 16:17:50 +000045 std::unique_ptr<const DexFile> RunHiddenapiEncode(const ScratchFile& flags_csv,
46 const std::vector<std::string>& extra_args,
47 const ScratchFile& out_dex) {
David Brazdil2b9c35b2018-01-12 15:44:43 +000048 std::string error;
David Brazdil20c765f2018-10-27 21:45:15 +000049 ScratchFile in_dex;
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();
David Brazdil20c765f2018-10-27 21:45:15 +000061 } else if (!jar_classes_dex->ExtractToFile(*in_dex.GetFile(), &error)) {
David Brazdil2b9c35b2018-01-12 15:44:43 +000062 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 Brazdil20c765f2018-10-27 21:45:15 +000071 argv_str.push_back("--input-dex=" + in_dex.GetFilename());
David Brazdil2da3cbb2019-01-30 16:17:50 +000072 argv_str.push_back("--output-dex=" + out_dex.GetFilename());
David Brazdil91690d32018-11-04 18:07:23 +000073 argv_str.push_back("--api-flags=" + flags_csv.GetFilename());
74 argv_str.push_back("--no-force-assign-all");
David Brazdil2b9c35b2018-01-12 15:44:43 +000075 int return_code = ExecAndReturnCode(argv_str, &error);
David Brazdil003e64b2018-06-27 13:20:52 +010076 if (return_code == 0) {
David Brazdil2da3cbb2019-01-30 16:17:50 +000077 return OpenDex(out_dex);
David Brazdil003e64b2018-06-27 13:20:52 +010078 } 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
David Brazdil2da3cbb2019-01-30 16:17:50 +000084 bool RunHiddenapiList(const ScratchFile& out_flags_csv) {
85 std::string error;
86 std::string boot_jar = GetTestDexFileName("HiddenApi");
87 std::string stub_jar = GetTestDexFileName("HiddenApiStubs");
88 std::string boot_cp = android::base::Join(GetLibCoreDexFileNames(), ":");
89
90 std::vector<std::string> argv_str;
91 argv_str.push_back(GetHiddenApiCmd());
92 argv_str.push_back("list");
93 for (const std::string& core_jar : GetLibCoreDexFileNames()) {
94 argv_str.push_back("--boot-dex=" + core_jar);
95 }
96 argv_str.push_back("--boot-dex=" + boot_jar);
97 argv_str.push_back("--public-stub-classpath=" + boot_cp + ":" + stub_jar);
98 argv_str.push_back("--out-api-flags=" + out_flags_csv.GetFilename());
99 int return_code = ExecAndReturnCode(argv_str, &error);
100 if (return_code == 0) {
101 return true;
102 } else {
103 LOG(ERROR) << "HiddenApi binary exited with unexpected return code " << return_code;
104 return false;
105 }
106 }
107
David Brazdil2b9c35b2018-01-12 15:44:43 +0000108 std::unique_ptr<const DexFile> OpenDex(const ScratchFile& file) {
109 ArtDexFileLoader dex_loader;
110 std::string error_msg;
111
Andreas Gampe9b031f72018-10-04 11:03:34 -0700112 File fd(file.GetFilename(), O_RDONLY, /* check_usage= */ false);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000113 if (fd.Fd() == -1) {
Elliott Hughes23a8eb62019-03-08 12:37:33 -0800114 PLOG(FATAL) << "Unable to open file '" << file.GetFilename() << "'";
David Brazdil2b9c35b2018-01-12 15:44:43 +0000115 UNREACHABLE();
116 }
117
118 std::unique_ptr<const DexFile> dex_file(dex_loader.OpenDex(
David Brazdil20c765f2018-10-27 21:45:15 +0000119 fd.Release(), /* location= */ file.GetFilename(), /* verify= */ true,
Andreas Gampe9b031f72018-10-04 11:03:34 -0700120 /* verify_checksum= */ true, /* mmap_shared= */ false, &error_msg));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000121 if (dex_file.get() == nullptr) {
122 LOG(FATAL) << "Open failed for '" << file.GetFilename() << "' " << error_msg;
123 UNREACHABLE();
124 } else if (!dex_file->IsStandardDexFile()) {
125 LOG(FATAL) << "Expected a standard dex file '" << file.GetFilename() << "'";
126 UNREACHABLE();
127 }
128
129 return dex_file;
130 }
131
132 std::ofstream OpenStream(const ScratchFile& file) {
133 std::ofstream ofs(file.GetFilename(), std::ofstream::out);
134 if (ofs.fail()) {
Elliott Hughes23a8eb62019-03-08 12:37:33 -0800135 PLOG(FATAL) << "Open failed for '" << file.GetFilename() << "'";
David Brazdil2b9c35b2018-01-12 15:44:43 +0000136 UNREACHABLE();
137 }
138 return ofs;
139 }
140
David Brazdil2da3cbb2019-01-30 16:17:50 +0000141 std::map<std::string, std::string> ReadFlagsCsvFile(const ScratchFile& file) {
142 std::ifstream ifs(file.GetFilename());
143 std::map<std::string, std::string> flags;
144
145 for (std::string line; std::getline(ifs, line);) {
146 std::size_t comma = line.find(",");
147 if (comma == std::string::npos) {
148 flags.emplace(line, "");
149 } else {
150 flags.emplace(line.substr(0, comma), line.substr(comma + 1));
151 }
152 }
153
154 return flags;
155 }
156
157 std::string SafeMapGet(const std::string& key, const std::map<std::string, std::string>& map) {
158 auto it = map.find(key);
159 if (it == map.end()) {
160 LOG(FATAL) << "Key not found: " << key;
161 UNREACHABLE();
162 }
163 return it->second;
164 }
165
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800166 const dex::ClassDef& FindClass(const char* desc, const DexFile& dex_file) {
167 const dex::TypeId* type_id = dex_file.FindTypeId(desc);
Mathieu Chartier396dc082018-08-06 12:29:57 -0700168 CHECK(type_id != nullptr) << "Could not find class " << desc;
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800169 const dex::ClassDef* found = dex_file.FindClassDef(dex_file.GetIndexForTypeId(*type_id));
Mathieu Chartier396dc082018-08-06 12:29:57 -0700170 CHECK(found != nullptr) << "Could not find class " << desc;
171 return *found;
David Brazdil2b9c35b2018-01-12 15:44:43 +0000172 }
173
David Brazdil47cd2722018-10-23 12:50:02 +0100174 hiddenapi::ApiList GetFieldHiddenFlags(const char* name,
175 uint32_t expected_visibility,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800176 const dex::ClassDef& class_def,
David Brazdil47cd2722018-10-23 12:50:02 +0100177 const DexFile& dex_file) {
David Brazdil20c765f2018-10-27 21:45:15 +0000178 ClassAccessor accessor(dex_file, class_def, /* parse hiddenapi flags */ true);
Mathieu Chartier396dc082018-08-06 12:29:57 -0700179 CHECK(accessor.HasClassData()) << "Class " << accessor.GetDescriptor() << " has no data";
David Brazdil2b9c35b2018-01-12 15:44:43 +0000180
David Brazdil20c765f2018-10-27 21:45:15 +0000181 if (!accessor.HasHiddenapiClassData()) {
David Brazdildcfa89b2018-10-31 11:04:10 +0000182 return hiddenapi::ApiList::Whitelist();
David Brazdil20c765f2018-10-27 21:45:15 +0000183 }
184
Mathieu Chartier396dc082018-08-06 12:29:57 -0700185 for (const ClassAccessor::Field& field : accessor.GetFields()) {
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800186 const dex::FieldId& fid = dex_file.GetFieldId(field.GetIndex());
David Brazdil2b9c35b2018-01-12 15:44:43 +0000187 if (strcmp(name, dex_file.GetFieldName(fid)) == 0) {
Mathieu Chartier396dc082018-08-06 12:29:57 -0700188 const uint32_t actual_visibility = field.GetAccessFlags() & kAccVisibilityFlags;
189 CHECK_EQ(actual_visibility, expected_visibility)
190 << "Field " << name << " in class " << accessor.GetDescriptor();
David Brazdil90faceb2018-12-14 14:36:15 +0000191 return hiddenapi::ApiList(field.GetHiddenapiFlags());
David Brazdil2b9c35b2018-01-12 15:44:43 +0000192 }
193 }
194
195 LOG(FATAL) << "Could not find field " << name << " in class "
196 << dex_file.GetClassDescriptor(class_def);
197 UNREACHABLE();
198 }
199
David Brazdil47cd2722018-10-23 12:50:02 +0100200 hiddenapi::ApiList GetMethodHiddenFlags(const char* name,
201 uint32_t expected_visibility,
202 bool expected_native,
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800203 const dex::ClassDef& class_def,
David Brazdil47cd2722018-10-23 12:50:02 +0100204 const DexFile& dex_file) {
David Brazdil20c765f2018-10-27 21:45:15 +0000205 ClassAccessor accessor(dex_file, class_def, /* parse hiddenapi flags */ true);
Mathieu Chartier396dc082018-08-06 12:29:57 -0700206 CHECK(accessor.HasClassData()) << "Class " << accessor.GetDescriptor() << " has no data";
David Brazdil2b9c35b2018-01-12 15:44:43 +0000207
David Brazdil20c765f2018-10-27 21:45:15 +0000208 if (!accessor.HasHiddenapiClassData()) {
David Brazdildcfa89b2018-10-31 11:04:10 +0000209 return hiddenapi::ApiList::Whitelist();
David Brazdil20c765f2018-10-27 21:45:15 +0000210 }
211
Mathieu Chartier396dc082018-08-06 12:29:57 -0700212 for (const ClassAccessor::Method& method : accessor.GetMethods()) {
Andreas Gampe3f1dcd32018-12-28 09:39:56 -0800213 const dex::MethodId& mid = dex_file.GetMethodId(method.GetIndex());
David Brazdil2b9c35b2018-01-12 15:44:43 +0000214 if (strcmp(name, dex_file.GetMethodName(mid)) == 0) {
Mathieu Chartier396dc082018-08-06 12:29:57 -0700215 CHECK_EQ(expected_native, method.MemberIsNative())
216 << "Method " << name << " in class " << accessor.GetDescriptor();
217 const uint32_t actual_visibility = method.GetAccessFlags() & kAccVisibilityFlags;
218 CHECK_EQ(actual_visibility, expected_visibility)
219 << "Method " << name << " in class " << accessor.GetDescriptor();
David Brazdil90faceb2018-12-14 14:36:15 +0000220 return hiddenapi::ApiList(method.GetHiddenapiFlags());
David Brazdil2b9c35b2018-01-12 15:44:43 +0000221 }
222 }
223
224 LOG(FATAL) << "Could not find method " << name << " in class "
225 << dex_file.GetClassDescriptor(class_def);
226 UNREACHABLE();
227 }
228
David Brazdil47cd2722018-10-23 12:50:02 +0100229 hiddenapi::ApiList GetIFieldHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000230 return GetFieldHiddenFlags("ifield", kAccPublic, FindClass("LMain;", dex_file), dex_file);
231 }
232
David Brazdil47cd2722018-10-23 12:50:02 +0100233 hiddenapi::ApiList GetSFieldHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000234 return GetFieldHiddenFlags("sfield", kAccPrivate, FindClass("LMain;", dex_file), dex_file);
235 }
236
David Brazdil47cd2722018-10-23 12:50:02 +0100237 hiddenapi::ApiList GetIMethodHiddenFlags(const DexFile& dex_file) {
David Brazdil2b9c35b2018-01-12 15:44:43 +0000238 return GetMethodHiddenFlags(
Andreas Gampe9b031f72018-10-04 11:03:34 -0700239 "imethod", 0, /* expected_native= */ false, FindClass("LMain;", dex_file), dex_file);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000240 }
241
David Brazdil47cd2722018-10-23 12:50:02 +0100242 hiddenapi::ApiList GetSMethodHiddenFlags(const DexFile& dex_file) {
Andreas Gampe9b031f72018-10-04 11:03:34 -0700243 return GetMethodHiddenFlags("smethod",
244 kAccPublic,
245 /* expected_native= */ false,
246 FindClass("LMain;", dex_file),
247 dex_file);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000248 }
249
David Brazdil47cd2722018-10-23 12:50:02 +0100250 hiddenapi::ApiList GetINMethodHiddenFlags(const DexFile& dex_file) {
Andreas Gampe9b031f72018-10-04 11:03:34 -0700251 return GetMethodHiddenFlags("inmethod",
252 kAccPublic,
253 /* expected_native= */ true,
254 FindClass("LMain;", dex_file),
255 dex_file);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000256 }
257
David Brazdil47cd2722018-10-23 12:50:02 +0100258 hiddenapi::ApiList GetSNMethodHiddenFlags(const DexFile& dex_file) {
Andreas Gampe9b031f72018-10-04 11:03:34 -0700259 return GetMethodHiddenFlags("snmethod",
260 kAccProtected,
261 /* expected_native= */ true,
262 FindClass("LMain;", dex_file),
263 dex_file);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000264 }
265};
266
267TEST_F(HiddenApiTest, InstanceFieldNoMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000268 ScratchFile dex, flags_csv;
269 OpenStream(flags_csv)
270 << "LMain;->ifield:LBadType1;,greylist" << std::endl
271 << "LMain;->ifield:LBadType2;,greylist-max-o" << std::endl
272 << "LMain;->ifield:LBadType3;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000273 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100274 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000275 ASSERT_EQ(hiddenapi::ApiList::Whitelist(), GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000276}
277
278TEST_F(HiddenApiTest, InstanceFieldLightGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000279 ScratchFile dex, flags_csv;
280 OpenStream(flags_csv)
281 << "LMain;->ifield:I,greylist" << std::endl
282 << "LMain;->ifield:LBadType2;,greylist-max-o" << std::endl
283 << "LMain;->ifield:LBadType3;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000284 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100285 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000286 ASSERT_EQ(hiddenapi::ApiList::Greylist(), GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000287}
288
289TEST_F(HiddenApiTest, InstanceFieldDarkGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000290 ScratchFile dex, flags_csv;
291 OpenStream(flags_csv)
292 << "LMain;->ifield:LBadType1;,greylist" << std::endl
293 << "LMain;->ifield:I,greylist-max-o" << std::endl
294 << "LMain;->ifield:LBadType3;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000295 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100296 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000297 ASSERT_EQ(hiddenapi::ApiList::GreylistMaxO(), GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000298}
299
300TEST_F(HiddenApiTest, InstanceFieldBlacklistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000301 ScratchFile dex, flags_csv;
302 OpenStream(flags_csv)
303 << "LMain;->ifield:LBadType1;,greylist" << std::endl
304 << "LMain;->ifield:LBadType2;,greylist-max-o" << std::endl
305 << "LMain;->ifield:I,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000306 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100307 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000308 ASSERT_EQ(hiddenapi::ApiList::Blacklist(), GetIFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000309}
310
311TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch1) {
David Brazdil91690d32018-11-04 18:07:23 +0000312 ScratchFile dex, flags_csv;
313 OpenStream(flags_csv)
314 << "LMain;->ifield:LBadType1;,greylist" << std::endl
315 << "LMain;->ifield:I,blacklist,greylist-max-o" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000316 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100317 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000318}
319
320TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch2) {
David Brazdil91690d32018-11-04 18:07:23 +0000321 ScratchFile dex, flags_csv;
322 OpenStream(flags_csv)
323 << "LMain;->ifield:LBadType2;,greylist-max-o" << std::endl
324 << "LMain;->ifield:I,blacklist,greylist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000325 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100326 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000327}
328
329TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch3) {
David Brazdil91690d32018-11-04 18:07:23 +0000330 ScratchFile dex, flags_csv;
331 OpenStream(flags_csv)
332 << "LMain;->ifield:I,greylist,greylist-max-o" << std::endl
333 << "LMain;->ifield:LBadType3;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000334 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100335 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000336}
337
338TEST_F(HiddenApiTest, StaticFieldNoMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000339 ScratchFile dex, flags_csv;
340 OpenStream(flags_csv)
341 << "LMain;->sfield:LBadType1;,greylist" << std::endl
342 << "LMain;->sfield:LBadType2;,greylist-max-o" << std::endl
343 << "LMain;->sfield:LBadType3;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000344 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100345 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000346 ASSERT_EQ(hiddenapi::ApiList::Whitelist(), GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000347}
348
349TEST_F(HiddenApiTest, StaticFieldLightGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000350 ScratchFile dex, flags_csv;
351 OpenStream(flags_csv)
352 << "LMain;->sfield:Ljava/lang/Object;,greylist" << std::endl
353 << "LMain;->sfield:LBadType2;,greylist-max-o" << std::endl
354 << "LMain;->sfield:LBadType3;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000355 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100356 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000357 ASSERT_EQ(hiddenapi::ApiList::Greylist(), GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000358}
359
360TEST_F(HiddenApiTest, StaticFieldDarkGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000361 ScratchFile dex, flags_csv;
362 OpenStream(flags_csv)
363 << "LMain;->sfield:LBadType1;,greylist" << std::endl
364 << "LMain;->sfield:Ljava/lang/Object;,greylist-max-o" << std::endl
365 << "LMain;->sfield:LBadType3;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000366 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100367 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000368 ASSERT_EQ(hiddenapi::ApiList::GreylistMaxO(), GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000369}
370
371TEST_F(HiddenApiTest, StaticFieldBlacklistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000372 ScratchFile dex, flags_csv;
373 OpenStream(flags_csv)
374 << "LMain;->sfield:LBadType1;,greylist" << std::endl
375 << "LMain;->sfield:LBadType2;,greylist-max-o" << std::endl
376 << "LMain;->sfield:Ljava/lang/Object;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000377 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100378 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000379 ASSERT_EQ(hiddenapi::ApiList::Blacklist(), GetSFieldHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000380}
381
382TEST_F(HiddenApiTest, StaticFieldTwoListsMatch1) {
David Brazdil91690d32018-11-04 18:07:23 +0000383 ScratchFile dex, flags_csv;
384 OpenStream(flags_csv)
385 << "LMain;->sfield:LBadType1;,greylist" << std::endl
386 << "LMain;->sfield:Ljava/lang/Object;,blacklist,greylist-max-o" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000387 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100388 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000389}
390
391TEST_F(HiddenApiTest, StaticFieldTwoListsMatch2) {
David Brazdil91690d32018-11-04 18:07:23 +0000392 ScratchFile dex, flags_csv;
393 OpenStream(flags_csv)
394 << "LMain;->sfield:LBadType2;,greylist-max-o" << std::endl
395 << "LMain;->sfield:Ljava/lang/Object;,blacklist,greylist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000396 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100397 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000398}
399
400TEST_F(HiddenApiTest, StaticFieldTwoListsMatch3) {
David Brazdil91690d32018-11-04 18:07:23 +0000401 ScratchFile dex, flags_csv;
402 OpenStream(flags_csv)
403 << "LMain;->sfield:Ljava/lang/Object;,greylist,greylist-max-o" << std::endl
404 << "LMain;->sfield:LBadType3;,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000405 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100406 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000407}
408
409TEST_F(HiddenApiTest, InstanceMethodNoMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000410 ScratchFile dex, flags_csv;
411 OpenStream(flags_csv)
412 << "LMain;->imethod(LBadType1;)V,greylist" << std::endl
413 << "LMain;->imethod(LBadType2;)V,greylist-max-o" << std::endl
414 << "LMain;->imethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000415 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100416 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000417 ASSERT_EQ(hiddenapi::ApiList::Whitelist(), GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000418}
419
420TEST_F(HiddenApiTest, InstanceMethodLightGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000421 ScratchFile dex, flags_csv;
422 OpenStream(flags_csv)
423 << "LMain;->imethod(J)V,greylist" << std::endl
424 << "LMain;->imethod(LBadType2;)V,greylist-max-o" << std::endl
425 << "LMain;->imethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000426 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100427 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000428 ASSERT_EQ(hiddenapi::ApiList::Greylist(), GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000429}
430
431TEST_F(HiddenApiTest, InstanceMethodDarkGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000432 ScratchFile dex, flags_csv;
433 OpenStream(flags_csv)
434 << "LMain;->imethod(LBadType1;)V,greylist" << std::endl
435 << "LMain;->imethod(J)V,greylist-max-o" << std::endl
436 << "LMain;->imethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000437 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100438 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000439 ASSERT_EQ(hiddenapi::ApiList::GreylistMaxO(), GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000440}
441
442TEST_F(HiddenApiTest, InstanceMethodBlacklistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000443 ScratchFile dex, flags_csv;
444 OpenStream(flags_csv)
445 << "LMain;->imethod(LBadType1;)V,greylist" << std::endl
446 << "LMain;->imethod(LBadType2;)V,greylist-max-o" << std::endl
447 << "LMain;->imethod(J)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000448 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100449 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000450 ASSERT_EQ(hiddenapi::ApiList::Blacklist(), GetIMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000451}
452
453TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch1) {
David Brazdil91690d32018-11-04 18:07:23 +0000454 ScratchFile dex, flags_csv;
455 OpenStream(flags_csv)
456 << "LMain;->imethod(LBadType1;)V,greylist" << std::endl
457 << "LMain;->imethod(J)V,blacklist,greylist-max-o" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000458 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100459 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000460}
461
462TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch2) {
David Brazdil91690d32018-11-04 18:07:23 +0000463 ScratchFile dex, flags_csv;
464 OpenStream(flags_csv)
465 << "LMain;->imethod(LBadType2;)V,greylist-max-o" << std::endl
466 << "LMain;->imethod(J)V,blacklist,greylist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000467 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100468 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000469}
470
471TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch3) {
David Brazdil91690d32018-11-04 18:07:23 +0000472 ScratchFile dex, flags_csv;
473 OpenStream(flags_csv)
474 << "LMain;->imethod(J)V,greylist,greylist-max-o" << std::endl
475 << "LMain;->imethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000476 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100477 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000478}
479
480TEST_F(HiddenApiTest, StaticMethodNoMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000481 ScratchFile dex, flags_csv;
482 OpenStream(flags_csv)
483 << "LMain;->smethod(LBadType1;)V,greylist" << std::endl
484 << "LMain;->smethod(LBadType2;)V,greylist-max-o" << std::endl
485 << "LMain;->smethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000486 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100487 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000488 ASSERT_EQ(hiddenapi::ApiList::Whitelist(), GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000489}
490
491TEST_F(HiddenApiTest, StaticMethodLightGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000492 ScratchFile dex, flags_csv;
493 OpenStream(flags_csv)
494 << "LMain;->smethod(Ljava/lang/Object;)V,greylist" << std::endl
495 << "LMain;->smethod(LBadType2;)V,greylist-max-o" << std::endl
496 << "LMain;->smethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000497 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100498 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000499 ASSERT_EQ(hiddenapi::ApiList::Greylist(), GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000500}
501
502TEST_F(HiddenApiTest, StaticMethodDarkGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000503 ScratchFile dex, flags_csv;
504 OpenStream(flags_csv)
505 << "LMain;->smethod(LBadType1;)V,greylist" << std::endl
506 << "LMain;->smethod(Ljava/lang/Object;)V,greylist-max-o" << std::endl
507 << "LMain;->smethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000508 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100509 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000510 ASSERT_EQ(hiddenapi::ApiList::GreylistMaxO(), GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000511}
512
513TEST_F(HiddenApiTest, StaticMethodBlacklistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000514 ScratchFile dex, flags_csv;
515 OpenStream(flags_csv)
516 << "LMain;->smethod(LBadType1;)V,greylist" << std::endl
517 << "LMain;->smethod(LBadType2;)V,greylist-max-o" << std::endl
518 << "LMain;->smethod(Ljava/lang/Object;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000519 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100520 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000521 ASSERT_EQ(hiddenapi::ApiList::Blacklist(), GetSMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000522}
523
524TEST_F(HiddenApiTest, StaticMethodTwoListsMatch1) {
David Brazdil91690d32018-11-04 18:07:23 +0000525 ScratchFile dex, flags_csv;
526 OpenStream(flags_csv)
527 << "LMain;->smethod(LBadType1;)V,greylist" << std::endl
528 << "LMain;->smethod(Ljava/lang/Object;)V,blacklist,greylist-max-o" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000529 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100530 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000531}
532
533TEST_F(HiddenApiTest, StaticMethodTwoListsMatch2) {
David Brazdil91690d32018-11-04 18:07:23 +0000534 ScratchFile dex, flags_csv;
535 OpenStream(flags_csv)
536 << "LMain;->smethod(LBadType2;)V,greylist-max-o" << std::endl
537 << "LMain;->smethod(Ljava/lang/Object;)V,blacklist,greylist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000538 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100539 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000540}
541
542TEST_F(HiddenApiTest, StaticMethodTwoListsMatch3) {
David Brazdil91690d32018-11-04 18:07:23 +0000543 ScratchFile dex, flags_csv;
544 OpenStream(flags_csv)
545 << "LMain;->smethod(Ljava/lang/Object;)V,greylist,greylist-max-o" << std::endl
546 << "LMain;->smethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000547 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100548 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000549}
550
551TEST_F(HiddenApiTest, InstanceNativeMethodNoMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000552 ScratchFile dex, flags_csv;
553 OpenStream(flags_csv)
554 << "LMain;->inmethod(LBadType1;)V,greylist" << std::endl
555 << "LMain;->inmethod(LBadType2;)V,greylist-max-o" << std::endl
556 << "LMain;->inmethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000557 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100558 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000559 ASSERT_EQ(hiddenapi::ApiList::Whitelist(), GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000560}
561
562TEST_F(HiddenApiTest, InstanceNativeMethodLightGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000563 ScratchFile dex, flags_csv;
564 OpenStream(flags_csv)
565 << "LMain;->inmethod(C)V,greylist" << std::endl
566 << "LMain;->inmethod(LBadType2;)V,greylist-max-o" << std::endl
567 << "LMain;->inmethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000568 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100569 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000570 ASSERT_EQ(hiddenapi::ApiList::Greylist(), GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000571}
572
573TEST_F(HiddenApiTest, InstanceNativeMethodDarkGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000574 ScratchFile dex, flags_csv;
575 OpenStream(flags_csv)
576 << "LMain;->inmethod(LBadType1;)V,greylist" << std::endl
577 << "LMain;->inmethod(C)V,greylist-max-o" << std::endl
578 << "LMain;->inmethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000579 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100580 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000581 ASSERT_EQ(hiddenapi::ApiList::GreylistMaxO(), GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000582}
583
584TEST_F(HiddenApiTest, InstanceNativeMethodBlacklistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000585 ScratchFile dex, flags_csv;
586 OpenStream(flags_csv)
587 << "LMain;->inmethod(LBadType1;)V,greylist" << std::endl
588 << "LMain;->inmethod(LBadType2;)V,greylist-max-o" << std::endl
589 << "LMain;->inmethod(C)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000590 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100591 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000592 ASSERT_EQ(hiddenapi::ApiList::Blacklist(), GetINMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000593}
594
595TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch1) {
David Brazdil91690d32018-11-04 18:07:23 +0000596 ScratchFile dex, flags_csv;
597 OpenStream(flags_csv)
598 << "LMain;->inmethod(LBadType1;)V,greylist" << std::endl
599 << "LMain;->inmethod(C)V,blacklist,greylist-max-o" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000600 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100601 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000602}
603
604TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch2) {
David Brazdil91690d32018-11-04 18:07:23 +0000605 ScratchFile dex, flags_csv;
606 OpenStream(flags_csv)
607 << "LMain;->inmethod(C)V,blacklist,greylist" << std::endl
608 << "LMain;->inmethod(LBadType2;)V,greylist-max-o" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000609 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100610 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000611}
612
613TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch3) {
David Brazdil91690d32018-11-04 18:07:23 +0000614 ScratchFile dex, flags_csv;
615 OpenStream(flags_csv)
616 << "LMain;->inmethod(C)V,greylist,greylist-max-o" << std::endl
617 << "LMain;->inmethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000618 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100619 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000620}
621
622TEST_F(HiddenApiTest, StaticNativeMethodNoMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000623 ScratchFile dex, flags_csv;
624 OpenStream(flags_csv)
625 << "LMain;->snmethod(LBadType1;)V,greylist" << std::endl
626 << "LMain;->snmethod(LBadType2;)V,greylist-max-o" << std::endl
627 << "LMain;->snmethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000628 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100629 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000630 ASSERT_EQ(hiddenapi::ApiList::Whitelist(), GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000631}
632
633TEST_F(HiddenApiTest, StaticNativeMethodLightGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000634 ScratchFile dex, flags_csv;
635 OpenStream(flags_csv)
636 << "LMain;->snmethod(Ljava/lang/Integer;)V,greylist" << std::endl
637 << "LMain;->snmethod(LBadType2;)V,greylist-max-o" << std::endl
638 << "LMain;->snmethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000639 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100640 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000641 ASSERT_EQ(hiddenapi::ApiList::Greylist(), GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000642}
643
644TEST_F(HiddenApiTest, StaticNativeMethodDarkGreylistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000645 ScratchFile dex, flags_csv;
646 OpenStream(flags_csv)
647 << "LMain;->snmethod(LBadType1;)V,greylist" << std::endl
648 << "LMain;->snmethod(Ljava/lang/Integer;)V,greylist-max-o" << std::endl
649 << "LMain;->snmethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000650 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100651 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000652 ASSERT_EQ(hiddenapi::ApiList::GreylistMaxO(), GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000653}
654
655TEST_F(HiddenApiTest, StaticNativeMethodBlacklistMatch) {
David Brazdil91690d32018-11-04 18:07:23 +0000656 ScratchFile dex, flags_csv;
657 OpenStream(flags_csv)
658 << "LMain;->snmethod(LBadType1;)V,greylist" << std::endl
659 << "LMain;->snmethod(LBadType2;)V,greylist-max-o" << std::endl
660 << "LMain;->snmethod(Ljava/lang/Integer;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000661 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100662 ASSERT_NE(dex_file.get(), nullptr);
David Brazdildcfa89b2018-10-31 11:04:10 +0000663 ASSERT_EQ(hiddenapi::ApiList::Blacklist(), GetSNMethodHiddenFlags(*dex_file));
David Brazdil2b9c35b2018-01-12 15:44:43 +0000664}
665
666TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch1) {
David Brazdil91690d32018-11-04 18:07:23 +0000667 ScratchFile dex, flags_csv;
668 OpenStream(flags_csv)
669 << "LMain;->snmethod(LBadType1;)V,greylist" << std::endl
670 << "LMain;->snmethod(Ljava/lang/Integer;)V,blacklist,greylist-max-o" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000671 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100672 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000673}
674
675TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch2) {
David Brazdil91690d32018-11-04 18:07:23 +0000676 ScratchFile dex, flags_csv;
677 OpenStream(flags_csv)
678 << "LMain;->snmethod(Ljava/lang/Integer;)V,blacklist,greylist" << std::endl
679 << "LMain;->snmethod(LBadType2;)V,greylist-max-o" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000680 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100681 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000682}
683
684TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch3) {
David Brazdil91690d32018-11-04 18:07:23 +0000685 ScratchFile dex, flags_csv;
686 OpenStream(flags_csv)
687 << "LMain;->snmethod(Ljava/lang/Integer;)V,greylist,greylist-max-o" << std::endl
688 << "LMain;->snmethod(LBadType3;)V,blacklist" << std::endl;
David Brazdil2da3cbb2019-01-30 16:17:50 +0000689 auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
David Brazdil003e64b2018-06-27 13:20:52 +0100690 ASSERT_EQ(dex_file.get(), nullptr);
David Brazdil2b9c35b2018-01-12 15:44:43 +0000691}
692
David Brazdil2da3cbb2019-01-30 16:17:50 +0000693// The following tests use this class hierarchy:
694//
695// AbstractPackageClass PublicInterface
696// | |
697// | ┌----------------┘
698// | |
699// PackageClass
700//
701// Only PublicInterface is in stubs.
702
703// Test a method declared in PublicInterface and defined in PackageClass.
704TEST_F(HiddenApiTest, InterfaceMethodImplemented) {
705 ScratchFile flags_csv;
706 ASSERT_TRUE(RunHiddenapiList(flags_csv));
707 auto flags = ReadFlagsCsvFile(flags_csv);
Andrei Onea370a0642019-03-01 17:48:27 +0000708 ASSERT_EQ(SafeMapGet("LPackageClass;->publicMethod1()V", flags), "public-api");
David Brazdil2da3cbb2019-01-30 16:17:50 +0000709}
710
711// Test a method declared in PublicInterface, defined in AbstractPackageClass and
712// inherited by PackageClass.
713TEST_F(HiddenApiTest, InterfaceMethodImplementedInParent) {
714 ScratchFile flags_csv;
715 ASSERT_TRUE(RunHiddenapiList(flags_csv));
716 auto flags = ReadFlagsCsvFile(flags_csv);
Andrei Onea370a0642019-03-01 17:48:27 +0000717 ASSERT_EQ(SafeMapGet("LAbstractPackageClass;->publicMethod2()V", flags), "public-api");
David Brazdil2da3cbb2019-01-30 16:17:50 +0000718}
719
David Brazdil2b9c35b2018-01-12 15:44:43 +0000720} // namespace art