52#ifndef TEST_EXPECT_ABORT_H
53#define TEST_EXPECT_ABORT_H
80#if defined(YAC_CODE_COVERAGE_TEST)
81# define YAC_TEST_ABORT_UNHAPPY_PATH_ENABLED 0
83# define YAC_TEST_ABORT_UNHAPPY_PATH_ENABLED 1
98static inline void utest_abort_handler_(
99 MPI_Comm comm,
char const * msg,
char const * source,
int line) {
106 yac_test_abort_state_.msg_,
sizeof(yac_test_abort_state_.msg_),
107 "%s", (msg != NULL)?msg:
"(null)");
110 (yac_test_abort_state_.substr_ == NULL) ||
112 yac_test_abort_state_.msg_, yac_test_abort_state_.substr_) != NULL);
115 yac_test_abort_state_.jmp,
124static inline int utest_abort_skip_(
127#if YAC_TEST_ABORT_UNHAPPY_PATH_ENABLED
135static inline char const * utest_abort_result_name_(
142 default:
return "invalid outcome";
151static inline int utest_abort_failed_(
155 if (result == expected_result)
return 0;
158 stderr,
"ERROR(%s:%d): expected \"%s\" but got \"%s\"\n", source, line,
159 utest_abort_result_name_(expected_result),
160 utest_abort_result_name_(result));
161 if (yac_test_abort_state_.msg_[0] !=
'\0')
163 stderr,
" abort message on this process: \"%s\"\n",
164 yac_test_abort_state_.msg_);
177 int mask = (int)result;
178 MPI_Allreduce(MPI_IN_PLACE, &
mask, 1, MPI_INT, MPI_BOR, comm);
200 "unexpected mask value in yac_test_abort_reduce_");
222#define YAC_TEST_ABORT_RUN_(result_var, expected_substr, ...) \
228 if (yac_test_abort_state_.active_) { \
229 yac_restore_default_abort_handler(); \
230 die("nested use of YAC_TEST_EXPECT_ABORT_* is not supported");\
234 yac_abort_func volatile yac_test_saved_handler_ = \
235 yac_get_abort_handler(); \
236 yac_test_abort_state_.substr_ = (expected_substr); \
237 yac_test_abort_state_.msg_[0] = '\0'; \
238 yac_test_abort_state_.active_ = 1; \
239 yac_set_abort_handler((yac_abort_func)utest_abort_handler_); \
240 (result_var) = YAC_TEST_ABORT_NO_CALL; \
241 switch (setjmp(yac_test_abort_state_.jmp)) { \
245 case YAC_TEST_ABORT_EXPECTED: \
246 (result_var) = YAC_TEST_ABORT_EXPECTED; \
249 (result_var) = YAC_TEST_ABORT_UNEXPECTED; \
252 yac_set_abort_handler(yac_test_saved_handler_); \
253 yac_test_abort_state_.active_ = 0; \
286#define YAC_TEST_EXPECT_ABORT_SERIAL( \
287 test_failed, expected_result, expected_substr, ...) \
289 enum yac_test_abort_result yac_test_expected_ = (expected_result); \
290 if (utest_abort_skip_(yac_test_expected_)) { \
295 enum yac_test_abort_result volatile yac_test_result_; \
296 YAC_TEST_ABORT_RUN_( \
297 yac_test_result_, expected_substr, __VA_ARGS__); \
299 utest_abort_failed_( \
300 yac_test_result_, yac_test_expected_, __FILE__, __LINE__); \
327#define YAC_TEST_EXPECT_ABORT_PAR_ANY( \
328 test_failed, expected_result, expected_substr, comm, ...) \
330 enum yac_test_abort_result yac_test_expected_ = (expected_result); \
331 if (utest_abort_skip_(yac_test_expected_)) { \
336 enum yac_test_abort_result volatile yac_test_result_; \
337 YAC_TEST_ABORT_RUN_( \
338 yac_test_result_, expected_substr, __VA_ARGS__); \
340 utest_abort_failed_( \
341 utest_abort_reduce_(yac_test_result_, (comm), 0), \
342 yac_test_expected_, __FILE__, __LINE__); \
370#define YAC_TEST_EXPECT_ABORT_PAR_ALL( \
371 test_failed, expected_result, expected_substr, comm, ...) \
373 enum yac_test_abort_result yac_test_expected_ = (expected_result); \
374 if (utest_abort_skip_(yac_test_expected_)) { \
379 enum yac_test_abort_result volatile yac_test_result_; \
380 YAC_TEST_ABORT_RUN_( \
381 yac_test_result_, expected_substr, __VA_ARGS__); \
383 utest_abort_failed_( \
384 utest_abort_reduce_(yac_test_result_, (comm), 1), \
385 yac_test_expected_, __FILE__, __LINE__); \
char msg_[YAC_TEST_ABORT_MSG_LEN]
@ YAC_TEST_ABORT_EXPECTED
abort was called with expected message
@ YAC_TEST_ABORT_UNEXPECTED
abort was called with unexpected message
@ YAC_TEST_ABORT_NO_CALL
abort handler was never invoked
#define YAC_UNREACHABLE_DEFAULT(msg)