pe-parse/tests/corkami_test.cpp

75 lines
2.1 KiB
C++
Raw Normal View History

#include <pe-parse/parse.h>
#include <catch2/catch.hpp>
#include <string>
#include <unordered_set>
#include <vector>
#include "filesystem_compat.h"
// Whether the corkami testset has been downloaded
// Path to corkami PEs
#if defined(CORKAMI_PE_PATH)
// Return a vector of all PE files immediately under `dir`
static std::vector<fs::path> PEFilesInDir(const fs::path &dir) {
std::vector<fs::path> all_entries;
if (!fs::exists(dir)) {
return all_entries;
}
for (const auto &entry : fs::directory_iterator(dir)) {
if ((entry.path().extension() == ".exe" ||
entry.path().extension() == ".dll" ||
entry.path().extension() == ".sys") &&
fs::is_regular_file(entry)) {
all_entries.emplace_back(entry.path());
}
}
return all_entries;
}
namespace peparse {
static const std::unordered_set<std::string> kKnownPEFailure{
"virtsectblXP.exe", "maxsec_lowaligW7.exe",
"maxsecXP.exe", "nullSOH-XP.exe",
"tinyXP.exe", "tinydllXP.dll",
"virtrelocXP.exe", "foldedhdrW7.exe",
"maxvals.exe", "d_nonnull.dll",
"reloccrypt.exe", "d_resource.dll",
"fakerelocs.exe", "lfanew_relocW7.exe",
"bigSoRD.exe", "tinyW7.exe",
"reloccryptW8.exe", "standard.exe",
"exe2pe.exe", "tinygui.exe",
"dllfwloop.dll", "tinydrivXP.sys",
"tiny.exe", "tinydll.dll",
"foldedhdr.exe", "dllmaxvals.dll",
"reloccryptXP.exe", "dosZMXP.exe",
"tinyW7_3264.exe", "dllfw.dll",
"hdrcode.exe", "ibrelocW7.exe",
"d_tiny.dll", "sc.exe"};
TEST_CASE("Corkami PEs smoketest", "[corkami]") {
for (fs::path path : PEFilesInDir(CORKAMI_PE_PATH)) {
std::string pe_name = path.filename().string();
SECTION(pe_name) {
parsed_pe *p = ParsePEFromFile(path.string().c_str());
if (kKnownPEFailure.count(pe_name)) {
CHECKED_ELSE(!p) {
FAIL("Previously failing test now passes! Remove from set");
}
} else {
CHECKED_ELSE(p) {
FAIL(GetPEErrString() + " at " + GetPEErrLoc());
}
DestructParsedPE(p);
}
}
}
}
} // namespace peparse
#endif