From 8c1c9c05eeb081695e42c9642cbb1d72915d6575 Mon Sep 17 00:00:00 2001 From: Snaipe Date: Wed, 10 Feb 2016 23:27:51 +0100 Subject: [PATCH 1/7] Fixed file-to-file comparison assert message being corrupted --- include/criterion/internal/redirect.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/criterion/internal/redirect.h b/include/criterion/internal/redirect.h index 4d4914d..78a78f3 100644 --- a/include/criterion/internal/redirect.h +++ b/include/criterion/internal/redirect.h @@ -58,7 +58,7 @@ )) # define cr_assert_redir_f_op_va_(Fail, Fun, Op, ...) \ - CR_EXPAND(cr_assert_redir_op_( \ + CR_EXPAND(cr_assert_redir_f_op_( \ Fail, \ Fun, \ Op, \ From 1f674d3ffbb8600fa3619086c7cac800a2a051a8 Mon Sep 17 00:00:00 2001 From: Snaipe Date: Tue, 16 Feb 2016 17:35:14 +0100 Subject: [PATCH 2/7] Fixed empty format string warning with GCC 4.8 --- include/criterion/internal/assert.h | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/include/criterion/internal/assert.h b/include/criterion/internal/assert.h index fd79d79..eb07fae 100644 --- a/include/criterion/internal/assert.h +++ b/include/criterion/internal/assert.h @@ -99,10 +99,12 @@ CR_END_C_API do { \ char *def_msg = CR_EXPAND(CR_TRANSLATE_DEF_MSG_(__VA_ARGS__)); \ char *formatted_msg = NULL; \ + int shifted__ = 0; \ int msglen = cr_asprintf(&formatted_msg, \ - "" CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))); \ - if (formatted_msg && *formatted_msg) { \ - MsgVar = formatted_msg; \ + "x" CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))); \ + if (formatted_msg && formatted_msg[1]) { \ + MsgVar = formatted_msg + 1; \ + shifted__ = 1; \ CR_STDN free(def_msg); \ } else { \ MsgVar = def_msg; \ @@ -120,18 +122,12 @@ CR_END_C_API *((size_t*) buf) = msglen + 1; \ buf += sizeof (size_t); \ CR_STDN strcpy(buf, MsgVar); \ - CR_STDN free(MsgVar); \ + CR_STDN free(MsgVar - shifted__); \ } while (0)) # define CR_FAIL_ABORT_ criterion_abort_test # define CR_FAIL_CONTINUES_ criterion_continue_test -# if defined(__GNUC__) || defined(__clang__) -// We disable the format-zero-length warning because we use the validity of -// asprintf(out, "") for empty assertion messages -# pragma GCC diagnostic ignored "-Wformat-zero-length" -# endif - # define cr_assert_impl(Fail, Condition, ...) \ do { \ bool passed = !!(Condition); \ From ec5c8958cbaae4d13b9f42d5bf0ccfd2603cf4af Mon Sep 17 00:00:00 2001 From: Snaipe Date: Tue, 16 Feb 2016 17:41:11 +0100 Subject: [PATCH 3/7] Fixed naming convention conflicts for internal variables used by the implementation of cr_assert --- include/criterion/internal/assert.h | 63 +++++++++++++++-------------- 1 file changed, 32 insertions(+), 31 deletions(-) diff --git a/include/criterion/internal/assert.h b/include/criterion/internal/assert.h index eb07fae..3679eab 100644 --- a/include/criterion/internal/assert.h +++ b/include/criterion/internal/assert.h @@ -97,32 +97,32 @@ CR_END_C_API # define CR_INIT_STATS_(BufSize, MsgVar, ...) CR_EXPAND( \ do { \ - char *def_msg = CR_EXPAND(CR_TRANSLATE_DEF_MSG_(__VA_ARGS__)); \ - char *formatted_msg = NULL; \ - int shifted__ = 0; \ - int msglen = cr_asprintf(&formatted_msg, \ + char *cr_def_msg__ = CR_EXPAND(CR_TRANSLATE_DEF_MSG_(__VA_ARGS__)); \ + char *cr_fmt_msg__ = NULL; \ + int cr_shifted__ = 0; \ + int cr_msglen__ = cr_asprintf(&cr_fmt_msg__, \ "x" CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__))); \ - if (formatted_msg && formatted_msg[1]) { \ - MsgVar = formatted_msg + 1; \ - shifted__ = 1; \ - CR_STDN free(def_msg); \ + if (cr_fmt_msg__ && cr_fmt_msg__[1]) { \ + MsgVar = cr_fmt_msg__ + 1; \ + cr_shifted__ = 1; \ + CR_STDN free(cr_def_msg__); \ } else { \ - MsgVar = def_msg; \ - msglen = strlen(def_msg); \ - CR_STDN free(formatted_msg); \ + MsgVar = cr_def_msg__; \ + cr_msglen__ = strlen(cr_def_msg__); \ + CR_STDN free(cr_fmt_msg__); \ } \ \ BufSize = sizeof(struct criterion_assert_stats) \ - + sizeof (size_t) + msglen + 1; \ + + sizeof (size_t) + cr_msglen__ + 1; \ \ - char *buf = (char*) CR_STDN malloc(BufSize); \ - stat = (struct criterion_assert_stats*) buf; \ - CR_STDN memset(buf, 0, sizeof (struct criterion_assert_stats)); \ - buf += sizeof (struct criterion_assert_stats); \ - *((size_t*) buf) = msglen + 1; \ - buf += sizeof (size_t); \ - CR_STDN strcpy(buf, MsgVar); \ - CR_STDN free(MsgVar - shifted__); \ + char *cr_buf__ = (char*) CR_STDN malloc(BufSize); \ + cr_stat__ = (struct criterion_assert_stats*) cr_buf__; \ + CR_STDN memset(cr_buf__, 0, sizeof (struct criterion_assert_stats)); \ + cr_buf__ += sizeof (struct criterion_assert_stats); \ + *((size_t*) cr_buf__) = cr_msglen__ + 1; \ + cr_buf__ += sizeof (size_t); \ + CR_STDN strcpy(cr_buf__, MsgVar); \ + CR_STDN free(MsgVar - cr_shifted__); \ } while (0)) # define CR_FAIL_ABORT_ criterion_abort_test @@ -130,21 +130,22 @@ CR_END_C_API # define cr_assert_impl(Fail, Condition, ...) \ do { \ - bool passed = !!(Condition); \ + bool cr_passed__ = !!(Condition); \ \ - char *msg = NULL; \ - size_t bufsize; \ + char *cr_msg__ = NULL; \ + size_t cr_bufsize__; \ \ - struct criterion_assert_stats *stat; \ - CR_EXPAND(CR_INIT_STATS_(bufsize, msg, CR_VA_TAIL(__VA_ARGS__))); \ - stat->passed = passed; \ - stat->file = __FILE__; \ - stat->line = __LINE__; \ + struct criterion_assert_stats *cr_stat__; \ + CR_EXPAND(CR_INIT_STATS_(cr_bufsize__, cr_msg__, \ + CR_VA_TAIL(__VA_ARGS__))); \ + cr_stat__->passed = cr_passed__; \ + cr_stat__->file = __FILE__; \ + cr_stat__->line = __LINE__; \ \ - criterion_send_event(ASSERT, stat, bufsize); \ - CR_STDN free(stat); \ + criterion_send_event(ASSERT, cr_stat__, cr_bufsize__); \ + CR_STDN free(cr_stat__); \ \ - if (!passed) \ + if (!cr_passed__) \ Fail(); \ } while (0) From de5ec404660c0384194d3bc21853bc00967132a9 Mon Sep 17 00:00:00 2001 From: Snaipe Date: Mon, 22 Feb 2016 16:56:00 +0100 Subject: [PATCH 4/7] Fixed out of bounds during assert message sending --- include/criterion/internal/assert.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/criterion/internal/assert.h b/include/criterion/internal/assert.h index 3679eab..24e5132 100644 --- a/include/criterion/internal/assert.h +++ b/include/criterion/internal/assert.h @@ -105,6 +105,7 @@ CR_END_C_API if (cr_fmt_msg__ && cr_fmt_msg__[1]) { \ MsgVar = cr_fmt_msg__ + 1; \ cr_shifted__ = 1; \ + --cr_msglen__; \ CR_STDN free(cr_def_msg__); \ } else { \ MsgVar = cr_def_msg__; \ From b4f519728819847c869179203e141572a5e96141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20V=C3=A1rady?= Date: Sat, 5 Mar 2016 13:34:26 +0100 Subject: [PATCH 5/7] Switched CMAKE_*_DIR variables to PROJECT_*_DIR With this change, Criterion can be added as a cmake subproject with the add_subdirectory() command. --- .cmake/Modules/CoverallsGenerateGcov.cmake | 4 +-- .cmake/Modules/DebConfig.cmake | 4 +-- .cmake/Modules/DebSourcePPA.cmake | 14 +++++----- .cmake/Modules/PackageConfig.cmake | 30 +++++++++++----------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/.cmake/Modules/CoverallsGenerateGcov.cmake b/.cmake/Modules/CoverallsGenerateGcov.cmake index b923f6e..29720ff 100644 --- a/.cmake/Modules/CoverallsGenerateGcov.cmake +++ b/.cmake/Modules/CoverallsGenerateGcov.cmake @@ -110,7 +110,7 @@ if (GIT_FOUND) # Branch. execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref HEAD - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} OUTPUT_VARIABLE GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE ) @@ -118,7 +118,7 @@ if (GIT_FOUND) macro (git_log_format FORMAT_CHARS VAR_NAME) execute_process( COMMAND ${GIT_EXECUTABLE} log -1 --pretty=format:%${FORMAT_CHARS} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} OUTPUT_VARIABLE ${VAR_NAME} OUTPUT_STRIP_TRAILING_WHITESPACE ) diff --git a/.cmake/Modules/DebConfig.cmake b/.cmake/Modules/DebConfig.cmake index 3bbc373..b925edf 100644 --- a/.cmake/Modules/DebConfig.cmake +++ b/.cmake/Modules/DebConfig.cmake @@ -15,9 +15,9 @@ set(CPACK_DEBIAN_PACKAGE_DEPENDS ) set(CPACK_DEBIAN_CMAKE_OPTIONS) -set(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/description.txt") +set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/description.txt") -set(CPACK_DEBIAN_PACKAGE_SOURCE_COPY "${CMAKE_SOURCE_DIR}/.cmake/copy-source.sh") +set(CPACK_DEBIAN_PACKAGE_SOURCE_COPY "${PROJECT_SOURCE_DIR}/.cmake/copy-source.sh") set(CPACK_DEBIAN_DISTRIBUTION_NAME ubuntu) set(CPACK_DEBIAN_DISTRIBUTION_RELEASES precise trusty vivid wily xenial) diff --git a/.cmake/Modules/DebSourcePPA.cmake b/.cmake/Modules/DebSourcePPA.cmake index f948ed5..e1185ac 100644 --- a/.cmake/Modules/DebSourcePPA.cmake +++ b/.cmake/Modules/DebSourcePPA.cmake @@ -59,14 +59,14 @@ foreach(LINE ${DESC_LINES}) set(DEB_LONG_DESCRIPTION "${DEB_LONG_DESCRIPTION} ${LINE}\n") endforeach(LINE ${DESC_LINES}) -file(REMOVE_RECURSE "${CMAKE_BINARY_DIR}/Debian") -file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/Debian") -set(DEBIAN_SOURCE_ORIG_DIR "${CMAKE_BINARY_DIR}/Debian/${CPACK_DEBIAN_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") +file(REMOVE_RECURSE "${PROJECT_BINARY_DIR}/Debian") +file(MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/Debian") +set(DEBIAN_SOURCE_ORIG_DIR "${PROJECT_BINARY_DIR}/Debian/${CPACK_DEBIAN_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}") if( CPACK_DEBIAN_PACKAGE_SOURCE_COPY ) - execute_process(COMMAND ${CPACK_DEBIAN_PACKAGE_SOURCE_COPY} "${CMAKE_SOURCE_DIR}" "${DEBIAN_SOURCE_ORIG_DIR}.orig") + execute_process(COMMAND ${CPACK_DEBIAN_PACKAGE_SOURCE_COPY} "${PROJECT_SOURCE_DIR}" "${DEBIAN_SOURCE_ORIG_DIR}.orig") else() - execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR} "${DEBIAN_SOURCE_ORIG_DIR}.orig") + execute_process(COMMAND ${CMAKE_COMMAND} -E copy_directory ${PROJECT_SOURCE_DIR} "${DEBIAN_SOURCE_ORIG_DIR}.orig") execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${DEBIAN_SOURCE_ORIG_DIR}.orig/.git") execute_process(COMMAND ${CMAKE_COMMAND} -E remove_directory "${DEBIAN_SOURCE_ORIG_DIR}.orig/.svn") endif() @@ -77,7 +77,7 @@ foreach(REMOVE_DIR ${CPACK_DEBIAN_PACKAGE_REMOVE_SOURCE_FILES}) endforeach() # create the original source tar -execute_process(COMMAND ${CMAKE_COMMAND} -E tar czf "${CPACK_DEBIAN_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}.orig.tar.gz" "${CPACK_DEBIAN_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}.orig" WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Debian) +execute_process(COMMAND ${CMAKE_COMMAND} -E tar czf "${CPACK_DEBIAN_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}.orig.tar.gz" "${CPACK_DEBIAN_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}.orig" WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Debian) set(DEB_SOURCE_CHANGES) foreach(RELEASE ${CPACK_DEBIAN_DISTRIBUTION_RELEASES}) @@ -344,4 +344,4 @@ endforeach(RELEASE ${CPACK_DEBIAN_DISTRIBUTION_RELEASES}) ############################################################################## # dput ppa:your-lp-id/ppa -add_custom_target(dput ${DPUT_EXECUTABLE} ${DPUT_HOST} ${DEB_SOURCE_CHANGES} DEPENDS ${DEB_SOURCE_CHANGES} WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/Debian) +add_custom_target(dput ${DPUT_EXECUTABLE} ${DPUT_HOST} ${DEB_SOURCE_CHANGES} DEPENDS ${DEB_SOURCE_CHANGES} WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/Debian) diff --git a/.cmake/Modules/PackageConfig.cmake b/.cmake/Modules/PackageConfig.cmake index 632d9b8..2d469eb 100644 --- a/.cmake/Modules/PackageConfig.cmake +++ b/.cmake/Modules/PackageConfig.cmake @@ -45,7 +45,7 @@ if (WIN32) endif () endif () -set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/debian.copyright") +set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/debian.copyright") extract_version(${PROJECT_VERSION} CPACK_PACKAGE_VERSION_MAJOR CPACK_PACKAGE_VERSION_MINOR @@ -55,21 +55,21 @@ extract_version(${PROJECT_VERSION} set(CPACK_PACKAGE_VERSION ${PROJECT_VERSION}) -file(GLOB TRASH_FILES "${CMAKE_SOURCE_DIR}/*") +file(GLOB TRASH_FILES "${PROJECT_SOURCE_DIR}/*") set(KEEP_FILES - "${CMAKE_SOURCE_DIR}/.cmake" - "${CMAKE_SOURCE_DIR}/src" - "${CMAKE_SOURCE_DIR}/include" - "${CMAKE_SOURCE_DIR}/doc" - "${CMAKE_SOURCE_DIR}/dev" - "${CMAKE_SOURCE_DIR}/po" - "${CMAKE_SOURCE_DIR}/dependencies" - "${CMAKE_SOURCE_DIR}/CMakeLists.txt" - "${CMAKE_SOURCE_DIR}/README.md" - "${CMAKE_SOURCE_DIR}/CONTRIBUTING.md" - "${CMAKE_SOURCE_DIR}/LICENSE" - "${CMAKE_SOURCE_DIR}/ChangeLog" - "${CMAKE_SOURCE_DIR}/description.txt" + "${PROJECT_SOURCE_DIR}/.cmake" + "${PROJECT_SOURCE_DIR}/src" + "${PROJECT_SOURCE_DIR}/include" + "${PROJECT_SOURCE_DIR}/doc" + "${PROJECT_SOURCE_DIR}/dev" + "${PROJECT_SOURCE_DIR}/po" + "${PROJECT_SOURCE_DIR}/dependencies" + "${PROJECT_SOURCE_DIR}/CMakeLists.txt" + "${PROJECT_SOURCE_DIR}/README.md" + "${PROJECT_SOURCE_DIR}/CONTRIBUTING.md" + "${PROJECT_SOURCE_DIR}/LICENSE" + "${PROJECT_SOURCE_DIR}/ChangeLog" + "${PROJECT_SOURCE_DIR}/description.txt" ) list(REMOVE_ITEM TRASH_FILES ${KEEP_FILES}) # Escape any '.' characters From c5b4ca27d7f64c7e8cc93bc8818191e43780cb01 Mon Sep 17 00:00:00 2001 From: Snaipe Date: Sat, 5 Mar 2016 15:51:50 +0100 Subject: [PATCH 6/7] Fixed redirected standard streams being leaked by cr_(assert|expect)_std(out|err) --- include/criterion/internal/redirect.h | 48 +++++++++++++++++++++++++++ include/criterion/redirect.h | 38 ++++++++++----------- src/io/file.c | 28 ++++++++++++++++ test/redirect.cc | 3 -- 4 files changed, 95 insertions(+), 22 deletions(-) diff --git a/include/criterion/internal/redirect.h b/include/criterion/internal/redirect.h index 78a78f3..2aaf4f8 100644 --- a/include/criterion/internal/redirect.h +++ b/include/criterion/internal/redirect.h @@ -27,6 +27,15 @@ # include "common.h" # include "assert.h" +CR_BEGIN_C_API + +CR_API int cr_stdout_match_file(CR_STDN FILE* ref); +CR_API int cr_stdout_match_str(const char* ref); +CR_API int cr_stderr_match_file(CR_STDN FILE* ref); +CR_API int cr_stderr_match_str(const char* ref); + +CR_END_C_API + # define cr_assert_redir_op_(Fail, Fun, Op, File, Str, ...) \ CR_EXPAND(cr_assert_impl( \ Fail, \ @@ -67,5 +76,44 @@ CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ )) +# define cr_assert_redir_unop_(Fail, Fun, Op, File, Str, ...) \ + CR_EXPAND(cr_assert_impl( \ + Fail, \ + !(Fun((Str)) Op 0), \ + dummy, \ + CRITERION_ASSERT_MSG_FILE_STR_MATCH, \ + (CR_STR(File), Str), \ + __VA_ARGS__ \ + )) + +# define cr_assert_redir_unop_va_(Fail, Fun, Op, ...) \ + CR_EXPAND(cr_assert_redir_unop_( \ + Fail, \ + Fun, \ + Op, \ + CR_VA_HEAD(__VA_ARGS__), \ + CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ + CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ + )) + +# define cr_assert_redir_f_unop_(Fail, Fun, Op, File, Ref, ...) \ + CR_EXPAND(cr_assert_impl( \ + Fail, \ + !(Fun((Ref)) Op 0), \ + dummy, \ + CRITERION_ASSERT_MSG_FILE_MATCH, \ + (CR_STR(File), CR_STR(Ref)), \ + __VA_ARGS__ \ + )) + +# define cr_assert_redir_f_unop_va_(Fail, Fun, Op, ...) \ + CR_EXPAND(cr_assert_redir_f_unop_( \ + Fail, \ + Fun, \ + Op, \ + CR_VA_HEAD(__VA_ARGS__), \ + CR_VA_HEAD(CR_VA_TAIL(__VA_ARGS__)), \ + CR_VA_TAIL(CR_VA_TAIL(__VA_ARGS__)) \ + )) #endif /* !CRITERION_INTERNAL_REDIRECT_H_ */ diff --git a/include/criterion/redirect.h b/include/criterion/redirect.h index 3d26d97..debfae9 100644 --- a/include/criterion/redirect.h +++ b/include/criterion/redirect.h @@ -24,15 +24,15 @@ #ifndef CRITERION_REDIRECT_H_ # define CRITERION_REDIRECT_H_ -# include "internal/common.h" -# include "internal/redirect.h" - # ifdef __cplusplus # include # else # include # endif +# include "internal/common.h" +# include "internal/redirect.h" + CR_BEGIN_C_API /** @@ -112,29 +112,29 @@ CR_END_C_API # define cr_assert_file_contents_neq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_ABORT_, cr_file_match_file, !=, __VA_ARGS__)) # define cr_expect_file_contents_neq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_CONTINUES_, cr_file_match_file, !=, __VA_ARGS__)) -# define cr_assert_stdout_eq_str(...) CR_EXPAND(cr_assert_redir_op_va_(CR_FAIL_ABORT_, cr_file_match_str, ==, cr_get_redirected_stdout(), __VA_ARGS__)) -# define cr_expect_stdout_eq_str(...) CR_EXPAND(cr_assert_redir_op_va_(CR_FAIL_CONTINUES_, cr_file_match_str, ==, cr_get_redirected_stdout(), __VA_ARGS__)) +# define cr_assert_stdout_eq_str(...) CR_EXPAND(cr_assert_redir_unop_va_(CR_FAIL_ABORT_, cr_stdout_match_str, ==, stdout, __VA_ARGS__)) +# define cr_expect_stdout_eq_str(...) CR_EXPAND(cr_assert_redir_unop_va_(CR_FAIL_CONTINUES_, cr_stdout_match_str, ==, stdout, __VA_ARGS__)) -# define cr_assert_stdout_neq_str(...) CR_EXPAND(cr_assert_redir_op_va_(CR_FAIL_ABORT_, cr_file_match_str, !=, cr_get_redirected_stdout(), __VA_ARGS__)) -# define cr_expect_stdout_neq_str(...) CR_EXPAND(cr_assert_redir_op_va_(CR_FAIL_CONTINUES_, cr_file_match_str, !=, cr_get_redirected_stdout(), __VA_ARGS__)) +# define cr_assert_stdout_neq_str(...) CR_EXPAND(cr_assert_redir_unop_va_(CR_FAIL_ABORT_, cr_stdout_match_str, !=, stdout, __VA_ARGS__)) +# define cr_expect_stdout_neq_str(...) CR_EXPAND(cr_assert_redir_unop_va_(CR_FAIL_CONTINUES_, cr_stdout_match_str, !=, stdout, __VA_ARGS__)) -# define cr_assert_stderr_eq_str(...) CR_EXPAND(cr_assert_redir_op_va_(CR_FAIL_ABORT_, cr_file_match_str, ==, cr_get_redirected_stderr(), __VA_ARGS__)) -# define cr_expect_stderr_eq_str(...) CR_EXPAND(cr_assert_redir_op_va_(CR_FAIL_CONTINUES_, cr_file_match_str, ==, cr_get_redirected_stderr(), __VA_ARGS__)) +# define cr_assert_stderr_eq_str(...) CR_EXPAND(cr_assert_redir_unop_va_(CR_FAIL_ABORT_, cr_stderr_match_str, ==, stderr, __VA_ARGS__)) +# define cr_expect_stderr_eq_str(...) CR_EXPAND(cr_assert_redir_unop_va_(CR_FAIL_CONTINUES_, cr_stderr_match_str, ==, stderr, __VA_ARGS__)) -# define cr_assert_stderr_neq_str(...) CR_EXPAND(cr_assert_redir_op_va_(CR_FAIL_ABORT_, cr_file_match_str, !=, cr_get_redirected_stderr(), __VA_ARGS__)) -# define cr_expect_stderr_neq_str(...) CR_EXPAND(cr_assert_redir_op_va_(CR_FAIL_CONTINUES_, cr_file_match_str, !=, cr_get_redirected_stderr(), __VA_ARGS__)) +# define cr_assert_stderr_neq_str(...) CR_EXPAND(cr_assert_redir_unop_va_(CR_FAIL_ABORT_, cr_stderr_match_str, !=, stderr, __VA_ARGS__)) +# define cr_expect_stderr_neq_str(...) CR_EXPAND(cr_assert_redir_unop_va_(CR_FAIL_CONTINUES_, cr_stderr_match_str, !=, stderr, __VA_ARGS__)) -# define cr_assert_stdout_eq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_ABORT_, cr_file_match_file, ==, cr_get_redirected_stdout(), __VA_ARGS__)) -# define cr_expect_stdout_eq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_CONTINUES_, cr_file_match_file, ==, cr_get_redirected_stdout(), __VA_ARGS__)) +# define cr_assert_stdout_eq(...) CR_EXPAND(cr_assert_redir_f_unop_va_(CR_FAIL_ABORT_, cr_stdout_match_file, ==, stdout, __VA_ARGS__)) +# define cr_expect_stdout_eq(...) CR_EXPAND(cr_assert_redir_f_unop_va_(CR_FAIL_CONTINUES_, cr_stdout_match_file, ==, stdout, __VA_ARGS__)) -# define cr_assert_stdout_neq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_ABORT_, cr_file_match_file, !=, cr_get_redirected_stdout(), __VA_ARGS__)) -# define cr_expect_stdout_neq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_CONTINUES_, cr_file_match_file, !=, cr_get_redirected_stdout(), __VA_ARGS__)) +# define cr_assert_stdout_neq(...) CR_EXPAND(cr_assert_redir_f_unop_va_(CR_FAIL_ABORT_, cr_stdout_match_file, !=, stdout, __VA_ARGS__)) +# define cr_expect_stdout_neq(...) CR_EXPAND(cr_assert_redir_f_unop_va_(CR_FAIL_CONTINUES_, cr_stdout_match_file, !=, stdout, __VA_ARGS__)) -# define cr_assert_stderr_eq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_ABORT_, cr_file_match_file, ==, cr_get_redirected_stderr(), __VA_ARGS__)) -# define cr_expect_stderr_eq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_CONTINUES_, cr_file_match_file, ==, cr_get_redirected_stderr(), __VA_ARGS__)) +# define cr_assert_stderr_eq(...) CR_EXPAND(cr_assert_redir_f_unop_va_(CR_FAIL_ABORT_, cr_stderr_match_file, ==, stderr, __VA_ARGS__)) +# define cr_expect_stderr_eq(...) CR_EXPAND(cr_assert_redir_f_unop_va_(CR_FAIL_CONTINUES_, cr_stderr_match_file, ==, stderr, __VA_ARGS__)) -# define cr_assert_stderr_neq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_ABORT_, cr_file_match_file, !=, cr_get_redirected_stderr(), __VA_ARGS__)) -# define cr_expect_stderr_neq(...) CR_EXPAND(cr_assert_redir_f_op_va_(CR_FAIL_CONTINUES_, cr_file_match_file, !=, cr_get_redirected_stderr(), __VA_ARGS__)) +# define cr_assert_stderr_neq(...) CR_EXPAND(cr_assert_redir_f_unop_va_(CR_FAIL_ABORT_, cr_stderr_match_file, !=, stderr, __VA_ARGS__)) +# define cr_expect_stderr_neq(...) CR_EXPAND(cr_assert_redir_f_unop_va_(CR_FAIL_CONTINUES_, cr_stderr_match_file, !=, stderr, __VA_ARGS__)) # ifdef __cplusplus # include "internal/stream.hxx" diff --git a/src/io/file.c b/src/io/file.c index cc97357..4d01422 100644 --- a/src/io/file.c +++ b/src/io/file.c @@ -54,3 +54,31 @@ int cr_file_match_file(FILE* f, FILE* ref) { return matches; } + +int cr_stdout_match_file(FILE* ref) { + FILE *f = cr_get_redirected_stdout(); + int res = cr_file_match_file(f, ref); + fclose(f); + return res; +} + +int cr_stdout_match_str(const char* ref) { + FILE *f = cr_get_redirected_stdout(); + int res = cr_file_match_str(f, ref); + fclose(f); + return res; +} + +int cr_stderr_match_file(FILE* ref) { + FILE *f = cr_get_redirected_stderr(); + int res = cr_file_match_file(f, ref); + fclose(f); + return res; +} + +int cr_stderr_match_str(const char* ref) { + FILE *f = cr_get_redirected_stderr(); + int res = cr_file_match_str(f, ref); + fclose(f); + return res; +} diff --git a/test/redirect.cc b/test/redirect.cc index 3afd0ac..1090556 100644 --- a/test/redirect.cc +++ b/test/redirect.cc @@ -65,7 +65,6 @@ Test(redirect, stdout_) { std::cout << "Foo" << std::flush; cr_expect_stdout_eq_str("Foo"); - cr_expect_stdout_neq_str("Bar"); } Test(redirect, stderr_) { @@ -74,7 +73,6 @@ Test(redirect, stderr_) { std::cerr << "Foo" << std::flush; cr_expect_stderr_eq_str("Foo"); - cr_expect_stderr_neq_str("Bar"); } Test(redirect, stdin_) { @@ -86,5 +84,4 @@ Test(redirect, stdin_) { std::cin >> read; cr_expect_eq(read, "Foo"); - cr_expect_neq(read, "Bar"); } From 00d3ef7ad8170ef1c50582686b9ce6cdbc18403e Mon Sep 17 00:00:00 2001 From: Snaipe Date: Sat, 5 Mar 2016 15:53:50 +0100 Subject: [PATCH 7/7] Fixed resource leaks the child pump thread --- src/compat/process.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/compat/process.c b/src/compat/process.c index 6bb6872..5dc138b 100644 --- a/src/compat/process.c +++ b/src/compat/process.c @@ -169,11 +169,7 @@ static void *chld_pump_thread_main(void *nil) { void init_proc_compat(void) { #ifndef VANILLA_WIN32 - pthread_attr_t attr; - int err = pthread_attr_init(&attr) - || pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED) - || pthread_create(&child_pump, &attr, chld_pump_thread_main, NULL) - || pthread_attr_destroy(&attr); + int err = pthread_create(&child_pump, NULL, chld_pump_thread_main, NULL); if (err) { perror(0); exit(1); @@ -184,6 +180,7 @@ void init_proc_compat(void) { void free_proc_compat(void) { #ifndef VANILLA_WIN32 child_pump_running = false; + pthread_join(child_pump, NULL); #endif }