diff --git a/flang-rt/unittests/Runtime/Stop.cpp b/flang-rt/unittests/Runtime/Stop.cpp index 5d1af20e77de..5c30f6c301cd 100644 --- a/flang-rt/unittests/Runtime/Stop.cpp +++ b/flang-rt/unittests/Runtime/Stop.cpp @@ -14,26 +14,31 @@ #include "CrashHandlerFixture.h" #include "flang-rt/runtime/environment.h" #include +#include #include using namespace Fortran::runtime; struct TestProgramEnd : CrashHandlerFixture {}; -TEST(TestProgramEnd, StopTest) { +TEST_F(TestProgramEnd, StopTest) { EXPECT_EXIT(RTNAME(StopStatement)(), testing::ExitedWithCode(EXIT_SUCCESS), "Fortran STOP"); } -TEST(TestProgramEnd, StopTestNoStopMessage) { - putenv(const_cast("NO_STOP_MESSAGE=1")); - Fortran::runtime::executionEnvironment.Configure( - 0, nullptr, nullptr, nullptr); +TEST_F(TestProgramEnd, StopTestNoStopMessage) { EXPECT_EXIT( - RTNAME(StopStatement)(), testing::ExitedWithCode(EXIT_SUCCESS), ""); + { + static char noStopMessage[] = "NO_STOP_MESSAGE=1"; + putenv(noStopMessage); + Fortran::runtime::executionEnvironment.Configure( + 0, nullptr, nullptr, nullptr); + RTNAME(StopStatement)(); + }, + testing::ExitedWithCode(EXIT_SUCCESS), ""); } -TEST(TestProgramEnd, StopMessageTest) { +TEST_F(TestProgramEnd, StopMessageTest) { static const char *message{"bye bye"}; EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message), /*isErrorStop=*/false, /*quiet=*/false), @@ -52,48 +57,73 @@ TEST(TestProgramEnd, StopMessageTest) { testing::ExitedWithCode(EXIT_FAILURE), ""); } -TEST(TestProgramEnd, NoStopMessageTest) { - putenv(const_cast("NO_STOP_MESSAGE=1")); - Fortran::runtime::executionEnvironment.Configure( - 0, nullptr, nullptr, nullptr); +TEST_F(TestProgramEnd, NoStopMessageTest) { static const char *message{"bye bye"}; - EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message), - /*isErrorStop=*/false, /*quiet=*/false), + EXPECT_EXIT( + { + static char noStopMessage[] = "NO_STOP_MESSAGE=1"; + putenv(noStopMessage); + Fortran::runtime::executionEnvironment.Configure( + 0, nullptr, nullptr, nullptr); + RTNAME(StopStatementText)(message, std::strlen(message), + /*isErrorStop=*/false, /*quiet=*/false); + }, testing::ExitedWithCode(EXIT_SUCCESS), "bye bye"); - EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message), - /*isErrorStop=*/false, /*quiet=*/true), + EXPECT_EXIT( + { + static char noStopMessage[] = "NO_STOP_MESSAGE=1"; + putenv(noStopMessage); + Fortran::runtime::executionEnvironment.Configure( + 0, nullptr, nullptr, nullptr); + RTNAME(StopStatementText)(message, std::strlen(message), + /*isErrorStop=*/false, /*quiet=*/true); + }, testing::ExitedWithCode(EXIT_SUCCESS), ""); - EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message), - /*isErrorStop=*/true, /*quiet=*/false), + EXPECT_EXIT( + { + static char noStopMessage[] = "NO_STOP_MESSAGE=1"; + putenv(noStopMessage); + Fortran::runtime::executionEnvironment.Configure( + 0, nullptr, nullptr, nullptr); + RTNAME(StopStatementText)(message, std::strlen(message), + /*isErrorStop=*/true, /*quiet=*/false); + }, testing::ExitedWithCode(EXIT_FAILURE), "Fortran ERROR STOP: bye bye"); - EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message), - /*isErrorStop=*/true, /*quiet=*/true), + EXPECT_EXIT( + { + static char noStopMessage[] = "NO_STOP_MESSAGE=1"; + putenv(noStopMessage); + Fortran::runtime::executionEnvironment.Configure( + 0, nullptr, nullptr, nullptr); + RTNAME(StopStatementText)(message, std::strlen(message), + /*isErrorStop=*/true, /*quiet=*/true); + }, testing::ExitedWithCode(EXIT_FAILURE), ""); } -TEST(TestProgramEnd, FailImageTest) { +TEST_F(TestProgramEnd, FailImageTest) { EXPECT_EXIT( RTNAME(FailImageStatement)(), testing::ExitedWithCode(EXIT_FAILURE), ""); } -TEST(TestProgramEnd, ExitTest) { +TEST_F(TestProgramEnd, ExitTest) { EXPECT_EXIT(RTNAME(Exit)(), testing::ExitedWithCode(EXIT_SUCCESS), ""); EXPECT_EXIT( RTNAME(Exit)(EXIT_FAILURE), testing::ExitedWithCode(EXIT_FAILURE), ""); } -TEST(TestProgramEnd, AbortTest) { EXPECT_DEATH(RTNAME(Abort)(), ""); } +TEST_F(TestProgramEnd, AbortTest) { EXPECT_DEATH(RTNAME(Abort)(), ""); } -TEST(TestProgramEnd, CrashTest) { +TEST_F(TestProgramEnd, CrashTest) { static const std::string crashMessage{"bad user code"}; static const std::string fileName{"file name"}; - static const std::string headMessage{"fatal Fortran runtime error\\("}; - static const std::string tailMessage{":343\\): "}; - static const std::string fullMessage{ - headMessage + fileName + tailMessage + crashMessage}; + // CrashHandlerFixture installs a custom crash handler that formats messages + // as: "Test crashed in file (): " + static const std::string fullMessage{"Test CrashTest crashed in file " + + fileName + "\\(343\\): " + crashMessage}; EXPECT_DEATH( RTNAME(ReportFatalUserError)(crashMessage.c_str(), fileName.c_str(), 343), fullMessage.c_str());