xref: /llvm-project/flang/unittests/Runtime/Stop.cpp (revision ffc67bb3602a6a9a4f886af362e1f2d7c9821570)
1*ffc67bb3SDavid Spickett //===-- flang/unittests/Runtime/Stop.cpp ----------------------------------===//
2*ffc67bb3SDavid Spickett //
3*ffc67bb3SDavid Spickett // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*ffc67bb3SDavid Spickett // See https://llvm.org/LICENSE.txt for license information.
5*ffc67bb3SDavid Spickett // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*ffc67bb3SDavid Spickett //
7*ffc67bb3SDavid Spickett //===----------------------------------------------------------------------===//
8*ffc67bb3SDavid Spickett //
9*ffc67bb3SDavid Spickett /// Test runtime API for STOP statement and runtime API to kill the program.
10*ffc67bb3SDavid Spickett //
11*ffc67bb3SDavid Spickett //===----------------------------------------------------------------------===//
12*ffc67bb3SDavid Spickett #include "flang/Runtime/stop.h"
13*ffc67bb3SDavid Spickett #include "CrashHandlerFixture.h"
14*ffc67bb3SDavid Spickett #include "../../runtime/environment.h"
15*ffc67bb3SDavid Spickett #include <cstdlib>
16*ffc67bb3SDavid Spickett #include <gtest/gtest.h>
17*ffc67bb3SDavid Spickett 
18*ffc67bb3SDavid Spickett using namespace Fortran::runtime;
19*ffc67bb3SDavid Spickett 
20*ffc67bb3SDavid Spickett struct TestProgramEnd : CrashHandlerFixture {};
21*ffc67bb3SDavid Spickett 
TEST(TestProgramEnd,StopTest)22*ffc67bb3SDavid Spickett TEST(TestProgramEnd, StopTest) {
23*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatement)(), testing::ExitedWithCode(EXIT_SUCCESS),
24*ffc67bb3SDavid Spickett       "Fortran STOP");
25*ffc67bb3SDavid Spickett }
26*ffc67bb3SDavid Spickett 
TEST(TestProgramEnd,StopTestNoStopMessage)27*ffc67bb3SDavid Spickett TEST(TestProgramEnd, StopTestNoStopMessage) {
28*ffc67bb3SDavid Spickett   putenv(const_cast<char *>("NO_STOP_MESSAGE=1"));
29*ffc67bb3SDavid Spickett   Fortran::runtime::executionEnvironment.Configure(
30*ffc67bb3SDavid Spickett       0, nullptr, nullptr, nullptr);
31*ffc67bb3SDavid Spickett   EXPECT_EXIT(
32*ffc67bb3SDavid Spickett       RTNAME(StopStatement)(), testing::ExitedWithCode(EXIT_SUCCESS), "");
33*ffc67bb3SDavid Spickett }
34*ffc67bb3SDavid Spickett 
TEST(TestProgramEnd,StopMessageTest)35*ffc67bb3SDavid Spickett TEST(TestProgramEnd, StopMessageTest) {
36*ffc67bb3SDavid Spickett   static const char *message{"bye bye"};
37*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
38*ffc67bb3SDavid Spickett                   /*isErrorStop=*/false, /*quiet=*/false),
39*ffc67bb3SDavid Spickett       testing::ExitedWithCode(EXIT_SUCCESS), "Fortran STOP: bye bye");
40*ffc67bb3SDavid Spickett 
41*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
42*ffc67bb3SDavid Spickett                   /*isErrorStop=*/false, /*quiet=*/true),
43*ffc67bb3SDavid Spickett       testing::ExitedWithCode(EXIT_SUCCESS), "");
44*ffc67bb3SDavid Spickett 
45*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
46*ffc67bb3SDavid Spickett                   /*isErrorStop=*/true, /*quiet=*/false),
47*ffc67bb3SDavid Spickett       testing::ExitedWithCode(EXIT_FAILURE), "Fortran ERROR STOP: bye bye");
48*ffc67bb3SDavid Spickett 
49*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
50*ffc67bb3SDavid Spickett                   /*isErrorStop=*/true, /*quiet=*/true),
51*ffc67bb3SDavid Spickett       testing::ExitedWithCode(EXIT_FAILURE), "");
52*ffc67bb3SDavid Spickett }
53*ffc67bb3SDavid Spickett 
TEST(TestProgramEnd,NoStopMessageTest)54*ffc67bb3SDavid Spickett TEST(TestProgramEnd, NoStopMessageTest) {
55*ffc67bb3SDavid Spickett   putenv(const_cast<char *>("NO_STOP_MESSAGE=1"));
56*ffc67bb3SDavid Spickett   Fortran::runtime::executionEnvironment.Configure(
57*ffc67bb3SDavid Spickett       0, nullptr, nullptr, nullptr);
58*ffc67bb3SDavid Spickett   static const char *message{"bye bye"};
59*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
60*ffc67bb3SDavid Spickett                   /*isErrorStop=*/false, /*quiet=*/false),
61*ffc67bb3SDavid Spickett       testing::ExitedWithCode(EXIT_SUCCESS), "bye bye");
62*ffc67bb3SDavid Spickett 
63*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
64*ffc67bb3SDavid Spickett                   /*isErrorStop=*/false, /*quiet=*/true),
65*ffc67bb3SDavid Spickett       testing::ExitedWithCode(EXIT_SUCCESS), "");
66*ffc67bb3SDavid Spickett 
67*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
68*ffc67bb3SDavid Spickett                   /*isErrorStop=*/true, /*quiet=*/false),
69*ffc67bb3SDavid Spickett       testing::ExitedWithCode(EXIT_FAILURE), "Fortran ERROR STOP: bye bye");
70*ffc67bb3SDavid Spickett 
71*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(StopStatementText)(message, std::strlen(message),
72*ffc67bb3SDavid Spickett                   /*isErrorStop=*/true, /*quiet=*/true),
73*ffc67bb3SDavid Spickett       testing::ExitedWithCode(EXIT_FAILURE), "");
74*ffc67bb3SDavid Spickett }
75*ffc67bb3SDavid Spickett 
TEST(TestProgramEnd,FailImageTest)76*ffc67bb3SDavid Spickett TEST(TestProgramEnd, FailImageTest) {
77*ffc67bb3SDavid Spickett   EXPECT_EXIT(
78*ffc67bb3SDavid Spickett       RTNAME(FailImageStatement)(), testing::ExitedWithCode(EXIT_FAILURE), "");
79*ffc67bb3SDavid Spickett }
80*ffc67bb3SDavid Spickett 
TEST(TestProgramEnd,ExitTest)81*ffc67bb3SDavid Spickett TEST(TestProgramEnd, ExitTest) {
82*ffc67bb3SDavid Spickett   EXPECT_EXIT(RTNAME(Exit)(), testing::ExitedWithCode(EXIT_SUCCESS), "");
83*ffc67bb3SDavid Spickett   EXPECT_EXIT(
84*ffc67bb3SDavid Spickett       RTNAME(Exit)(EXIT_FAILURE), testing::ExitedWithCode(EXIT_FAILURE), "");
85*ffc67bb3SDavid Spickett }
86*ffc67bb3SDavid Spickett 
TEST(TestProgramEnd,AbortTest)87*ffc67bb3SDavid Spickett TEST(TestProgramEnd, AbortTest) { EXPECT_DEATH(RTNAME(Abort)(), ""); }
88*ffc67bb3SDavid Spickett 
TEST(TestProgramEnd,CrashTest)89*ffc67bb3SDavid Spickett TEST(TestProgramEnd, CrashTest) {
90*ffc67bb3SDavid Spickett   static const std::string crashMessage{"bad user code"};
91*ffc67bb3SDavid Spickett   static const std::string fileName{"file name"};
92*ffc67bb3SDavid Spickett   static const std::string headMessage{"fatal Fortran runtime error\\("};
93*ffc67bb3SDavid Spickett   static const std::string tailMessage{":343\\): "};
94*ffc67bb3SDavid Spickett   static const std::string fullMessage{
95*ffc67bb3SDavid Spickett       headMessage + fileName + tailMessage + crashMessage};
96*ffc67bb3SDavid Spickett   EXPECT_DEATH(
97*ffc67bb3SDavid Spickett       RTNAME(ReportFatalUserError)(crashMessage.c_str(), fileName.c_str(), 343),
98*ffc67bb3SDavid Spickett       fullMessage.c_str());
99*ffc67bb3SDavid Spickett }
100