diff --git a/vndk/tools/header-checker/Android.bp b/vndk/tools/header-checker/Android.bp index f017bcb40..12816bfbf 100644 --- a/vndk/tools/header-checker/Android.bp +++ b/vndk/tools/header-checker/Android.bp @@ -198,10 +198,12 @@ cc_test_host { ], static_libs: [ + "libbase", "libgtest", "libgtest_main", "libheader-checker", "libjsoncpp", + "liblog", ], shared_libs: [ diff --git a/vndk/tools/header-checker/src/utils/source_path_utils.cpp b/vndk/tools/header-checker/src/utils/source_path_utils.cpp index a3f34f651..8639f1655 100644 --- a/vndk/tools/header-checker/src/utils/source_path_utils.cpp +++ b/vndk/tools/header-checker/src/utils/source_path_utils.cpp @@ -29,15 +29,11 @@ namespace utils { static const std::vector header_extensions{ ".h", ".hh", ".hpp", ".hxx", ".h++", ".inl", ".inc", ".ipp", ".h.generic"}; -static bool ShouldSkipFile(llvm::StringRef &file_name) { - // Look for header files only - if (file_name.empty() || file_name.startswith(".")) { - return true; - } +static bool HasHeaderExtension(llvm::StringRef &file_name) { return std::find_if(header_extensions.begin(), header_extensions.end(), [file_name](const std::string &e) { return file_name.endswith(e); - }) == header_extensions.end(); + }) != header_extensions.end(); } static std::string GetCwd() { @@ -135,11 +131,14 @@ static bool CollectExportedHeaderSet(const std::string &dir_name, const std::string &file_path = walker->path(); llvm::StringRef file_name(llvm::sys::path::filename(file_path)); - // Ignore non header files. - if (ShouldSkipFile(file_name)) { + if (file_name.empty() || file_name.startswith(".")) { + // Ignore hidden files and directories. walker.no_push(); continue; } + if (!HasHeaderExtension(file_name)) { + continue; + } llvm::ErrorOr status = walker->status(); if (!status) { diff --git a/vndk/tools/header-checker/src/utils/source_path_utils_test.cpp b/vndk/tools/header-checker/src/utils/source_path_utils_test.cpp index 2b74eba16..96e637300 100644 --- a/vndk/tools/header-checker/src/utils/source_path_utils_test.cpp +++ b/vndk/tools/header-checker/src/utils/source_path_utils_test.cpp @@ -14,12 +14,58 @@ #include "utils/source_path_utils.h" +#include #include +#include +#include namespace header_checker { namespace utils { +TEST(SourcePathUtilsTest, CollectAllExportedHeaders) { + // Prepare a header directory. + TemporaryDir temp_dir; + const std::filesystem::path header_dir = temp_dir.path; + + const std::filesystem::path header = header_dir / "header.h"; + ASSERT_TRUE(android::base::WriteStringToFile("// test", header)); + + std::error_code ec; + const std::filesystem::path subdir = header_dir / "subdir"; + ASSERT_TRUE(std::filesystem::create_directory(subdir, ec)); + ASSERT_FALSE(ec); + + const std::filesystem::path subdir_link = header_dir / "subdir_link"; + std::filesystem::create_directory_symlink(subdir, subdir_link, ec); + ASSERT_FALSE(ec); + + const std::filesystem::path hidden_subdir_link = header_dir / ".subdir_link"; + std::filesystem::create_directory_symlink(subdir, hidden_subdir_link, ec); + ASSERT_FALSE(ec); + + const std::filesystem::path header_link = subdir / "header_link.h"; + std::filesystem::create_symlink(header, header_link, ec); + ASSERT_FALSE(ec); + + const std::filesystem::path hidden_header_link = subdir / ".header_link.h"; + std::filesystem::create_symlink(header, hidden_header_link, ec); + ASSERT_FALSE(ec); + + const std::filesystem::path non_header_link = subdir / "header_link.txt"; + std::filesystem::create_symlink(header, non_header_link, ec); + ASSERT_FALSE(ec); + // Test the function. + std::vector exported_header_dirs{header_dir}; + std::vector root_dirs{{header_dir, "include"}}; + std::set headers = + CollectAllExportedHeaders(exported_header_dirs, root_dirs); + + std::set expected_headers{"include/header.h", + "include/subdir/header_link.h", + "include/subdir_link/header_link.h"}; + ASSERT_EQ(headers, expected_headers); +} TEST(SourcePathUtilsTest, NormalizeAbsolutePaths) { const std::vector args{"/root/dir"};