From a72bde7d4aed9704cca946c43563ff1983eb86fa Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 28 Sep 2017 13:36:48 -0700 Subject: checkvintf: checks compatibility between files checkvintf is a host binary that checks compatibility between a manifest and a matrix. Example usage: $ checkvintf system/libhidl/manifest.xml \ device/foo/bar/compatibility_matrix.xml If compatible, write "true\n" to stdout and exit status = 0. If incompatible, write "false\n" to stdout, write error message to stderr, and exit status = 1. If I/O error or parse error, write error message to stderr and exit status = -1. Test: checkvintf Change-Id: I8d4f357f80817fcc2e6216f0a9a1f5658c02cd2d Fixes: 66966881 --- Android.bp | 13 +++++++++++ check_vintf.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ utils.h | 5 ++--- 3 files changed, 83 insertions(+), 3 deletions(-) create mode 100644 check_vintf.cpp diff --git a/Android.bp b/Android.bp index 2b39ad8..c2419e4 100644 --- a/Android.bp +++ b/Android.bp @@ -89,6 +89,19 @@ cc_binary { ], } +cc_binary_host { + name: "checkvintf", + defaults: ["libvintf-defaults"], + shared_libs: [ + "libvintf", + "libbase" + ], + srcs: [ + "check_vintf.cpp", + "utils.cpp" + ], +} + cc_binary_host { name: "assemble_vintf", defaults: ["libvintf-defaults"], diff --git a/check_vintf.cpp b/check_vintf.cpp new file mode 100644 index 0000000..211702e --- /dev/null +++ b/check_vintf.cpp @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2017 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 + +#include +#include "utils.h" + +namespace android { +namespace vintf { + +template +std::unique_ptr readObject(const std::string& path, const XmlConverter& converter) { + std::string xml; + status_t err = details::gFetcher->fetch(path, xml); + if (err != OK) { + std::cerr << "Error: Cannot read '" << path << "': " << strerror(-err) << std::endl; + return nullptr; + } + auto ret = std::make_unique(); + if (!converter(ret.get(), xml)) { + std::cerr << "Error: Cannot parse '" << path << "': " << converter.lastError() << std::endl; + return nullptr; + } + return ret; +} + +} // namespace vintf +} // namespace android + +int main(int argc, char** argv) { + using namespace android::vintf; + if (argc < 3) { + std::cerr << "usage: " << argv[0] << " " << std::endl + << " Checks compatibility between a manifest and a compatibility matrix." + << std::endl; + return -1; + } + + auto manifest = readObject(argv[1], gHalManifestConverter); + auto matrix = readObject(argv[2], gCompatibilityMatrixConverter); + if (manifest == nullptr || matrix == nullptr) { + return -1; + } + + std::string error; + if (!manifest->checkCompatibility(*matrix, &error)) { + std::cerr << "Error: Incompatible: " << error << std::endl; + std::cout << "false" << std::endl; + return 1; + } + + std::cout << "true" << std::endl; + return 0; +} diff --git a/utils.h b/utils.h index 973c524..c08a22e 100644 --- a/utils.h +++ b/utils.h @@ -23,9 +23,8 @@ #include #include - -#include "RuntimeInfo.h" -#include "parse_xml.h" +#include +#include namespace android { namespace vintf { -- cgit v1.2.3-54-g00ecf