vendor Catch2 and ETL
This commit is contained in:
11
contrib/fsfw_contrib/Catch2-3.7.1/tools/misc/CMakeLists.txt
Normal file
11
contrib/fsfw_contrib/Catch2-3.7.1/tools/misc/CMakeLists.txt
Normal file
@ -0,0 +1,11 @@
|
||||
cmake_minimum_required(VERSION 3.0)
|
||||
|
||||
project(CatchCoverageHelper)
|
||||
|
||||
add_executable(CoverageHelper coverage-helper.cpp)
|
||||
set_property(TARGET CoverageHelper PROPERTY CXX_STANDARD 11)
|
||||
set_property(TARGET CoverageHelper PROPERTY CXX_STANDARD_REQUIRED ON)
|
||||
set_property(TARGET CoverageHelper PROPERTY CXX_EXTENSIONS OFF)
|
||||
if (MSVC)
|
||||
target_compile_options( CoverageHelper PRIVATE /W4 /w44265 /WX /w44061 /w44062 )
|
||||
endif()
|
@ -0,0 +1,21 @@
|
||||
SETLOCAL EnableDelayedExpansion
|
||||
|
||||
@REM # Possibilities:
|
||||
@REM # Debug build + coverage
|
||||
@REM # Debug build + examples
|
||||
@REM # Debug build + ---
|
||||
@REM # Release build
|
||||
if "%CONFIGURATION%"=="Debug" (
|
||||
if "%coverage%"=="1" (
|
||||
@REM # coverage needs to build the special helper as well as the main
|
||||
cmake -Htools/misc -Bbuild-misc -A%PLATFORM% || exit /b !ERRORLEVEL!
|
||||
cmake --build build-misc || exit /b !ERRORLEVEL!
|
||||
cmake -H. -BBuild -A%PLATFORM% -DCATCH_TEST_USE_WMAIN=%wmain% -DMEMORYCHECK_COMMAND=build-misc\Debug\CoverageHelper.exe -DMEMORYCHECK_COMMAND_OPTIONS=--sep-- -DMEMORYCHECK_TYPE=Valgrind -DCATCH_BUILD_EXAMPLES=%examples% -DCATCH_BUILD_EXTRA_TESTS=%examples% -DCATCH_ENABLE_CONFIGURE_TESTS=%configure_tests% -DCATCH_DEVELOPMENT_BUILD=ON || exit /b !ERRORLEVEL!
|
||||
) else (
|
||||
@REM # We know that coverage is 0
|
||||
cmake -H. -BBuild -A%PLATFORM% -DCATCH_TEST_USE_WMAIN=%wmain% -DCATCH_BUILD_EXAMPLES=%examples% -DCATCH_BUILD_EXTRA_TESTS=%examples% -DCATCH_BUILD_SURROGATES=%surrogates% -DCATCH_DEVELOPMENT_BUILD=ON -DCATCH_ENABLE_CONFIGURE_TESTS=%configure_tests% || exit /b !ERRORLEVEL!
|
||||
)
|
||||
)
|
||||
if "%CONFIGURATION%"=="Release" (
|
||||
cmake -H. -BBuild -A%PLATFORM% -DCATCH_TEST_USE_WMAIN=%wmain% -DCATCH_DEVELOPMENT_BUILD=ON || exit /b !ERRORLEVEL!
|
||||
)
|
@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import glob
|
||||
import subprocess
|
||||
|
||||
if __name__ == '__main__':
|
||||
cov_files = list(glob.glob('tests/cov-report*.bin'))
|
||||
base_cmd = ['OpenCppCoverage', '--quiet', '--export_type=cobertura:cobertura.xml'] + ['--input_coverage={}'.format(f) for f in cov_files]
|
||||
subprocess.check_call(base_cmd)
|
@ -0,0 +1,17 @@
|
||||
SETLOCAL EnableDelayedExpansion
|
||||
|
||||
rem Disable launching the JIT debugger for ctest.exe
|
||||
reg add "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\AutoExclusionList" /v "ctest.ext" /t REG_DWORD /d 1
|
||||
cd Build
|
||||
if "%CONFIGURATION%"=="Debug" (
|
||||
if "%coverage%"=="1" (
|
||||
ctest -j 2 -C %CONFIGURATION% -D ExperimentalMemCheck -LE uses-signals || exit /b !ERRORLEVEL!
|
||||
python ..\tools\misc\appveyorMergeCoverageScript.py || exit /b !ERRORLEVEL!
|
||||
codecov --root .. --no-color --disable gcov -f cobertura.xml -t %CODECOV_TOKEN% || exit /b !ERRORLEVEL!
|
||||
) else (
|
||||
ctest -j 2 -C %CONFIGURATION% || exit /b !ERRORLEVEL!
|
||||
)
|
||||
)
|
||||
if "%CONFIGURATION%"=="Release" (
|
||||
ctest -j 2 -C %CONFIGURATION% || exit /b !ERRORLEVEL!
|
||||
)
|
142
contrib/fsfw_contrib/Catch2-3.7.1/tools/misc/coverage-helper.cpp
Normal file
142
contrib/fsfw_contrib/Catch2-3.7.1/tools/misc/coverage-helper.cpp
Normal file
@ -0,0 +1,142 @@
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cassert>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <numeric>
|
||||
#include <regex>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
std::string escape_arg(const std::string& arg) {
|
||||
if (arg.empty() == false &&
|
||||
arg.find_first_of(" \t\n\v\"") == arg.npos) {
|
||||
return arg;
|
||||
}
|
||||
|
||||
std::string escaped;
|
||||
escaped.push_back('"');
|
||||
for (auto it = arg.begin(); ; ++it) {
|
||||
int num_backslashes = 0;
|
||||
|
||||
while (it != arg.end() && *it == '\\') {
|
||||
++it;
|
||||
++num_backslashes;
|
||||
}
|
||||
|
||||
if (it == arg.end()) {
|
||||
escaped.append(num_backslashes * 2, '\\');
|
||||
break;
|
||||
} else if (*it == '"') {
|
||||
escaped.append((num_backslashes + 1) * 2, '\\');
|
||||
escaped.push_back('"');
|
||||
escaped.push_back(*it);
|
||||
} else {
|
||||
escaped.append(num_backslashes, '\\');
|
||||
escaped.push_back(*it);
|
||||
}
|
||||
}
|
||||
escaped.push_back('"');
|
||||
|
||||
return escaped;
|
||||
}
|
||||
|
||||
|
||||
void create_empty_file(std::string const& path) {
|
||||
std::ofstream ofs(path);
|
||||
ofs << '\n';
|
||||
}
|
||||
|
||||
const std::string separator = "--sep--";
|
||||
const std::string logfile_prefix = "--log-file=";
|
||||
|
||||
bool starts_with(std::string const& str, std::string const& pref) {
|
||||
return str.find(pref) == 0;
|
||||
}
|
||||
|
||||
int parse_log_file_arg(std::string const& arg) {
|
||||
assert(starts_with(arg, logfile_prefix) && "Attempting to parse incorrect arg!");
|
||||
auto fname = arg.substr(logfile_prefix.size());
|
||||
create_empty_file(fname);
|
||||
std::regex regex("MemoryChecker\\.(\\d+)\\.log", std::regex::icase);
|
||||
std::smatch match;
|
||||
if (std::regex_search(fname, match, regex)) {
|
||||
return std::stoi(match[1]);
|
||||
} else {
|
||||
throw std::domain_error("Couldn't find desired expression in string: " + fname);
|
||||
}
|
||||
}
|
||||
|
||||
std::string catch_path(std::string path) {
|
||||
auto start = path.find("catch");
|
||||
// try capitalized instead
|
||||
if (start == std::string::npos) {
|
||||
start = path.find("Catch");
|
||||
}
|
||||
if (start == std::string::npos) {
|
||||
throw std::domain_error("Couldn't find Catch's base path");
|
||||
}
|
||||
auto end = path.find_first_of("\\/", start);
|
||||
return path.substr(0, end);
|
||||
}
|
||||
|
||||
std::string windowsify_path(std::string path) {
|
||||
for (auto& c : path) {
|
||||
if (c == '/') {
|
||||
c = '\\';
|
||||
}
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
int exec_cmd(std::string const& cmd, int log_num, std::string const& path) {
|
||||
std::array<char, 128> buffer;
|
||||
|
||||
// cmd has already been escaped outside this function.
|
||||
auto real_cmd = "OpenCppCoverage --export_type binary:cov-report" + std::to_string(log_num)
|
||||
+ ".bin --quiet " + "--sources " + escape_arg(path) + "\\src" + " --cover_children -- " + cmd;
|
||||
std::cout << "=== Marker ===: Cmd: " << real_cmd << '\n';
|
||||
auto pipe = _popen(real_cmd.c_str(), "r");
|
||||
|
||||
if (!pipe) {
|
||||
throw std::runtime_error("popen() failed!");
|
||||
}
|
||||
while (!feof(pipe)) {
|
||||
if (fgets(buffer.data(), 128, pipe) != nullptr) {
|
||||
std::cout << buffer.data();
|
||||
}
|
||||
}
|
||||
|
||||
auto ret = _pclose(pipe);
|
||||
if (ret == -1) {
|
||||
throw std::runtime_error("underlying error in pclose()");
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
// argv should be:
|
||||
// [0]: our path
|
||||
// [1]: "--log-file=<path>"
|
||||
// [2]: "--sep--"
|
||||
// [3]+: the actual command
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
std::vector<std::string> args(argv, argv + argc);
|
||||
auto sep = std::find(begin(args), end(args), separator);
|
||||
assert(sep - begin(args) == 2 && "Structure differs from expected!");
|
||||
|
||||
auto num = parse_log_file_arg(args[1]);
|
||||
|
||||
auto cmdline = std::accumulate(++sep, end(args), std::string{}, [] (const std::string& lhs, const std::string& rhs) {
|
||||
return lhs + ' ' + escape_arg(rhs);
|
||||
});
|
||||
|
||||
try {
|
||||
return exec_cmd(cmdline, num, windowsify_path(catch_path(args[0])));
|
||||
} catch (std::exception const& ex) {
|
||||
std::cerr << "Helper failed with: '" << ex.what() << "'\n";
|
||||
return 12;
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
# Downloads are done from the official github release page links
|
||||
$downloadUrl = "https://github.com/OpenCppCoverage/OpenCppCoverage/releases/download/release-0.9.9.0/OpenCppCoverageSetup-x64-0.9.9.0.exe"
|
||||
$installerPath = [System.IO.Path]::Combine($Env:USERPROFILE, "Downloads", "OpenCppCoverageSetup.exe")
|
||||
|
||||
if(-Not (Test-Path $installerPath)) {
|
||||
Write-Host -ForegroundColor White ("Downloading OpenCppCoverage from: " + $downloadUrl)
|
||||
Start-FileDownload $downloadUrl -FileName $installerPath
|
||||
}
|
||||
|
||||
Write-Host -ForegroundColor White "About to install OpenCppCoverage..."
|
||||
|
||||
$installProcess = (Start-Process $installerPath -ArgumentList '/VERYSILENT' -PassThru -Wait)
|
||||
if($installProcess.ExitCode -ne 0) {
|
||||
throw [System.String]::Format("Failed to install OpenCppCoverage, ExitCode: {0}.", $installProcess.ExitCode)
|
||||
}
|
||||
|
||||
# Assume standard, boring, installation path of ".../Program Files/OpenCppCoverage"
|
||||
$installPath = [System.IO.Path]::Combine(${Env:ProgramFiles}, "OpenCppCoverage")
|
||||
$env:Path="$env:Path;$installPath"
|
Reference in New Issue
Block a user