//@HEADER // ************************************************************************ // // Kokkos v. 4.0 // Copyright (2022) National Technology & Engineering // Solutions of Sandia, LLC (NTESS). // // Under the terms of Contract DE-NA0003525 with NTESS, // the U.S. Government retains certain rights in this software. // // Part of Kokkos, under the Apache License v2.0 with LLVM Exceptions. // See https://kokkos.org/LICENSE for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //@HEADER #include #include #include TEST(TEST_CATEGORY_DEATH, abort_from_host) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; char msg[] = "Goodbye cruel world"; EXPECT_DEATH({ Kokkos::abort(msg); }, msg); } template struct TestAbortPrintingToStdout { TestAbortPrintingToStdout() { ::testing::internal::CaptureStdout(); Kokkos::parallel_for(Kokkos::RangePolicy(0, 1), *this); Kokkos::fence(); auto const captured = ::testing::internal::GetCapturedStdout(); EXPECT_TRUE(std::regex_search(captured, std::regex("move along nothing to see here"))) << "here is what was printed to stdout \"" << captured << "\""; } KOKKOS_FUNCTION void operator()(int) const { Kokkos::abort("move along nothing to see here"); } }; template struct TestAbortCausingAbnormalProgramTerminationButIgnoringErrorMessage { TestAbortCausingAbnormalProgramTerminationButIgnoringErrorMessage() { EXPECT_DEATH( { Kokkos::parallel_for(Kokkos::RangePolicy(0, 1), *this); Kokkos::fence(); }, ".*"); } KOKKOS_FUNCTION void operator()(int) const { Kokkos::abort("ignored"); } }; template struct TestAbortCausingAbnormalProgramTerminationAndPrinting { TestAbortCausingAbnormalProgramTerminationAndPrinting() { EXPECT_DEATH( { Kokkos::parallel_for(Kokkos::RangePolicy(0, 1), *this); Kokkos::fence(); }, "Meurs, pourriture communiste !"); } KOKKOS_FUNCTION void operator()(int) const { Kokkos::abort("Meurs, pourriture communiste !"); } }; template void test_abort_from_device() { #if defined(KOKKOS_ENABLE_OPENMPTARGET) // FIXME_OPENMPTARGET if (std::is_same::value) { TestAbortPrintingToStdout(); } else { TestAbortCausingAbnormalProgramTerminationAndPrinting(); } #elif defined(KOKKOS_ENABLE_OPENACC) // FIXME_OPENACC if (std::is_same::value) { TestAbortPrintingToStdout(); } else { TestAbortCausingAbnormalProgramTerminationAndPrinting(); } #elif defined(KOKKOS_ENABLE_SYCL) // FIXME_SYCL if (std::is_same::value) { #ifdef NDEBUG TestAbortPrintingToStdout(); #else TestAbortCausingAbnormalProgramTerminationAndPrinting(); #endif } else { TestAbortCausingAbnormalProgramTerminationAndPrinting(); } #else TestAbortCausingAbnormalProgramTerminationAndPrinting(); #endif } TEST(TEST_CATEGORY_DEATH, abort_from_device) { ::testing::FLAGS_gtest_death_test_style = "threadsafe"; test_abort_from_device(); }