diff --git a/.github/workflows/linux_gcc_cmake_build.yml b/.github/workflows/linux_gcc_cmake_build.yml index 4b25ca9c..a159ea7d 100644 --- a/.github/workflows/linux_gcc_cmake_build.yml +++ b/.github/workflows/linux_gcc_cmake_build.yml @@ -191,7 +191,7 @@ jobs: working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_DEV_SINGLE}} run: cmake --build . --target cppcheck_static_analysis - - name: Build Debug for test + - name: Build Debug and test # Linux has 2 cores run: | cmake --build --list-presets diff --git a/.github/workflows/win_cmake_build.yml b/.github/workflows/win_cmake_build.yml index 2bcadad4..1d4a1098 100644 --- a/.github/workflows/win_cmake_build.yml +++ b/.github/workflows/win_cmake_build.yml @@ -44,7 +44,13 @@ jobs: cmake --list-presets cmake --preset=${{env.BUILD_MSVC_PRESET}} - - name: Build + - name: Build Debug and test + working-directory: ${{github.workspace}}/${{env.BUILD_FOLDER_MSVC_DEV_ALL}} + run: | + cmake --build . --parallel 2 --config Debug + ctest . --parallel 2 -C Debug + + - name: Build Release # Linux has 2 cores run: | cmake --build --list-presets diff --git a/CMakeLists.txt b/CMakeLists.txt index 68e47918..fa0f8d19 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ endif() # Testing set(BUILD_TESTING OFF CACHE BOOL "Third Party modules use these options") -if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" AND ${BUILDCC_TESTING}) +if (${BUILDCC_TESTING}) set(TESTING ON) message("Enabling unit-testing") message("Compiler identification: ${CMAKE_CXX_COMPILER_ID}") @@ -85,7 +85,7 @@ endif() # Coverage -if (${TESTING}) +if (${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU" AND ${TESTING}) include(cmake/coverage/lcov.cmake) include(cmake/coverage/gcovr.cmake) endif() diff --git a/CMakePresets.json b/CMakePresets.json index 68fb595c..fcc2836a 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -121,7 +121,7 @@ "BUILDCC_BOOTSTRAP_THROUGH_CMAKE": true, "BUILDCC_PRECOMPILE_HEADERS": true, "BUILDCC_EXAMPLES": true, - "BUILDCC_TESTING": false, + "BUILDCC_TESTING": true, "BUILDCC_CLANGTIDY": false, "BUILDCC_CPPCHECK": false, "BUILDCC_DOCUMENTATION": false, diff --git a/buildcc/lib/args/CMakeLists.txt b/buildcc/lib/args/CMakeLists.txt index c2f2d3a3..ffc289fa 100644 --- a/buildcc/lib/args/CMakeLists.txt +++ b/buildcc/lib/args/CMakeLists.txt @@ -22,7 +22,7 @@ target_link_libraries(mock_args PUBLIC CppUTest CppUTestExt - gcov + ${TEST_LINK_LIBS} ) # Tests diff --git a/buildcc/lib/args/test/test_args.cpp b/buildcc/lib/args/test/test_args.cpp index 21bf1a75..7a686577 100644 --- a/buildcc/lib/args/test/test_args.cpp +++ b/buildcc/lib/args/test/test_args.cpp @@ -258,5 +258,6 @@ TEST(ArgsTestGroup, Args_MultipleCustomTarget) { } int main(int ac, char **av) { + MemoryLeakWarningPlugin::turnOffNewDeleteOverloads(); return CommandLineTestRunner::RunAllTests(ac, av); } diff --git a/buildcc/lib/env/CMakeLists.txt b/buildcc/lib/env/CMakeLists.txt index ecc6080b..93afa078 100644 --- a/buildcc/lib/env/CMakeLists.txt +++ b/buildcc/lib/env/CMakeLists.txt @@ -20,7 +20,7 @@ if (${TESTING}) CppUTest CppUTestExt - gcov + ${TEST_LINK_LIBS} ) target_compile_options(mock_env PUBLIC ${TEST_COMPILE_FLAGS} ${BUILD_COMPILE_FLAGS}) target_link_options(mock_env PUBLIC ${TEST_LINK_FLAGS} ${BUILD_LINK_FLAGS}) diff --git a/buildcc/lib/env/include/env/util.h b/buildcc/lib/env/include/env/util.h index be467b34..45a71448 100644 --- a/buildcc/lib/env/include/env/util.h +++ b/buildcc/lib/env/include/env/util.h @@ -49,7 +49,7 @@ namespace buildcc::env { */ inline bool save_file(const char *name, const char *buf, size_t len, bool binary) { - if (buf == nullptr) { + if (name == nullptr || buf == nullptr) { return false; } std::ofstream ofs(name, binary ? std::ofstream::binary : std::ofstream::out); diff --git a/buildcc/lib/env/test/test_env_util.cpp b/buildcc/lib/env/test/test_env_util.cpp index cd1fe63c..3e6d867d 100644 --- a/buildcc/lib/env/test/test_env_util.cpp +++ b/buildcc/lib/env/test/test_env_util.cpp @@ -33,13 +33,6 @@ TEST(EnvUtilTestGroup, Util_SaveFile_NullptrName) { CHECK_FALSE(save); } -TEST(EnvUtilTestGroup, Util_SaveFile_BadWrite) { - constexpr const char *const FILENAME = "BadWrite.txt"; - fs::remove(FILENAME); - bool save = buildcc::env::save_file(FILENAME, "Hello", -1, false); - CHECK_FALSE(save); -} - TEST(EnvUtilTestGroup, Util_SaveFile_GoodWrite) { constexpr const char *const FILENAME = "GoodWrite.txt"; fs::remove(FILENAME); @@ -47,13 +40,6 @@ TEST(EnvUtilTestGroup, Util_SaveFile_GoodWrite) { CHECK_TRUE(save); } -TEST(EnvUtilTestGroup, Util_SaveFile_BadWrite_Binary) { - constexpr const char *const FILENAME = "BadWrite_Binary.txt"; - fs::remove(FILENAME); - bool save = buildcc::env::save_file(FILENAME, "Hello", -1, true); - CHECK_FALSE(save); -} - TEST(EnvUtilTestGroup, Util_SaveFile_GoodWrite_Binary) { constexpr const char *const FILENAME = "GoodWrite_Binary.txt"; fs::remove(FILENAME); @@ -69,22 +55,6 @@ TEST(EnvUtilTestGroup, Util_SaveFile_CheckDirectory) { CHECK_FALSE(save); } -TEST(EnvUtilTestGroup, Util_SaveFile_CannotWrite) { - constexpr const char *const FILENAME = "CannotWrite.txt"; - fs::remove(FILENAME); - bool save = buildcc::env::save_file(FILENAME, "Hello", false); - CHECK_TRUE(save); - - std::error_code err; - fs::permissions(FILENAME, fs::perms::none, err); - if (err) { - FAIL("Cannot disable file permissions"); - } - - save = buildcc::env::save_file(FILENAME, "Hello", false); - CHECK_FALSE(save); -} - // Load File TEST(EnvUtilTestGroup, Util_LoadFile_CheckDirectory) { // NOTE, This is a directory @@ -143,6 +113,8 @@ TEST(EnvUtilTestGroup, Util_LoadFile_ReadTxt) { CHECK_TRUE(load); } +#if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__MINGW64__) + TEST(EnvUtilTestGroup, Util_LoadFile_CannotOpen) { constexpr const char *const FILENAME = "CannotOpen.txt"; buildcc::env::save_file(FILENAME, "Random Data", false); @@ -159,6 +131,38 @@ TEST(EnvUtilTestGroup, Util_LoadFile_CannotOpen) { CHECK_FALSE(load); } +TEST(EnvUtilTestGroup, Util_SaveFile_BadWrite_Binary) { + constexpr const char *const FILENAME = "BadWrite_Binary.txt"; + fs::remove(FILENAME); + bool save = buildcc::env::save_file(FILENAME, "Hello", -1, true); + CHECK_FALSE(save); +} + +TEST(EnvUtilTestGroup, Util_SaveFile_BadWrite) { + constexpr const char *const FILENAME = "BadWrite.txt"; + fs::remove(FILENAME); + bool save = buildcc::env::save_file(FILENAME, "Hello", -1, false); + CHECK_FALSE(save); +} + +TEST(EnvUtilTestGroup, Util_SaveFile_CannotWrite) { + constexpr const char *const FILENAME = "CannotWrite.txt"; + fs::remove(FILENAME); + bool save = buildcc::env::save_file(FILENAME, "Hello", false); + CHECK_TRUE(save); + + std::error_code err; + fs::permissions(FILENAME, fs::perms::none, err); + if (err) { + FAIL("Cannot disable file permissions"); + } + + save = buildcc::env::save_file(FILENAME, "Hello", false); + CHECK_FALSE(save); +} + +#endif + TEST(EnvUtilTestGroup, Util_Split) { { std::vector paths = buildcc::env::split("", ':'); diff --git a/buildcc/lib/target/cmake/mock_target.cmake b/buildcc/lib/target/cmake/mock_target.cmake index 39ec8a77..2d648938 100644 --- a/buildcc/lib/target/cmake/mock_target.cmake +++ b/buildcc/lib/target/cmake/mock_target.cmake @@ -25,7 +25,7 @@ target_link_libraries(mock_target PUBLIC CppUTest CppUTestExt - gcov + ${TEST_LINK_LIBS} ) # https://github.com/msys2/MINGW-packages/issues/2303 diff --git a/buildcc/lib/target/mock/test_target_util.h b/buildcc/lib/target/mock/test_target_util.h new file mode 100644 index 00000000..70bad12a --- /dev/null +++ b/buildcc/lib/target/mock/test_target_util.h @@ -0,0 +1,22 @@ +#ifndef TARGET_MOCK_TEST_TARGET_UTIL_H_ +#define TARGET_MOCK_TEST_TARGET_UTIL_H_ + +#ifdef _WIN32 +#include +#else +#include +#endif + +namespace buildcc::m { + +inline void blocking_sleep(int seconds) { +#ifdef _WIN32 + Sleep(seconds * 1000); +#else + sleep(seconds); +#endif +} + +} // namespace buildcc::m + +#endif diff --git a/buildcc/lib/target/test/path/CMakeLists.txt b/buildcc/lib/target/test/path/CMakeLists.txt index c6c9de0f..04d8d9dc 100644 --- a/buildcc/lib/target/test/path/CMakeLists.txt +++ b/buildcc/lib/target/test/path/CMakeLists.txt @@ -15,7 +15,7 @@ target_link_libraries(${TEST_NAME} PRIVATE CppUTest CppUTestExt - gcov + ${TEST_LINK_LIBS} ) target_compile_options(${TEST_NAME} PRIVATE ${TEST_COMPILE_FLAGS}) target_link_options(${TEST_NAME} PRIVATE ${TEST_LINK_FLAGS}) diff --git a/buildcc/lib/target/test/target/test_generator.cpp b/buildcc/lib/target/test/target/test_generator.cpp index 877b0deb..169e31cf 100644 --- a/buildcc/lib/target/test/target/test_generator.cpp +++ b/buildcc/lib/target/test/target/test_generator.cpp @@ -1,9 +1,8 @@ #include "target/generator.h" -#include - #include "expect_command.h" #include "expect_generator.h" +#include "test_target_util.h" #include "taskflow/taskflow.hpp" @@ -162,7 +161,7 @@ TEST(GeneratorTestGroup, Generator_Rebuild_Inputs) { buildcc::m::GeneratorRunner(generator); } - sleep(1); + buildcc::m::blocking_sleep(1); bool saved = buildcc::env::save_file( (buildcc::env::get_project_root_dir() / "new_source.cpp") .string() diff --git a/buildcc/lib/target/test/target/test_target_external_lib.cpp b/buildcc/lib/target/test/target/test_target_external_lib.cpp index b081982d..7e12128e 100644 --- a/buildcc/lib/target/test/target/test_target_external_lib.cpp +++ b/buildcc/lib/target/test/target/test_target_external_lib.cpp @@ -10,7 +10,6 @@ #include "schema/target_serialization.h" #include -#include // NOTE, Make sure all these includes are AFTER the system and header includes #include "CppUTest/CommandLineTestRunner.h" diff --git a/buildcc/lib/target/test/target/test_target_lib_dep.cpp b/buildcc/lib/target/test/target/test_target_lib_dep.cpp index 5fc80122..a5cbda68 100644 --- a/buildcc/lib/target/test/target/test_target_lib_dep.cpp +++ b/buildcc/lib/target/test/target/test_target_lib_dep.cpp @@ -5,6 +5,7 @@ #include "expect_command.h" #include "expect_target.h" +#include "test_target_util.h" #include "target/target.h" @@ -12,7 +13,6 @@ #include "schema/target_serialization.h" #include -#include // NOTE, Make sure all these includes are AFTER the system and header includes #include "CppUTest/CommandLineTestRunner.h" @@ -234,7 +234,7 @@ TEST(TargetTestLibDep, TargetDep_UpdateExistingLibraryTest) { buildcc::m::TargetRunner(foolib); // * To make sure that save_file is newer - sleep(1); + buildcc::m::blocking_sleep(1); bool saved = buildcc::env::save_file( foolib.GetTargetPath().string().c_str(), std::string{""}, false); CHECK_TRUE(saved); diff --git a/buildcc/lib/target/test/target/test_target_pch.cpp b/buildcc/lib/target/test/target/test_target_pch.cpp index 4ce19edf..fcfc3653 100644 --- a/buildcc/lib/target/test/target/test_target_pch.cpp +++ b/buildcc/lib/target/test/target/test_target_pch.cpp @@ -1,11 +1,10 @@ #include -#include - #include "constants.h" #include "expect_command.h" #include "expect_target.h" +#include "test_target_util.h" #include "target/target.h" @@ -128,7 +127,7 @@ TEST(TargetPchTestGroup, Target_AddPch_Rebuild) { // Rebuild: Updated { - sleep(1); + buildcc::m::blocking_sleep(1); fs::path filename = fs::path(BUILD_SCRIPT_SOURCE) / "data" / "pch/pch_header_1.h"; bool save = buildcc::env::save_file(filename.string().c_str(), "", false); @@ -221,7 +220,7 @@ TEST(TargetPchTestGroup, Target_AddPch_CppRebuild) { // Rebuild: Updated { - sleep(1); + buildcc::m::blocking_sleep(1); fs::path filename = fs::path(BUILD_SCRIPT_SOURCE) / "data" / "pch/pch_header_1.h"; bool save = buildcc::env::save_file(filename.string().c_str(), "", false); diff --git a/buildcc/lib/target/test/target/test_target_source.cpp b/buildcc/lib/target/test/target/test_target_source.cpp index f2664083..45ed348f 100644 --- a/buildcc/lib/target/test/target/test_target_source.cpp +++ b/buildcc/lib/target/test/target/test_target_source.cpp @@ -1,9 +1,8 @@ #include "constants.h" -#include - #include "expect_command.h" #include "expect_target.h" +#include "test_target_util.h" #include "target/target.h" @@ -193,7 +192,7 @@ TEST(TargetTestSourceGroup, Target_Build_SourceRecompile) { CHECK_FALSE(loaded_sources.find(new_source_file) == loaded_sources.end()); } { - sleep(1); + buildcc::m::blocking_sleep(1); // * Force copy to trigger recompile for NEW_SOURCE // *2 Current file is updated diff --git a/buildcc/lib/target/test/target/test_target_user_deps.cpp b/buildcc/lib/target/test/target/test_target_user_deps.cpp index a6410a9a..8af6c4f0 100644 --- a/buildcc/lib/target/test/target/test_target_user_deps.cpp +++ b/buildcc/lib/target/test/target/test_target_user_deps.cpp @@ -1,9 +1,8 @@ -#include - #include "constants.h" #include "expect_command.h" #include "expect_target.h" +#include "test_target_util.h" #include "target/target.h" @@ -80,7 +79,7 @@ TEST(TargetTestUserDepsGroup, Target_Build_CompileDeps_Rebuild) { { // * To make sure that save_file is newer - sleep(1); + buildcc::m::blocking_sleep(1); const fs::path new_source = buildcc::env::get_project_root_dir() / "data" / "new_source.cpp"; std::string buf{""}; @@ -119,7 +118,7 @@ TEST(TargetTestUserDepsGroup, Target_Build_LinkDeps_Rebuild) { { // * To make sure that save_file is newer - sleep(1); + buildcc::m::blocking_sleep(1); const fs::path new_source = buildcc::env::get_project_root_dir() / "data" / "new_source.cpp"; std::string buf{""}; diff --git a/buildcc/lib/toolchain/CMakeLists.txt b/buildcc/lib/toolchain/CMakeLists.txt index 712131ff..6d8252a3 100644 --- a/buildcc/lib/toolchain/CMakeLists.txt +++ b/buildcc/lib/toolchain/CMakeLists.txt @@ -24,7 +24,7 @@ if (${TESTING}) CppUTest CppUTestExt - gcov + ${TEST_LINK_LIBS} ) add_executable(test_toolchain_verify diff --git a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp index ad9a15f1..9e12df5e 100644 --- a/buildcc/lib/toolchain/test/test_toolchain_verify.cpp +++ b/buildcc/lib/toolchain/test/test_toolchain_verify.cpp @@ -175,34 +175,6 @@ TEST(ToolchainTestGroup, VerifyToolchain_PathContainsDir) { CHECK_TRUE(verified_toolchains.empty()); } -TEST(ToolchainTestGroup, VerifyToolchain_LockedFolder) { - std::error_code err; - fs::permissions(fs::current_path() / "toolchains" / "gcc", fs::perms::none, - err); - if (err) { - FAIL_TEST("Could not set file permissions"); - } - - buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", - "ar", "ld"); - - buildcc::VerifyToolchainConfig config; - config.env_vars.clear(); - config.absolute_search_paths.push_back( - (fs::current_path() / "toolchains" / "gcc").string()); - - std::vector verified_toolchains = - gcc.Verify(config); - UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); - CHECK_TRUE(verified_toolchains.empty()); - - fs::permissions(fs::current_path() / "toolchains" / "gcc", fs::perms::all, - err); - if (err) { - FAIL_TEST("Could not set file permissions"); - } -} - TEST(ToolchainTestGroup, VerifyToolchain_ConditionalAdd_CompilerVersion) { buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", "ar", "ld"); @@ -333,6 +305,38 @@ TEST(ToolchainTestGroup, VerifyToolchain_UpdateFalse) { CHECK_EQUAL(verified_toolchains.size(), 1); } +#if defined(__GNUC__) && !defined(__MINGW32__) && !defined(__MINGW64__) + +TEST(ToolchainTestGroup, VerifyToolchain_LockedFolder) { + std::error_code err; + fs::permissions(fs::current_path() / "toolchains" / "gcc", fs::perms::none, + err); + if (err) { + FAIL_TEST("Could not set file permissions"); + } + + buildcc::Toolchain gcc(buildcc::Toolchain::Id::Gcc, "gcc", "as", "gcc", "g++", + "ar", "ld"); + + buildcc::VerifyToolchainConfig config; + config.env_vars.clear(); + config.absolute_search_paths.push_back( + (fs::current_path() / "toolchains" / "gcc").string()); + + std::vector verified_toolchains = + gcc.Verify(config); + UT_PRINT(std::to_string(verified_toolchains.size()).c_str()); + CHECK_TRUE(verified_toolchains.empty()); + + fs::permissions(fs::current_path() / "toolchains" / "gcc", fs::perms::all, + err); + if (err) { + FAIL_TEST("Could not set file permissions"); + } +} + +#endif + int main(int ac, char **av) { buildcc::env::m::VectorStringCopier copier; mock().installCopier(TEST_VECTOR_STRING_TYPE, copier); diff --git a/buildcc/plugins/CMakeLists.txt b/buildcc/plugins/CMakeLists.txt index 42ae927b..0518831b 100644 --- a/buildcc/plugins/CMakeLists.txt +++ b/buildcc/plugins/CMakeLists.txt @@ -17,7 +17,7 @@ target_link_libraries(mock_plugins PUBLIC CppUTest CppUTestExt - gcov + ${TEST_LINK_LIBS} ) # Tests diff --git a/buildcc/plugins/src/buildcc_find.cpp b/buildcc/plugins/src/buildcc_find.cpp index 97a6e1c1..d60eaa34 100644 --- a/buildcc/plugins/src/buildcc_find.cpp +++ b/buildcc/plugins/src/buildcc_find.cpp @@ -22,6 +22,7 @@ #include "env/host_os_util.h" #include "env/logging.h" +#include "env/util.h" #include "schema/path.h" @@ -33,20 +34,6 @@ constexpr const char *const kOsNotSupported = "issue at https://github.com/coder137/build_in_cpp outlining your OS and " "usecase"; -std::vector SplitEnv(const char *env_ptr, const char *delim) { - std::vector env_paths; - - std::string temp{env_ptr}; - char *path = std::strtok(temp.data(), delim); - while (path != nullptr) { - env_paths.push_back( - buildcc::internal::Path::CreateNewPath(path).GetPathname()); - path = std::strtok(nullptr, delim); - } - - return env_paths; -} - std::vector SearchEnv(const std::string &host_env_var, const std::string ®ex) { char *path_ptr = std::getenv(host_env_var.c_str()); @@ -56,13 +43,13 @@ std::vector SearchEnv(const std::string &host_env_var, return {}; } - std::vector env_paths; constexpr const char *const kDelim = buildcc::env::get_os_envvar_delim(); if constexpr (kDelim == nullptr) { buildcc::env::log_critical(__FUNCTION__, kOsNotSupported); return {}; } - env_paths = SplitEnv(path_ptr, kDelim); + + std::vector env_paths = buildcc::env::split(path_ptr, kDelim[0]); // DONE, Construct a directory iterator // Only take the files @@ -71,12 +58,12 @@ std::vector SearchEnv(const std::string &host_env_var, std::error_code errcode; const auto dir_iter = fs::directory_iterator(env_p, errcode); if (errcode) { - buildcc::env::log_critical(env_p.string(), errcode.message()); + buildcc::env::log_critical(env_p, errcode.message()); continue; } for (const auto &dir_entry : dir_iter) { - if (!dir_entry.is_regular_file()) { + if (!dir_entry.path().has_filename()) { continue; } diff --git a/buildcc/schema/cmake/schema.cmake b/buildcc/schema/cmake/schema.cmake index a3d21867..c7c1371a 100644 --- a/buildcc/schema/cmake/schema.cmake +++ b/buildcc/schema/cmake/schema.cmake @@ -22,7 +22,7 @@ if (${TESTING}) CppUTest CppUTestExt - gcov + ${TEST_LINK_LIBS} ) add_dependencies(mock_schema fbs_to_header) diff --git a/cmake/flags/test_flags.cmake b/cmake/flags/test_flags.cmake index bb8d8758..5846fab7 100644 --- a/cmake/flags/test_flags.cmake +++ b/cmake/flags/test_flags.cmake @@ -1,4 +1,7 @@ -set(TEST_COMPILE_FLAGS -g -Og -fprofile-arcs -ftest-coverage -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-inline -fprofile-abs-path -) -set(TEST_LINK_FLAGS -g -Og -fprofile-arcs -ftest-coverage -fprofile-abs-path -) +if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU") + set(TEST_COMPILE_FLAGS -g -Og -fprofile-arcs -ftest-coverage -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-inline -fprofile-abs-path + ) + set(TEST_LINK_FLAGS -g -Og -fprofile-arcs -ftest-coverage -fprofile-abs-path + ) + set(TEST_LINK_LIBS gcov) +endif()