On targets without unistd.h or sys/wait.h (such as bare metal targets) any test that uses check_assertion.h will fail, so add REQUIRES: has-unix-headers to them and autodetect whether we have these headers or not. These tests currently have unsupported on windows, but that's exactly because windows doesn't have these headers so we can remove the specific check for windows. Differential Revision: https://reviews.llvm.org/D124623
65 lines
2.3 KiB
C++
65 lines
2.3 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// REQUIRES: has-unix-headers
|
|
// UNSUPPORTED: c++03
|
|
// XFAIL: use_system_cxx_lib && target={{.+}}-apple-macosx{{10.9|10.10|10.11|10.12|10.13|10.14|10.15|11.0|12.0}}
|
|
// ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_ENABLE_ASSERTIONS=1
|
|
|
|
#include <cassert>
|
|
#include <cstdio>
|
|
#include <string>
|
|
|
|
#include "check_assertion.h"
|
|
|
|
template <class Func>
|
|
inline bool TestDeathTest(const char* stmt, Func&& func, DeathTest::ResultKind ExpectResult, AssertionInfoMatcher Matcher = AnyMatcher) {
|
|
DeathTest DT(Matcher);
|
|
DeathTest::ResultKind RK = DT.Run(func);
|
|
auto OnFailure = [&](std::string msg) {
|
|
std::fprintf(stderr, "EXPECT_DEATH( %s ) failed! (%s)\n\n", stmt, msg.c_str());
|
|
if (!DT.getChildStdErr().empty()) {
|
|
std::fprintf(stderr, "---------- standard err ----------\n%s\n", DT.getChildStdErr().c_str());
|
|
}
|
|
if (!DT.getChildStdOut().empty()) {
|
|
std::fprintf(stderr, "---------- standard out ----------\n%s\n", DT.getChildStdOut().c_str());
|
|
}
|
|
return false;
|
|
};
|
|
if (RK != ExpectResult)
|
|
return OnFailure(std::string("expected result did not occur: expected ") + DeathTest::ResultKindToString(ExpectResult) + " got: " + DeathTest::ResultKindToString(RK));
|
|
return true;
|
|
}
|
|
#define TEST_DEATH_TEST(RK, ...) assert((TestDeathTest(#__VA_ARGS__, [&]() { __VA_ARGS__; }, RK, AnyMatcher )))
|
|
|
|
#define TEST_DEATH_TEST_MATCHES(RK, Matcher, ...) assert((TestDeathTest(#__VA_ARGS__, [&]() { __VA_ARGS__; }, RK, Matcher)))
|
|
|
|
void my_libcpp_assert() {
|
|
_LIBCPP_ASSERT(false, "other");
|
|
}
|
|
|
|
void test_no_match_found() {
|
|
AssertionInfoMatcher ExpectMatch("my message");
|
|
TEST_DEATH_TEST_MATCHES(DeathTest::RK_MatchFailure, ExpectMatch, my_libcpp_assert());
|
|
}
|
|
|
|
void test_did_not_die() {
|
|
TEST_DEATH_TEST(DeathTest::RK_DidNotDie, ((void)0));
|
|
}
|
|
|
|
void test_unknown() {
|
|
TEST_DEATH_TEST(DeathTest::RK_Unknown, std::exit(13));
|
|
}
|
|
|
|
int main(int, char**) {
|
|
test_no_match_found();
|
|
test_did_not_die();
|
|
test_unknown();
|
|
return 0;
|
|
}
|