1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker *
4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker *
8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker *
10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker */
16*795d594fSAndroid Build Coastguard Worker
17*795d594fSAndroid Build Coastguard Worker #include <fstream>
18*795d594fSAndroid Build Coastguard Worker
19*795d594fSAndroid Build Coastguard Worker #include "android-base/strings.h"
20*795d594fSAndroid Build Coastguard Worker
21*795d594fSAndroid Build Coastguard Worker #include "base/unix_file/fd_file.h"
22*795d594fSAndroid Build Coastguard Worker #include "base/zip_archive.h"
23*795d594fSAndroid Build Coastguard Worker #include "common_runtime_test.h"
24*795d594fSAndroid Build Coastguard Worker #include "dex/art_dex_file_loader.h"
25*795d594fSAndroid Build Coastguard Worker #include "dex/class_accessor-inl.h"
26*795d594fSAndroid Build Coastguard Worker #include "dex/dex_file-inl.h"
27*795d594fSAndroid Build Coastguard Worker #include "exec_utils.h"
28*795d594fSAndroid Build Coastguard Worker
29*795d594fSAndroid Build Coastguard Worker namespace art {
30*795d594fSAndroid Build Coastguard Worker
31*795d594fSAndroid Build Coastguard Worker class HiddenApiTest : public CommonRuntimeTest {
32*795d594fSAndroid Build Coastguard Worker protected:
GetHiddenApiCmd()33*795d594fSAndroid Build Coastguard Worker std::string GetHiddenApiCmd() {
34*795d594fSAndroid Build Coastguard Worker std::string file_path = GetArtBinDir() + "/hiddenapi";
35*795d594fSAndroid Build Coastguard Worker if (kIsDebugBuild) {
36*795d594fSAndroid Build Coastguard Worker file_path += 'd';
37*795d594fSAndroid Build Coastguard Worker }
38*795d594fSAndroid Build Coastguard Worker if (!OS::FileExists(file_path.c_str())) {
39*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Could not find binary " << file_path;
40*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
41*795d594fSAndroid Build Coastguard Worker }
42*795d594fSAndroid Build Coastguard Worker return file_path;
43*795d594fSAndroid Build Coastguard Worker }
44*795d594fSAndroid Build Coastguard Worker
RunHiddenapiEncode(const ScratchFile & flags_csv,const std::vector<std::string> & extra_args,const ScratchFile & out_dex)45*795d594fSAndroid Build Coastguard Worker std::unique_ptr<const DexFile> RunHiddenapiEncode(const ScratchFile& flags_csv,
46*795d594fSAndroid Build Coastguard Worker const std::vector<std::string>& extra_args,
47*795d594fSAndroid Build Coastguard Worker const ScratchFile& out_dex) {
48*795d594fSAndroid Build Coastguard Worker std::string error;
49*795d594fSAndroid Build Coastguard Worker ScratchFile in_dex;
50*795d594fSAndroid Build Coastguard Worker std::unique_ptr<ZipArchive> jar(
51*795d594fSAndroid Build Coastguard Worker ZipArchive::Open(GetTestDexFileName("HiddenApi").c_str(), &error));
52*795d594fSAndroid Build Coastguard Worker if (jar == nullptr) {
53*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Could not open test file " << GetTestDexFileName("HiddenApi") << ": " << error;
54*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
55*795d594fSAndroid Build Coastguard Worker }
56*795d594fSAndroid Build Coastguard Worker std::unique_ptr<ZipEntry> jar_classes_dex(jar->Find("classes.dex", &error));
57*795d594fSAndroid Build Coastguard Worker if (jar_classes_dex == nullptr) {
58*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Could not find classes.dex in test file " << GetTestDexFileName("HiddenApi")
59*795d594fSAndroid Build Coastguard Worker << ": " << error;
60*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
61*795d594fSAndroid Build Coastguard Worker } else if (!jar_classes_dex->ExtractToFile(*in_dex.GetFile(), &error)) {
62*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Could not extract classes.dex from test file "
63*795d594fSAndroid Build Coastguard Worker << GetTestDexFileName("HiddenApi") << ": " << error;
64*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
65*795d594fSAndroid Build Coastguard Worker }
66*795d594fSAndroid Build Coastguard Worker
67*795d594fSAndroid Build Coastguard Worker std::vector<std::string> argv_str;
68*795d594fSAndroid Build Coastguard Worker argv_str.push_back(GetHiddenApiCmd());
69*795d594fSAndroid Build Coastguard Worker argv_str.push_back("encode");
70*795d594fSAndroid Build Coastguard Worker argv_str.insert(argv_str.end(), extra_args.begin(), extra_args.end());
71*795d594fSAndroid Build Coastguard Worker argv_str.push_back("--input-dex=" + in_dex.GetFilename());
72*795d594fSAndroid Build Coastguard Worker argv_str.push_back("--output-dex=" + out_dex.GetFilename());
73*795d594fSAndroid Build Coastguard Worker argv_str.push_back("--api-flags=" + flags_csv.GetFilename());
74*795d594fSAndroid Build Coastguard Worker argv_str.push_back("--no-force-assign-all");
75*795d594fSAndroid Build Coastguard Worker int return_code = ExecAndReturnCode(argv_str, &error);
76*795d594fSAndroid Build Coastguard Worker if (return_code == 0) {
77*795d594fSAndroid Build Coastguard Worker return OpenDex(out_dex);
78*795d594fSAndroid Build Coastguard Worker } else {
79*795d594fSAndroid Build Coastguard Worker LOG(ERROR) << "HiddenApi binary exited with unexpected return code " << return_code;
80*795d594fSAndroid Build Coastguard Worker return nullptr;
81*795d594fSAndroid Build Coastguard Worker }
82*795d594fSAndroid Build Coastguard Worker }
83*795d594fSAndroid Build Coastguard Worker
RunHiddenapiList(const ScratchFile & out_flags_csv)84*795d594fSAndroid Build Coastguard Worker bool RunHiddenapiList(const ScratchFile& out_flags_csv) {
85*795d594fSAndroid Build Coastguard Worker std::string error;
86*795d594fSAndroid Build Coastguard Worker std::string boot_jar = GetTestDexFileName("HiddenApi");
87*795d594fSAndroid Build Coastguard Worker std::string stub_jar = GetTestDexFileName("HiddenApiStubs");
88*795d594fSAndroid Build Coastguard Worker std::string boot_cp = android::base::Join(GetLibCoreDexFileNames(), ":");
89*795d594fSAndroid Build Coastguard Worker
90*795d594fSAndroid Build Coastguard Worker std::vector<std::string> argv_str;
91*795d594fSAndroid Build Coastguard Worker argv_str.push_back(GetHiddenApiCmd());
92*795d594fSAndroid Build Coastguard Worker argv_str.push_back("list");
93*795d594fSAndroid Build Coastguard Worker for (const std::string& core_jar : GetLibCoreDexFileNames()) {
94*795d594fSAndroid Build Coastguard Worker argv_str.push_back("--boot-dex=" + core_jar);
95*795d594fSAndroid Build Coastguard Worker }
96*795d594fSAndroid Build Coastguard Worker argv_str.push_back("--boot-dex=" + boot_jar);
97*795d594fSAndroid Build Coastguard Worker argv_str.push_back("--public-stub-classpath=" + boot_cp + ":" + stub_jar);
98*795d594fSAndroid Build Coastguard Worker argv_str.push_back("--out-api-flags=" + out_flags_csv.GetFilename());
99*795d594fSAndroid Build Coastguard Worker int return_code = ExecAndReturnCode(argv_str, &error);
100*795d594fSAndroid Build Coastguard Worker if (return_code == 0) {
101*795d594fSAndroid Build Coastguard Worker return true;
102*795d594fSAndroid Build Coastguard Worker } else {
103*795d594fSAndroid Build Coastguard Worker LOG(ERROR) << "HiddenApi binary exited with unexpected return code " << return_code;
104*795d594fSAndroid Build Coastguard Worker return false;
105*795d594fSAndroid Build Coastguard Worker }
106*795d594fSAndroid Build Coastguard Worker }
107*795d594fSAndroid Build Coastguard Worker
OpenDex(const ScratchFile & file)108*795d594fSAndroid Build Coastguard Worker std::unique_ptr<const DexFile> OpenDex(const ScratchFile& file) {
109*795d594fSAndroid Build Coastguard Worker std::string error_msg;
110*795d594fSAndroid Build Coastguard Worker
111*795d594fSAndroid Build Coastguard Worker File fd(file.GetFilename(), O_RDONLY, /* check_usage= */ false);
112*795d594fSAndroid Build Coastguard Worker if (fd.Fd() == -1) {
113*795d594fSAndroid Build Coastguard Worker PLOG(FATAL) << "Unable to open file '" << file.GetFilename() << "'";
114*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
115*795d594fSAndroid Build Coastguard Worker }
116*795d594fSAndroid Build Coastguard Worker
117*795d594fSAndroid Build Coastguard Worker ArtDexFileLoader dex_loader(&fd, file.GetFilename());
118*795d594fSAndroid Build Coastguard Worker std::unique_ptr<const DexFile> dex_file(dex_loader.Open(
119*795d594fSAndroid Build Coastguard Worker /*location_checksum=*/0,
120*795d594fSAndroid Build Coastguard Worker /*verify=*/true,
121*795d594fSAndroid Build Coastguard Worker /*verify_checksum=*/true,
122*795d594fSAndroid Build Coastguard Worker &error_msg));
123*795d594fSAndroid Build Coastguard Worker if (dex_file.get() == nullptr) {
124*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Open failed for '" << file.GetFilename() << "' " << error_msg;
125*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
126*795d594fSAndroid Build Coastguard Worker } else if (!dex_file->IsStandardDexFile()) {
127*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Expected a standard dex file '" << file.GetFilename() << "'";
128*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
129*795d594fSAndroid Build Coastguard Worker }
130*795d594fSAndroid Build Coastguard Worker
131*795d594fSAndroid Build Coastguard Worker return dex_file;
132*795d594fSAndroid Build Coastguard Worker }
133*795d594fSAndroid Build Coastguard Worker
OpenStream(const ScratchFile & file)134*795d594fSAndroid Build Coastguard Worker std::ofstream OpenStream(const ScratchFile& file) {
135*795d594fSAndroid Build Coastguard Worker std::ofstream ofs(file.GetFilename(), std::ofstream::out);
136*795d594fSAndroid Build Coastguard Worker if (ofs.fail()) {
137*795d594fSAndroid Build Coastguard Worker PLOG(FATAL) << "Open failed for '" << file.GetFilename() << "'";
138*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
139*795d594fSAndroid Build Coastguard Worker }
140*795d594fSAndroid Build Coastguard Worker return ofs;
141*795d594fSAndroid Build Coastguard Worker }
142*795d594fSAndroid Build Coastguard Worker
ReadFlagsCsvFile(const ScratchFile & file)143*795d594fSAndroid Build Coastguard Worker std::map<std::string, std::string> ReadFlagsCsvFile(const ScratchFile& file) {
144*795d594fSAndroid Build Coastguard Worker std::ifstream ifs(file.GetFilename());
145*795d594fSAndroid Build Coastguard Worker std::map<std::string, std::string> flags;
146*795d594fSAndroid Build Coastguard Worker
147*795d594fSAndroid Build Coastguard Worker for (std::string line; std::getline(ifs, line);) {
148*795d594fSAndroid Build Coastguard Worker std::size_t comma = line.find(',');
149*795d594fSAndroid Build Coastguard Worker if (comma == std::string::npos) {
150*795d594fSAndroid Build Coastguard Worker flags.emplace(line, "");
151*795d594fSAndroid Build Coastguard Worker } else {
152*795d594fSAndroid Build Coastguard Worker flags.emplace(line.substr(0, comma), line.substr(comma + 1));
153*795d594fSAndroid Build Coastguard Worker }
154*795d594fSAndroid Build Coastguard Worker }
155*795d594fSAndroid Build Coastguard Worker
156*795d594fSAndroid Build Coastguard Worker return flags;
157*795d594fSAndroid Build Coastguard Worker }
158*795d594fSAndroid Build Coastguard Worker
SafeMapGet(const std::string & key,const std::map<std::string,std::string> & map)159*795d594fSAndroid Build Coastguard Worker std::string SafeMapGet(const std::string& key, const std::map<std::string, std::string>& map) {
160*795d594fSAndroid Build Coastguard Worker auto it = map.find(key);
161*795d594fSAndroid Build Coastguard Worker if (it == map.end()) {
162*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Key not found: " << key;
163*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
164*795d594fSAndroid Build Coastguard Worker }
165*795d594fSAndroid Build Coastguard Worker return it->second;
166*795d594fSAndroid Build Coastguard Worker }
167*795d594fSAndroid Build Coastguard Worker
FindClass(const char * desc,const DexFile & dex_file)168*795d594fSAndroid Build Coastguard Worker const dex::ClassDef& FindClass(const char* desc, const DexFile& dex_file) {
169*795d594fSAndroid Build Coastguard Worker const dex::TypeId* type_id = dex_file.FindTypeId(desc);
170*795d594fSAndroid Build Coastguard Worker CHECK(type_id != nullptr) << "Could not find class " << desc;
171*795d594fSAndroid Build Coastguard Worker const dex::ClassDef* found = dex_file.FindClassDef(dex_file.GetIndexForTypeId(*type_id));
172*795d594fSAndroid Build Coastguard Worker CHECK(found != nullptr) << "Could not find class " << desc;
173*795d594fSAndroid Build Coastguard Worker return *found;
174*795d594fSAndroid Build Coastguard Worker }
175*795d594fSAndroid Build Coastguard Worker
GetFieldHiddenFlags(const char * name,uint32_t expected_visibility,const dex::ClassDef & class_def,const DexFile & dex_file)176*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList GetFieldHiddenFlags(const char* name,
177*795d594fSAndroid Build Coastguard Worker uint32_t expected_visibility,
178*795d594fSAndroid Build Coastguard Worker const dex::ClassDef& class_def,
179*795d594fSAndroid Build Coastguard Worker const DexFile& dex_file) {
180*795d594fSAndroid Build Coastguard Worker ClassAccessor accessor(dex_file, class_def, /* parse hiddenapi flags */ true);
181*795d594fSAndroid Build Coastguard Worker CHECK(accessor.HasClassData()) << "Class " << accessor.GetDescriptor() << " has no data";
182*795d594fSAndroid Build Coastguard Worker
183*795d594fSAndroid Build Coastguard Worker if (!accessor.HasHiddenapiClassData()) {
184*795d594fSAndroid Build Coastguard Worker return hiddenapi::ApiList::Sdk();
185*795d594fSAndroid Build Coastguard Worker }
186*795d594fSAndroid Build Coastguard Worker
187*795d594fSAndroid Build Coastguard Worker for (const ClassAccessor::Field& field : accessor.GetFields()) {
188*795d594fSAndroid Build Coastguard Worker const dex::FieldId& fid = dex_file.GetFieldId(field.GetIndex());
189*795d594fSAndroid Build Coastguard Worker if (strcmp(name, dex_file.GetFieldName(fid)) == 0) {
190*795d594fSAndroid Build Coastguard Worker const uint32_t actual_visibility = field.GetAccessFlags() & kAccVisibilityFlags;
191*795d594fSAndroid Build Coastguard Worker CHECK_EQ(actual_visibility, expected_visibility)
192*795d594fSAndroid Build Coastguard Worker << "Field " << name << " in class " << accessor.GetDescriptor();
193*795d594fSAndroid Build Coastguard Worker return hiddenapi::ApiList(field.GetHiddenapiFlags());
194*795d594fSAndroid Build Coastguard Worker }
195*795d594fSAndroid Build Coastguard Worker }
196*795d594fSAndroid Build Coastguard Worker
197*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Could not find field " << name << " in class "
198*795d594fSAndroid Build Coastguard Worker << dex_file.GetClassDescriptor(class_def);
199*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
200*795d594fSAndroid Build Coastguard Worker }
201*795d594fSAndroid Build Coastguard Worker
GetMethodHiddenFlags(const char * name,uint32_t expected_visibility,bool expected_native,const dex::ClassDef & class_def,const DexFile & dex_file)202*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList GetMethodHiddenFlags(const char* name,
203*795d594fSAndroid Build Coastguard Worker uint32_t expected_visibility,
204*795d594fSAndroid Build Coastguard Worker bool expected_native,
205*795d594fSAndroid Build Coastguard Worker const dex::ClassDef& class_def,
206*795d594fSAndroid Build Coastguard Worker const DexFile& dex_file) {
207*795d594fSAndroid Build Coastguard Worker ClassAccessor accessor(dex_file, class_def, /* parse hiddenapi flags */ true);
208*795d594fSAndroid Build Coastguard Worker CHECK(accessor.HasClassData()) << "Class " << accessor.GetDescriptor() << " has no data";
209*795d594fSAndroid Build Coastguard Worker
210*795d594fSAndroid Build Coastguard Worker if (!accessor.HasHiddenapiClassData()) {
211*795d594fSAndroid Build Coastguard Worker return hiddenapi::ApiList::Sdk();
212*795d594fSAndroid Build Coastguard Worker }
213*795d594fSAndroid Build Coastguard Worker
214*795d594fSAndroid Build Coastguard Worker for (const ClassAccessor::Method& method : accessor.GetMethods()) {
215*795d594fSAndroid Build Coastguard Worker const dex::MethodId& mid = dex_file.GetMethodId(method.GetIndex());
216*795d594fSAndroid Build Coastguard Worker if (strcmp(name, dex_file.GetMethodName(mid)) == 0) {
217*795d594fSAndroid Build Coastguard Worker CHECK_EQ(expected_native, method.MemberIsNative())
218*795d594fSAndroid Build Coastguard Worker << "Method " << name << " in class " << accessor.GetDescriptor();
219*795d594fSAndroid Build Coastguard Worker const uint32_t actual_visibility = method.GetAccessFlags() & kAccVisibilityFlags;
220*795d594fSAndroid Build Coastguard Worker CHECK_EQ(actual_visibility, expected_visibility)
221*795d594fSAndroid Build Coastguard Worker << "Method " << name << " in class " << accessor.GetDescriptor();
222*795d594fSAndroid Build Coastguard Worker return hiddenapi::ApiList(method.GetHiddenapiFlags());
223*795d594fSAndroid Build Coastguard Worker }
224*795d594fSAndroid Build Coastguard Worker }
225*795d594fSAndroid Build Coastguard Worker
226*795d594fSAndroid Build Coastguard Worker LOG(FATAL) << "Could not find method " << name << " in class "
227*795d594fSAndroid Build Coastguard Worker << dex_file.GetClassDescriptor(class_def);
228*795d594fSAndroid Build Coastguard Worker UNREACHABLE();
229*795d594fSAndroid Build Coastguard Worker }
230*795d594fSAndroid Build Coastguard Worker
GetIFieldHiddenFlags(const DexFile & dex_file)231*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList GetIFieldHiddenFlags(const DexFile& dex_file) {
232*795d594fSAndroid Build Coastguard Worker return GetFieldHiddenFlags("ifield", kAccPublic, FindClass("LMain;", dex_file), dex_file);
233*795d594fSAndroid Build Coastguard Worker }
234*795d594fSAndroid Build Coastguard Worker
GetSFieldHiddenFlags(const DexFile & dex_file)235*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList GetSFieldHiddenFlags(const DexFile& dex_file) {
236*795d594fSAndroid Build Coastguard Worker return GetFieldHiddenFlags("sfield", kAccPrivate, FindClass("LMain;", dex_file), dex_file);
237*795d594fSAndroid Build Coastguard Worker }
238*795d594fSAndroid Build Coastguard Worker
GetIMethodHiddenFlags(const DexFile & dex_file)239*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList GetIMethodHiddenFlags(const DexFile& dex_file) {
240*795d594fSAndroid Build Coastguard Worker return GetMethodHiddenFlags(
241*795d594fSAndroid Build Coastguard Worker "imethod", 0, /* expected_native= */ false, FindClass("LMain;", dex_file), dex_file);
242*795d594fSAndroid Build Coastguard Worker }
243*795d594fSAndroid Build Coastguard Worker
GetSMethodHiddenFlags(const DexFile & dex_file)244*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList GetSMethodHiddenFlags(const DexFile& dex_file) {
245*795d594fSAndroid Build Coastguard Worker return GetMethodHiddenFlags("smethod",
246*795d594fSAndroid Build Coastguard Worker kAccPublic,
247*795d594fSAndroid Build Coastguard Worker /* expected_native= */ false,
248*795d594fSAndroid Build Coastguard Worker FindClass("LMain;", dex_file),
249*795d594fSAndroid Build Coastguard Worker dex_file);
250*795d594fSAndroid Build Coastguard Worker }
251*795d594fSAndroid Build Coastguard Worker
GetINMethodHiddenFlags(const DexFile & dex_file)252*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList GetINMethodHiddenFlags(const DexFile& dex_file) {
253*795d594fSAndroid Build Coastguard Worker return GetMethodHiddenFlags("inmethod",
254*795d594fSAndroid Build Coastguard Worker kAccPublic,
255*795d594fSAndroid Build Coastguard Worker /* expected_native= */ true,
256*795d594fSAndroid Build Coastguard Worker FindClass("LMain;", dex_file),
257*795d594fSAndroid Build Coastguard Worker dex_file);
258*795d594fSAndroid Build Coastguard Worker }
259*795d594fSAndroid Build Coastguard Worker
GetSNMethodHiddenFlags(const DexFile & dex_file)260*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList GetSNMethodHiddenFlags(const DexFile& dex_file) {
261*795d594fSAndroid Build Coastguard Worker return GetMethodHiddenFlags("snmethod",
262*795d594fSAndroid Build Coastguard Worker kAccProtected,
263*795d594fSAndroid Build Coastguard Worker /* expected_native= */ true,
264*795d594fSAndroid Build Coastguard Worker FindClass("LMain;", dex_file),
265*795d594fSAndroid Build Coastguard Worker dex_file);
266*795d594fSAndroid Build Coastguard Worker }
267*795d594fSAndroid Build Coastguard Worker };
268*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldNoMatch)269*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldNoMatch) {
270*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
271*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
272*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType1;,unsupported" << std::endl
273*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType2;,max-target-o" << std::endl
274*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType3;,blocked" << std::endl;
275*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
276*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
277*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Sdk(), GetIFieldHiddenFlags(*dex_file));
278*795d594fSAndroid Build Coastguard Worker }
279*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldLightunsupportedMatch)280*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldLightunsupportedMatch) {
281*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
282*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
283*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,unsupported" << std::endl
284*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType2;,max-target-o" << std::endl
285*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType3;,blocked" << std::endl;
286*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
287*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
288*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Unsupported(), GetIFieldHiddenFlags(*dex_file));
289*795d594fSAndroid Build Coastguard Worker }
290*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldDarkunsupportedMatch)291*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldDarkunsupportedMatch) {
292*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
293*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
294*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType1;,unsupported" << std::endl
295*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,max-target-o" << std::endl
296*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType3;,blocked" << std::endl;
297*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
298*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
299*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::MaxTargetO(), GetIFieldHiddenFlags(*dex_file));
300*795d594fSAndroid Build Coastguard Worker }
301*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldblockedMatch)302*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldblockedMatch) {
303*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
304*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
305*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType1;,unsupported" << std::endl
306*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType2;,max-target-o" << std::endl
307*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,blocked" << std::endl;
308*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
309*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
310*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Blocked(), GetIFieldHiddenFlags(*dex_file));
311*795d594fSAndroid Build Coastguard Worker }
312*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldTwoListsMatch1)313*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch1) {
314*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
315*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
316*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType1;,unsupported" << std::endl
317*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,blocked,max-target-o" << std::endl;
318*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
319*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
320*795d594fSAndroid Build Coastguard Worker }
321*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldTwoListsMatch2)322*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch2) {
323*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
324*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
325*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType2;,max-target-o" << std::endl
326*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,blocked,unsupported" << std::endl;
327*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
328*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
329*795d594fSAndroid Build Coastguard Worker }
330*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldTwoListsMatch3)331*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch3) {
332*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
333*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
334*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,unsupported,max-target-o" << std::endl
335*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType3;,blocked" << std::endl;
336*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
337*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
338*795d594fSAndroid Build Coastguard Worker }
339*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticFieldNoMatch)340*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticFieldNoMatch) {
341*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
342*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
343*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType1;,unsupported" << std::endl
344*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType2;,max-target-o" << std::endl
345*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType3;,blocked" << std::endl;
346*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
347*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
348*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Sdk(), GetSFieldHiddenFlags(*dex_file));
349*795d594fSAndroid Build Coastguard Worker }
350*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticFieldLightunsupportedMatch)351*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticFieldLightunsupportedMatch) {
352*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
353*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
354*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:Ljava/lang/Object;,unsupported" << std::endl
355*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType2;,max-target-o" << std::endl
356*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType3;,blocked" << std::endl;
357*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
358*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
359*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Unsupported(), GetSFieldHiddenFlags(*dex_file));
360*795d594fSAndroid Build Coastguard Worker }
361*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticFieldDarkunsupportedMatch)362*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticFieldDarkunsupportedMatch) {
363*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
364*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
365*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType1;,unsupported" << std::endl
366*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:Ljava/lang/Object;,max-target-o" << std::endl
367*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType3;,blocked" << std::endl;
368*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
369*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
370*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::MaxTargetO(), GetSFieldHiddenFlags(*dex_file));
371*795d594fSAndroid Build Coastguard Worker }
372*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticFieldblockedMatch)373*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticFieldblockedMatch) {
374*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
375*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
376*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType1;,unsupported" << std::endl
377*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType2;,max-target-o" << std::endl
378*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:Ljava/lang/Object;,blocked" << std::endl;
379*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
380*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
381*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Blocked(), GetSFieldHiddenFlags(*dex_file));
382*795d594fSAndroid Build Coastguard Worker }
383*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticFieldTwoListsMatch1)384*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticFieldTwoListsMatch1) {
385*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
386*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
387*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType1;,unsupported" << std::endl
388*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:Ljava/lang/Object;,blocked,max-target-o" << std::endl;
389*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
390*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
391*795d594fSAndroid Build Coastguard Worker }
392*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticFieldTwoListsMatch2)393*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticFieldTwoListsMatch2) {
394*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
395*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
396*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType2;,max-target-o" << std::endl
397*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:Ljava/lang/Object;,blocked,unsupported" << std::endl;
398*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
399*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
400*795d594fSAndroid Build Coastguard Worker }
401*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticFieldTwoListsMatch3)402*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticFieldTwoListsMatch3) {
403*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
404*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
405*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:Ljava/lang/Object;,unsupported,max-target-o" << std::endl
406*795d594fSAndroid Build Coastguard Worker << "LMain;->sfield:LBadType3;,blocked" << std::endl;
407*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
408*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
409*795d594fSAndroid Build Coastguard Worker }
410*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceMethodNoMatch)411*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceMethodNoMatch) {
412*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
413*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
414*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType1;)V,unsupported" << std::endl
415*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType2;)V,max-target-o" << std::endl
416*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType3;)V,blocked" << std::endl;
417*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
418*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
419*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Sdk(), GetIMethodHiddenFlags(*dex_file));
420*795d594fSAndroid Build Coastguard Worker }
421*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceMethodLightunsupportedMatch)422*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceMethodLightunsupportedMatch) {
423*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
424*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
425*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(J)V,unsupported" << std::endl
426*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType2;)V,max-target-o" << std::endl
427*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType3;)V,blocked" << std::endl;
428*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
429*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
430*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Unsupported(), GetIMethodHiddenFlags(*dex_file));
431*795d594fSAndroid Build Coastguard Worker }
432*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceMethodDarkunsupportedMatch)433*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceMethodDarkunsupportedMatch) {
434*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
435*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
436*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType1;)V,unsupported" << std::endl
437*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(J)V,max-target-o" << std::endl
438*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType3;)V,blocked" << std::endl;
439*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
440*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
441*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::MaxTargetO(), GetIMethodHiddenFlags(*dex_file));
442*795d594fSAndroid Build Coastguard Worker }
443*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceMethodblockedMatch)444*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceMethodblockedMatch) {
445*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
446*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
447*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType1;)V,unsupported" << std::endl
448*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType2;)V,max-target-o" << std::endl
449*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(J)V,blocked" << std::endl;
450*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
451*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
452*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Blocked(), GetIMethodHiddenFlags(*dex_file));
453*795d594fSAndroid Build Coastguard Worker }
454*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceMethodTwoListsMatch1)455*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch1) {
456*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
457*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
458*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType1;)V,unsupported" << std::endl
459*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(J)V,blocked,max-target-o" << std::endl;
460*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
461*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
462*795d594fSAndroid Build Coastguard Worker }
463*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceMethodTwoListsMatch2)464*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch2) {
465*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
466*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
467*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType2;)V,max-target-o" << std::endl
468*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(J)V,blocked,unsupported" << std::endl;
469*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
470*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
471*795d594fSAndroid Build Coastguard Worker }
472*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceMethodTwoListsMatch3)473*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch3) {
474*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
475*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
476*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(J)V,unsupported,max-target-o" << std::endl
477*795d594fSAndroid Build Coastguard Worker << "LMain;->imethod(LBadType3;)V,blocked" << std::endl;
478*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
479*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
480*795d594fSAndroid Build Coastguard Worker }
481*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticMethodNoMatch)482*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticMethodNoMatch) {
483*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
484*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
485*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType1;)V,unsupported" << std::endl
486*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType2;)V,max-target-o" << std::endl
487*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType3;)V,blocked" << std::endl;
488*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
489*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
490*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Sdk(), GetSMethodHiddenFlags(*dex_file));
491*795d594fSAndroid Build Coastguard Worker }
492*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticMethodLightunsupportedMatch)493*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticMethodLightunsupportedMatch) {
494*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
495*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
496*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(Ljava/lang/Object;)V,unsupported" << std::endl
497*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType2;)V,max-target-o" << std::endl
498*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType3;)V,blocked" << std::endl;
499*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
500*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
501*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Unsupported(), GetSMethodHiddenFlags(*dex_file));
502*795d594fSAndroid Build Coastguard Worker }
503*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticMethodDarkunsupportedMatch)504*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticMethodDarkunsupportedMatch) {
505*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
506*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
507*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType1;)V,unsupported" << std::endl
508*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(Ljava/lang/Object;)V,max-target-o" << std::endl
509*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType3;)V,blocked" << std::endl;
510*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
511*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
512*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::MaxTargetO(), GetSMethodHiddenFlags(*dex_file));
513*795d594fSAndroid Build Coastguard Worker }
514*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticMethodblockedMatch)515*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticMethodblockedMatch) {
516*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
517*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
518*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType1;)V,unsupported" << std::endl
519*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType2;)V,max-target-o" << std::endl
520*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(Ljava/lang/Object;)V,blocked" << std::endl;
521*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
522*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
523*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Blocked(), GetSMethodHiddenFlags(*dex_file));
524*795d594fSAndroid Build Coastguard Worker }
525*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticMethodTwoListsMatch1)526*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticMethodTwoListsMatch1) {
527*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
528*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
529*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType1;)V,unsupported" << std::endl
530*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(Ljava/lang/Object;)V,blocked,max-target-o" << std::endl;
531*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
532*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
533*795d594fSAndroid Build Coastguard Worker }
534*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticMethodTwoListsMatch2)535*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticMethodTwoListsMatch2) {
536*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
537*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
538*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType2;)V,max-target-o" << std::endl
539*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(Ljava/lang/Object;)V,blocked,unsupported" << std::endl;
540*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
541*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
542*795d594fSAndroid Build Coastguard Worker }
543*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticMethodTwoListsMatch3)544*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticMethodTwoListsMatch3) {
545*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
546*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
547*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(Ljava/lang/Object;)V,unsupported,max-target-o" << std::endl
548*795d594fSAndroid Build Coastguard Worker << "LMain;->smethod(LBadType3;)V,blocked" << std::endl;
549*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
550*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
551*795d594fSAndroid Build Coastguard Worker }
552*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceNativeMethodNoMatch)553*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceNativeMethodNoMatch) {
554*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
555*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
556*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType1;)V,unsupported" << std::endl
557*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType2;)V,max-target-o" << std::endl
558*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType3;)V,blocked" << std::endl;
559*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
560*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
561*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Sdk(), GetINMethodHiddenFlags(*dex_file));
562*795d594fSAndroid Build Coastguard Worker }
563*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceNativeMethodLightunsupportedMatch)564*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceNativeMethodLightunsupportedMatch) {
565*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
566*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
567*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(C)V,unsupported" << std::endl
568*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType2;)V,max-target-o" << std::endl
569*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType3;)V,blocked" << std::endl;
570*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
571*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
572*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Unsupported(), GetINMethodHiddenFlags(*dex_file));
573*795d594fSAndroid Build Coastguard Worker }
574*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceNativeMethodDarkunsupportedMatch)575*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceNativeMethodDarkunsupportedMatch) {
576*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
577*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
578*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType1;)V,unsupported" << std::endl
579*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(C)V,max-target-o" << std::endl
580*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType3;)V,blocked" << std::endl;
581*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
582*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
583*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::MaxTargetO(), GetINMethodHiddenFlags(*dex_file));
584*795d594fSAndroid Build Coastguard Worker }
585*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceNativeMethodblockedMatch)586*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceNativeMethodblockedMatch) {
587*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
588*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
589*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType1;)V,unsupported" << std::endl
590*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType2;)V,max-target-o" << std::endl
591*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(C)V,blocked" << std::endl;
592*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
593*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
594*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Blocked(), GetINMethodHiddenFlags(*dex_file));
595*795d594fSAndroid Build Coastguard Worker }
596*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceNativeMethodTwoListsMatch1)597*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch1) {
598*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
599*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
600*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType1;)V,unsupported" << std::endl
601*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(C)V,blocked,max-target-o" << std::endl;
602*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
603*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
604*795d594fSAndroid Build Coastguard Worker }
605*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceNativeMethodTwoListsMatch2)606*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch2) {
607*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
608*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
609*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(C)V,blocked,unsupported" << std::endl
610*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType2;)V,max-target-o" << std::endl;
611*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
612*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
613*795d594fSAndroid Build Coastguard Worker }
614*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceNativeMethodTwoListsMatch3)615*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch3) {
616*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
617*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
618*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(C)V,unsupported,max-target-o" << std::endl
619*795d594fSAndroid Build Coastguard Worker << "LMain;->inmethod(LBadType3;)V,blocked" << std::endl;
620*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
621*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
622*795d594fSAndroid Build Coastguard Worker }
623*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticNativeMethodNoMatch)624*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticNativeMethodNoMatch) {
625*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
626*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
627*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType1;)V,unsupported" << std::endl
628*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType2;)V,max-target-o" << std::endl
629*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType3;)V,blocked" << std::endl;
630*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
631*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
632*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Sdk(), GetSNMethodHiddenFlags(*dex_file));
633*795d594fSAndroid Build Coastguard Worker }
634*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticNativeMethodLightunsupportedMatch)635*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticNativeMethodLightunsupportedMatch) {
636*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
637*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
638*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(Ljava/lang/Integer;)V,unsupported" << std::endl
639*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType2;)V,max-target-o" << std::endl
640*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType3;)V,blocked" << std::endl;
641*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
642*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
643*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Unsupported(), GetSNMethodHiddenFlags(*dex_file));
644*795d594fSAndroid Build Coastguard Worker }
645*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticNativeMethodDarkunsupportedMatch)646*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticNativeMethodDarkunsupportedMatch) {
647*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
648*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
649*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType1;)V,unsupported" << std::endl
650*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(Ljava/lang/Integer;)V,max-target-o" << std::endl
651*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType3;)V,blocked" << std::endl;
652*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
653*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
654*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::MaxTargetO(), GetSNMethodHiddenFlags(*dex_file));
655*795d594fSAndroid Build Coastguard Worker }
656*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticNativeMethodblockedMatch)657*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticNativeMethodblockedMatch) {
658*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
659*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
660*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType1;)V,unsupported" << std::endl
661*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType2;)V,max-target-o" << std::endl
662*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(Ljava/lang/Integer;)V,blocked" << std::endl;
663*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
664*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
665*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Blocked(), GetSNMethodHiddenFlags(*dex_file));
666*795d594fSAndroid Build Coastguard Worker }
667*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticNativeMethodTwoListsMatch1)668*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch1) {
669*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
670*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
671*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType1;)V,unsupported" << std::endl
672*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(Ljava/lang/Integer;)V,blocked,max-target-o" << std::endl;
673*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
674*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
675*795d594fSAndroid Build Coastguard Worker }
676*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticNativeMethodTwoListsMatch2)677*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch2) {
678*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
679*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
680*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(Ljava/lang/Integer;)V,blocked,unsupported" << std::endl
681*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType2;)V,max-target-o" << std::endl;
682*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
683*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
684*795d594fSAndroid Build Coastguard Worker }
685*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,StaticNativeMethodTwoListsMatch3)686*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch3) {
687*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
688*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
689*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(Ljava/lang/Integer;)V,unsupported,max-target-o" << std::endl
690*795d594fSAndroid Build Coastguard Worker << "LMain;->snmethod(LBadType3;)V,blocked" << std::endl;
691*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
692*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
693*795d594fSAndroid Build Coastguard Worker }
694*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldCorePlatformApiMatch)695*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldCorePlatformApiMatch) {
696*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
697*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
698*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType1;,unsupported" << std::endl
699*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType2;,max-target-o" << std::endl
700*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,unsupported,core-platform-api" << std::endl;
701*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
702*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
703*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::CorePlatformApi() |
704*795d594fSAndroid Build Coastguard Worker hiddenapi::ApiList::Unsupported(), GetIFieldHiddenFlags(*dex_file));
705*795d594fSAndroid Build Coastguard Worker }
706*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldTestApiMatch)707*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldTestApiMatch) {
708*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
709*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
710*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType1;,unsupported" << std::endl
711*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType2;,max-target-o" << std::endl
712*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,unsupported,test-api" << std::endl;
713*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
714*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
715*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::TestApi()
716*795d594fSAndroid Build Coastguard Worker | hiddenapi::ApiList::Unsupported(), GetIFieldHiddenFlags(*dex_file));
717*795d594fSAndroid Build Coastguard Worker }
718*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldUnknownFlagMatch)719*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldUnknownFlagMatch) {
720*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
721*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
722*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType1;,unsupported" << std::endl
723*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:LBadType2;,max-target-o" << std::endl
724*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,unsupported,unknown-flag" << std::endl;
725*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {}, dex);
726*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
727*795d594fSAndroid Build Coastguard Worker }
728*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldMaxSdkHigherThanMaxHiddenApiLevel)729*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldMaxSdkHigherThanMaxHiddenApiLevel) {
730*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
731*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
732*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,max-target-r" << std::endl;
733*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {"--max-hiddenapi-level=max-target-q"}, dex);
734*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(dex_file.get(), nullptr);
735*795d594fSAndroid Build Coastguard Worker }
736*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldMaxSdkEqualsMaxHiddenApiLevel)737*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldMaxSdkEqualsMaxHiddenApiLevel) {
738*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
739*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
740*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,max-target-r" << std::endl;
741*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {"--max-hiddenapi-level=max-target-r"}, dex);
742*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
743*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::MaxTargetR(), GetIFieldHiddenFlags(*dex_file));
744*795d594fSAndroid Build Coastguard Worker }
745*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldMaxSdkLowerThanMaxHiddenApiLevel)746*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldMaxSdkLowerThanMaxHiddenApiLevel) {
747*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
748*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
749*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,max-target-q" << std::endl;
750*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {"--max-hiddenapi-level=max-target-r"}, dex);
751*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
752*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::MaxTargetQ(), GetIFieldHiddenFlags(*dex_file));
753*795d594fSAndroid Build Coastguard Worker }
754*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldBlockedUnchangedByMaxHiddenApiLevel)755*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldBlockedUnchangedByMaxHiddenApiLevel) {
756*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
757*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
758*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,blocked" << std::endl;
759*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {"--max-hiddenapi-level=max-target-r"}, dex);
760*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
761*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Blocked(), GetIFieldHiddenFlags(*dex_file));
762*795d594fSAndroid Build Coastguard Worker }
763*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldUnsupportedUnchangedByMaxHiddenApiLevel)764*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldUnsupportedUnchangedByMaxHiddenApiLevel) {
765*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
766*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
767*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,unsupported" << std::endl;
768*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {"--max-hiddenapi-level=max-target-r"}, dex);
769*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
770*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Unsupported(), GetIFieldHiddenFlags(*dex_file));
771*795d594fSAndroid Build Coastguard Worker }
772*795d594fSAndroid Build Coastguard Worker
TEST_F(HiddenApiTest,InstanceFieldSdkUnchangedByMaxHiddenApiLevel)773*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InstanceFieldSdkUnchangedByMaxHiddenApiLevel) {
774*795d594fSAndroid Build Coastguard Worker ScratchFile dex, flags_csv;
775*795d594fSAndroid Build Coastguard Worker OpenStream(flags_csv)
776*795d594fSAndroid Build Coastguard Worker << "LMain;->ifield:I,sdk" << std::endl;
777*795d594fSAndroid Build Coastguard Worker auto dex_file = RunHiddenapiEncode(flags_csv, {"--max-hiddenapi-level=max-target-r"}, dex);
778*795d594fSAndroid Build Coastguard Worker ASSERT_NE(dex_file.get(), nullptr);
779*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(hiddenapi::ApiList::Sdk(), GetIFieldHiddenFlags(*dex_file));
780*795d594fSAndroid Build Coastguard Worker }
781*795d594fSAndroid Build Coastguard Worker
782*795d594fSAndroid Build Coastguard Worker // The following tests use this class hierarchy:
783*795d594fSAndroid Build Coastguard Worker //
784*795d594fSAndroid Build Coastguard Worker // AbstractPackageClass PublicInterface
785*795d594fSAndroid Build Coastguard Worker // | |
786*795d594fSAndroid Build Coastguard Worker // | ┌----------------┘
787*795d594fSAndroid Build Coastguard Worker // | |
788*795d594fSAndroid Build Coastguard Worker // PackageClass
789*795d594fSAndroid Build Coastguard Worker //
790*795d594fSAndroid Build Coastguard Worker // Only PublicInterface is in stubs.
791*795d594fSAndroid Build Coastguard Worker
792*795d594fSAndroid Build Coastguard Worker // Test a method declared in PublicInterface and defined in PackageClass.
TEST_F(HiddenApiTest,InterfaceMethodImplemented)793*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InterfaceMethodImplemented) {
794*795d594fSAndroid Build Coastguard Worker ScratchFile flags_csv;
795*795d594fSAndroid Build Coastguard Worker ASSERT_TRUE(RunHiddenapiList(flags_csv));
796*795d594fSAndroid Build Coastguard Worker auto flags = ReadFlagsCsvFile(flags_csv);
797*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(SafeMapGet("LPackageClass;->publicMethod1()V", flags), "public-api");
798*795d594fSAndroid Build Coastguard Worker }
799*795d594fSAndroid Build Coastguard Worker
800*795d594fSAndroid Build Coastguard Worker // Test a method declared in PublicInterface, defined in AbstractPackageClass and
801*795d594fSAndroid Build Coastguard Worker // inherited by PackageClass.
TEST_F(HiddenApiTest,InterfaceMethodImplementedInParent)802*795d594fSAndroid Build Coastguard Worker TEST_F(HiddenApiTest, InterfaceMethodImplementedInParent) {
803*795d594fSAndroid Build Coastguard Worker ScratchFile flags_csv;
804*795d594fSAndroid Build Coastguard Worker ASSERT_TRUE(RunHiddenapiList(flags_csv));
805*795d594fSAndroid Build Coastguard Worker auto flags = ReadFlagsCsvFile(flags_csv);
806*795d594fSAndroid Build Coastguard Worker ASSERT_EQ(SafeMapGet("LAbstractPackageClass;->publicMethod2()V", flags), "public-api");
807*795d594fSAndroid Build Coastguard Worker }
808*795d594fSAndroid Build Coastguard Worker
809*795d594fSAndroid Build Coastguard Worker } // namespace art
810