xref: /llvm-project/libc/test/src/stdlib/at_quick_exit_test.cpp (revision 4ac891cdd286b251a445c1e3a77d56f55a29858b)
139d38d66Saaryanshukla //===-- Unittests for at_quick_exit ---------------------------------------===//
239d38d66Saaryanshukla //
339d38d66Saaryanshukla // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
439d38d66Saaryanshukla // See https://llvm.org/LICENSE.txt for license information.
539d38d66Saaryanshukla // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
639d38d66Saaryanshukla //
739d38d66Saaryanshukla //===----------------------------------------------------------------------===//
839d38d66Saaryanshukla 
939d38d66Saaryanshukla #include "src/__support/CPP/array.h"
1039d38d66Saaryanshukla #include "src/__support/CPP/utility.h"
11*4ac891cdSJob Henandez Lara #include "src/stdlib/_Exit.h"
1239d38d66Saaryanshukla #include "src/stdlib/at_quick_exit.h"
1339d38d66Saaryanshukla #include "src/stdlib/quick_exit.h"
1439d38d66Saaryanshukla #include "test/UnitTest/Test.h"
1539d38d66Saaryanshukla 
1639d38d66Saaryanshukla static int a;
1739d38d66Saaryanshukla TEST(LlvmLibcAtQuickExit, Basic) {
1839d38d66Saaryanshukla   // In case tests ever run multiple times.
1939d38d66Saaryanshukla   a = 0;
2039d38d66Saaryanshukla 
2139d38d66Saaryanshukla   auto test = [] {
2239d38d66Saaryanshukla     int status = LIBC_NAMESPACE::at_quick_exit(+[] {
2339d38d66Saaryanshukla       if (a != 1)
2439d38d66Saaryanshukla         __builtin_trap();
2539d38d66Saaryanshukla     });
2639d38d66Saaryanshukla     status |= LIBC_NAMESPACE::at_quick_exit(+[] { a++; });
2739d38d66Saaryanshukla     if (status)
2839d38d66Saaryanshukla       __builtin_trap();
2939d38d66Saaryanshukla 
3039d38d66Saaryanshukla     LIBC_NAMESPACE::quick_exit(0);
3139d38d66Saaryanshukla   };
3239d38d66Saaryanshukla   EXPECT_EXITS(test, 0);
3339d38d66Saaryanshukla }
3439d38d66Saaryanshukla 
3539d38d66Saaryanshukla TEST(LlvmLibcAtQuickExit, AtQuickExitCallsSysExit) {
3639d38d66Saaryanshukla   auto test = [] {
37c980cc08SJob Henandez Lara     LIBC_NAMESPACE::at_quick_exit(+[] { LIBC_NAMESPACE::_Exit(1); });
3839d38d66Saaryanshukla     LIBC_NAMESPACE::quick_exit(0);
3939d38d66Saaryanshukla   };
4039d38d66Saaryanshukla   EXPECT_EXITS(test, 1);
4139d38d66Saaryanshukla }
4239d38d66Saaryanshukla 
4339d38d66Saaryanshukla static int size;
4439d38d66Saaryanshukla static LIBC_NAMESPACE::cpp::array<int, 256> arr;
4539d38d66Saaryanshukla 
4639d38d66Saaryanshukla template <int... Ts>
4739d38d66Saaryanshukla void register_at_quick_exit_handlers(
4839d38d66Saaryanshukla     LIBC_NAMESPACE::cpp::integer_sequence<int, Ts...>) {
4939d38d66Saaryanshukla   (LIBC_NAMESPACE::at_quick_exit(+[] { arr[size++] = Ts; }), ...);
5039d38d66Saaryanshukla }
5139d38d66Saaryanshukla 
5239d38d66Saaryanshukla template <int count> constexpr auto get_test() {
5339d38d66Saaryanshukla   return [] {
5439d38d66Saaryanshukla     LIBC_NAMESPACE::at_quick_exit(+[] {
5539d38d66Saaryanshukla       if (size != count)
5639d38d66Saaryanshukla         __builtin_trap();
5739d38d66Saaryanshukla       for (int i = 0; i < count; i++)
5839d38d66Saaryanshukla         if (arr[i] != count - 1 - i)
5939d38d66Saaryanshukla           __builtin_trap();
6039d38d66Saaryanshukla     });
6139d38d66Saaryanshukla     register_at_quick_exit_handlers(
6239d38d66Saaryanshukla         LIBC_NAMESPACE::cpp::make_integer_sequence<int, count>{});
6339d38d66Saaryanshukla     LIBC_NAMESPACE::quick_exit(0);
6439d38d66Saaryanshukla   };
6539d38d66Saaryanshukla }
6639d38d66Saaryanshukla 
6739d38d66Saaryanshukla TEST(LlvmLibcAtQuickExit, ReverseOrder) {
6839d38d66Saaryanshukla   // In case tests ever run multiple times.
6939d38d66Saaryanshukla   size = 0;
7039d38d66Saaryanshukla 
7139d38d66Saaryanshukla   auto test = get_test<32>();
7239d38d66Saaryanshukla   EXPECT_EXITS(test, 0);
7339d38d66Saaryanshukla }
7439d38d66Saaryanshukla 
7539d38d66Saaryanshukla TEST(LlvmLibcAtQuickExit, Many) {
7639d38d66Saaryanshukla   // In case tests ever run multiple times.
7739d38d66Saaryanshukla   size = 0;
7839d38d66Saaryanshukla 
7939d38d66Saaryanshukla   auto test = get_test<256>();
8039d38d66Saaryanshukla   EXPECT_EXITS(test, 0);
8139d38d66Saaryanshukla }
8239d38d66Saaryanshukla 
8339d38d66Saaryanshukla TEST(LlvmLibcAtQuickExit, HandlerCallsAtQuickExit) {
8439d38d66Saaryanshukla   auto test = [] {
8539d38d66Saaryanshukla     LIBC_NAMESPACE::at_quick_exit(+[] {
8639d38d66Saaryanshukla       LIBC_NAMESPACE::at_quick_exit(+[] { LIBC_NAMESPACE::quick_exit(1); });
8739d38d66Saaryanshukla     });
8839d38d66Saaryanshukla     LIBC_NAMESPACE::quick_exit(0);
8939d38d66Saaryanshukla   };
9039d38d66Saaryanshukla   EXPECT_EXITS(test, 1);
9139d38d66Saaryanshukla }
92