//===-- ErrnoCheckingTest.h ------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===---------------------------------------------------------------------===// #ifndef LLVM_LIBC_TEST_UNITTEST_ERRNOCHECKINGTEST_H #define LLVM_LIBC_TEST_UNITTEST_ERRNOCHECKINGTEST_H #include "src/__support/libc_errno.h" #include "src/__support/macros/config.h" #include "test/UnitTest/Test.h" // Define macro to validate the value stored in the errno and restore it // to zero. #define ASSERT_ERRNO_EQ(VAL) \ do { \ ASSERT_EQ(VAL, static_cast(libc_errno)); \ libc_errno = 0; \ } while (0) #define ASSERT_ERRNO_SUCCESS() ASSERT_EQ(0, static_cast(libc_errno)) #define ASSERT_ERRNO_FAILURE() \ do { \ ASSERT_NE(0, static_cast(libc_errno)); \ libc_errno = 0; \ } while (0) namespace LIBC_NAMESPACE_DECL { namespace testing { // Provides a test fixture for tests that validate modifications of the errno. // It clears out the errno at the beginning of the test (e.g. in case it // contained the value pre-set by the system), and confirms it's still zero // at the end of the test, forcing the test author to explicitly account for all // non-zero values. class ErrnoCheckingTest : public Test { public: void SetUp() override { Test::SetUp(); libc_errno = 0; } void TearDown() override { ASSERT_ERRNO_SUCCESS(); Test::TearDown(); } }; } // namespace testing } // namespace LIBC_NAMESPACE_DECL #endif // LLVM_LIBC_TEST_UNITTEST_ERRNOCHECKINGTEST_H