11e8960c7SSiva Chandra Reddy //===-- Implementation of libc death test executors -----------------------===// 21e8960c7SSiva Chandra Reddy // 31e8960c7SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 41e8960c7SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 51e8960c7SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 61e8960c7SSiva Chandra Reddy // 71e8960c7SSiva Chandra Reddy //===----------------------------------------------------------------------===// 81e8960c7SSiva Chandra Reddy 91e8960c7SSiva Chandra Reddy #include "LibcTest.h" 101e8960c7SSiva Chandra Reddy 115ff3ff33SPetr Hosek #include "src/__support/macros/config.h" 121e8960c7SSiva Chandra Reddy #include "test/UnitTest/ExecuteFunction.h" 131e8960c7SSiva Chandra Reddy #include "test/UnitTest/TestLogger.h" 141e8960c7SSiva Chandra Reddy 15*0efb376cSNick Desaulniers #include <assert.h> 161e8960c7SSiva Chandra Reddy 179b02b75cSMikhail R. Gadelha namespace { 189b02b75cSMikhail R. Gadelha constexpr unsigned TIMEOUT_MS = 10000; 199b02b75cSMikhail R. Gadelha } // Anonymous namespace 209b02b75cSMikhail R. Gadelha 215ff3ff33SPetr Hosek namespace LIBC_NAMESPACE_DECL { 221e8960c7SSiva Chandra Reddy namespace testing { 231e8960c7SSiva Chandra Reddy 241e8960c7SSiva Chandra Reddy bool Test::testProcessKilled(testutils::FunctionCaller *Func, int Signal, 251e8960c7SSiva Chandra Reddy const char *LHSStr, const char *RHSStr, 268e44b849SGuillaume Chatelet internal::Location Loc) { 279b02b75cSMikhail R. Gadelha testutils::ProcessStatus Result = 289b02b75cSMikhail R. Gadelha testutils::invoke_in_subprocess(Func, TIMEOUT_MS); 291e8960c7SSiva Chandra Reddy 301e8960c7SSiva Chandra Reddy if (const char *error = Result.get_error()) { 311e8960c7SSiva Chandra Reddy Ctx->markFail(); 328e44b849SGuillaume Chatelet tlog << Loc; 338e44b849SGuillaume Chatelet tlog << error << '\n'; 341e8960c7SSiva Chandra Reddy return false; 351e8960c7SSiva Chandra Reddy } 361e8960c7SSiva Chandra Reddy 371e8960c7SSiva Chandra Reddy if (Result.timed_out()) { 381e8960c7SSiva Chandra Reddy Ctx->markFail(); 398e44b849SGuillaume Chatelet tlog << Loc; 409b02b75cSMikhail R. Gadelha tlog << "Process timed out after " << TIMEOUT_MS << " milliseconds.\n"; 411e8960c7SSiva Chandra Reddy return false; 421e8960c7SSiva Chandra Reddy } 431e8960c7SSiva Chandra Reddy 441e8960c7SSiva Chandra Reddy if (Result.exited_normally()) { 451e8960c7SSiva Chandra Reddy Ctx->markFail(); 468e44b849SGuillaume Chatelet tlog << Loc; 478e44b849SGuillaume Chatelet tlog << "Expected " << LHSStr 481e8960c7SSiva Chandra Reddy << " to be killed by a signal\nBut it exited normally!\n"; 491e8960c7SSiva Chandra Reddy return false; 501e8960c7SSiva Chandra Reddy } 511e8960c7SSiva Chandra Reddy 521e8960c7SSiva Chandra Reddy int KilledBy = Result.get_fatal_signal(); 531e8960c7SSiva Chandra Reddy assert(KilledBy != 0 && "Not killed by any signal"); 541e8960c7SSiva Chandra Reddy if (Signal == -1 || KilledBy == Signal) 551e8960c7SSiva Chandra Reddy return true; 561e8960c7SSiva Chandra Reddy 571e8960c7SSiva Chandra Reddy using testutils::signal_as_string; 581e8960c7SSiva Chandra Reddy Ctx->markFail(); 598e44b849SGuillaume Chatelet tlog << Loc; 608e44b849SGuillaume Chatelet tlog << " Expected: " << LHSStr << '\n' 611e8960c7SSiva Chandra Reddy << "To be killed by signal: " << Signal << '\n' 621e8960c7SSiva Chandra Reddy << " Which is: " << signal_as_string(Signal) << '\n' 631e8960c7SSiva Chandra Reddy << " But it was killed by: " << KilledBy << '\n' 641e8960c7SSiva Chandra Reddy << " Which is: " << signal_as_string(KilledBy) << '\n'; 651e8960c7SSiva Chandra Reddy return false; 661e8960c7SSiva Chandra Reddy } 671e8960c7SSiva Chandra Reddy 681e8960c7SSiva Chandra Reddy bool Test::testProcessExits(testutils::FunctionCaller *Func, int ExitCode, 691e8960c7SSiva Chandra Reddy const char *LHSStr, const char *RHSStr, 708e44b849SGuillaume Chatelet internal::Location Loc) { 719b02b75cSMikhail R. Gadelha testutils::ProcessStatus Result = 729b02b75cSMikhail R. Gadelha testutils::invoke_in_subprocess(Func, TIMEOUT_MS); 731e8960c7SSiva Chandra Reddy 741e8960c7SSiva Chandra Reddy if (const char *error = Result.get_error()) { 751e8960c7SSiva Chandra Reddy Ctx->markFail(); 768e44b849SGuillaume Chatelet tlog << Loc; 778e44b849SGuillaume Chatelet tlog << error << '\n'; 781e8960c7SSiva Chandra Reddy return false; 791e8960c7SSiva Chandra Reddy } 801e8960c7SSiva Chandra Reddy 811e8960c7SSiva Chandra Reddy if (Result.timed_out()) { 821e8960c7SSiva Chandra Reddy Ctx->markFail(); 838e44b849SGuillaume Chatelet tlog << Loc; 849b02b75cSMikhail R. Gadelha tlog << "Process timed out after " << TIMEOUT_MS << " milliseconds.\n"; 851e8960c7SSiva Chandra Reddy return false; 861e8960c7SSiva Chandra Reddy } 871e8960c7SSiva Chandra Reddy 881e8960c7SSiva Chandra Reddy if (!Result.exited_normally()) { 891e8960c7SSiva Chandra Reddy Ctx->markFail(); 908e44b849SGuillaume Chatelet tlog << Loc; 918e44b849SGuillaume Chatelet tlog << "Expected " << LHSStr << '\n' 921e8960c7SSiva Chandra Reddy << "to exit with exit code " << ExitCode << '\n' 931e8960c7SSiva Chandra Reddy << "But it exited abnormally!\n"; 941e8960c7SSiva Chandra Reddy return false; 951e8960c7SSiva Chandra Reddy } 961e8960c7SSiva Chandra Reddy 971e8960c7SSiva Chandra Reddy int ActualExit = Result.get_exit_code(); 981e8960c7SSiva Chandra Reddy if (ActualExit == ExitCode) 991e8960c7SSiva Chandra Reddy return true; 1001e8960c7SSiva Chandra Reddy 1011e8960c7SSiva Chandra Reddy Ctx->markFail(); 1028e44b849SGuillaume Chatelet tlog << Loc; 1038e44b849SGuillaume Chatelet tlog << "Expected exit code of: " << LHSStr << '\n' 1041e8960c7SSiva Chandra Reddy << " Which is: " << ActualExit << '\n' 1051e8960c7SSiva Chandra Reddy << " To be equal to: " << RHSStr << '\n' 1061e8960c7SSiva Chandra Reddy << " Which is: " << ExitCode << '\n'; 1071e8960c7SSiva Chandra Reddy return false; 1081e8960c7SSiva Chandra Reddy } 1091e8960c7SSiva Chandra Reddy 1101e8960c7SSiva Chandra Reddy } // namespace testing 1115ff3ff33SPetr Hosek } // namespace LIBC_NAMESPACE_DECL 112