// Copyright (C) 2019 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "apk_validator.h"
namespace tf = tuningfork;
namespace {
int validateApk(const char *apk_path, const std::string asset_path,
bool enforce_enums_in_annotations,
bool check_dev_fidelityparams, bool debug) {
#undef open
std::shared_ptr<android::ZipFileRO> zipFile(
android::ZipFileRO::open(apk_path));
#define open ___xxx_unix_open
if (zipFile == nullptr) {
ERROR(ERROR_CANT_FIND_FILE, "Could not open " << apk_path);
}
if (debug) {
std::cout << "Opened " << apk_path << std::endl;
std::cout << "Searching under " << asset_path << std::endl;
}
tf::ApkValidator validator(zipFile, asset_path, debug);
return validator.Validate(enforce_enums_in_annotations,
check_dev_fidelityparams);
}
} // anonymous namespace
int main(int argc, char **argv) {
std::string asset_path = "assets/tuningfork/";
bool enforce_enums_in_annotations = true;
bool check_dev_fidelityparams = true;
bool debug = false;
constexpr char usage_string[] =
"Usage: tfvalidate [-a <asset_path_in_apk>] [-N] [-F] [-d] <apk_path>";
int opt;
optind = 1;
while ((opt=getopt(argc, argv, "+a:NFd")) != -1){
switch(opt) {
case 'a':
asset_path = optarg;
if ( asset_path.size() > 0 && asset_path.back() != '/' )
asset_path += '/';
break;
case 'N':
enforce_enums_in_annotations = false;
break;
case 'F':
check_dev_fidelityparams = false;
break;
case 'd':
debug = true;
break;
default:
ERROR(ERROR_BAD_USAGE, usage_string);
}
}
if (optind < argc) {
for (int i=optind; i<argc; ++i) {
int ret = validateApk(argv[i], asset_path, enforce_enums_in_annotations,
check_dev_fidelityparams, debug);
if (ret != NO_ERROR) {
ERROR(ret, "Error validating " << argv[i]);
} else {
std::cout << "Validated " << argv[i] << std::endl;
}
}
}
else
ERROR(ERROR_BAD_USAGE, usage_string);
return NO_ERROR;
}