1fe09f506SPavel Labath //===- ErrnoTest.cpp - Error handling unit tests --------------------------===//
2fe09f506SPavel Labath //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6fe09f506SPavel Labath //
7fe09f506SPavel Labath //===----------------------------------------------------------------------===//
8fe09f506SPavel Labath
9fe09f506SPavel Labath #include "llvm/Support/Errno.h"
10fe09f506SPavel Labath #include "gtest/gtest.h"
11fe09f506SPavel Labath
12fe09f506SPavel Labath using namespace llvm::sys;
13fe09f506SPavel Labath
TEST(ErrnoTest,RetryAfterSignal)14fe09f506SPavel Labath TEST(ErrnoTest, RetryAfterSignal) {
15fe09f506SPavel Labath EXPECT_EQ(1, RetryAfterSignal(-1, [] { return 1; }));
16fe09f506SPavel Labath
17fe09f506SPavel Labath EXPECT_EQ(-1, RetryAfterSignal(-1, [] {
18fe09f506SPavel Labath errno = EAGAIN;
19fe09f506SPavel Labath return -1;
20fe09f506SPavel Labath }));
21fe09f506SPavel Labath EXPECT_EQ(EAGAIN, errno);
22fe09f506SPavel Labath
23fe09f506SPavel Labath unsigned calls = 0;
24fe09f506SPavel Labath EXPECT_EQ(1, RetryAfterSignal(-1, [&calls] {
25fe09f506SPavel Labath errno = EINTR;
26fe09f506SPavel Labath ++calls;
27fe09f506SPavel Labath return calls == 1 ? -1 : 1;
28fe09f506SPavel Labath }));
29fe09f506SPavel Labath EXPECT_EQ(2u, calls);
30fe09f506SPavel Labath
31fe09f506SPavel Labath EXPECT_EQ(1, RetryAfterSignal(-1, [](int x) { return x; }, 1));
32fe09f506SPavel Labath
33fe09f506SPavel Labath std::unique_ptr<int> P(RetryAfterSignal(nullptr, [] { return new int(47); }));
34fe09f506SPavel Labath EXPECT_EQ(47, *P);
359659a127SChandler Carruth
369659a127SChandler Carruth errno = EINTR;
379659a127SChandler Carruth EXPECT_EQ(-1, RetryAfterSignal(-1, [] { return -1; }));
38fe09f506SPavel Labath }
39