xref: /aosp_15_r20/external/llvm-libc/test/src/unistd/isatty_test.cpp (revision 71db0c75aadcf003ffe3238005f61d7618a3fead)
1*71db0c75SAndroid Build Coastguard Worker //===-- Unittests for isatty ----------------------------------------------===//
2*71db0c75SAndroid Build Coastguard Worker //
3*71db0c75SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*71db0c75SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*71db0c75SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*71db0c75SAndroid Build Coastguard Worker //
7*71db0c75SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*71db0c75SAndroid Build Coastguard Worker 
9*71db0c75SAndroid Build Coastguard Worker #include "src/errno/libc_errno.h"
10*71db0c75SAndroid Build Coastguard Worker #include "src/fcntl/open.h"
11*71db0c75SAndroid Build Coastguard Worker #include "src/unistd/close.h"
12*71db0c75SAndroid Build Coastguard Worker #include "src/unistd/isatty.h"
13*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/ErrnoSetterMatcher.h"
14*71db0c75SAndroid Build Coastguard Worker #include "test/UnitTest/Test.h"
15*71db0c75SAndroid Build Coastguard Worker 
16*71db0c75SAndroid Build Coastguard Worker #include <sys/stat.h>
17*71db0c75SAndroid Build Coastguard Worker 
18*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
19*71db0c75SAndroid Build Coastguard Worker using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
20*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcIsATTYTest,StdInOutTests)21*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcIsATTYTest, StdInOutTests) {
22*71db0c75SAndroid Build Coastguard Worker   // If stdin is connected to a terminal, assume that all of the standard i/o
23*71db0c75SAndroid Build Coastguard Worker   // fds are.
24*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::libc_errno = 0;
25*71db0c75SAndroid Build Coastguard Worker   if (LIBC_NAMESPACE::isatty(0)) {
26*71db0c75SAndroid Build Coastguard Worker     EXPECT_THAT(LIBC_NAMESPACE::isatty(0), Succeeds(1)); // stdin
27*71db0c75SAndroid Build Coastguard Worker     EXPECT_THAT(LIBC_NAMESPACE::isatty(1), Succeeds(1)); // stdout
28*71db0c75SAndroid Build Coastguard Worker     EXPECT_THAT(LIBC_NAMESPACE::isatty(2), Succeeds(1)); // stderr
29*71db0c75SAndroid Build Coastguard Worker   } else {
30*71db0c75SAndroid Build Coastguard Worker     EXPECT_THAT(LIBC_NAMESPACE::isatty(0), Fails(ENOTTY, 0)); // stdin
31*71db0c75SAndroid Build Coastguard Worker     EXPECT_THAT(LIBC_NAMESPACE::isatty(1), Fails(ENOTTY, 0)); // stdout
32*71db0c75SAndroid Build Coastguard Worker     EXPECT_THAT(LIBC_NAMESPACE::isatty(2), Fails(ENOTTY, 0)); // stderr
33*71db0c75SAndroid Build Coastguard Worker   }
34*71db0c75SAndroid Build Coastguard Worker }
35*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcIsATTYTest,BadFdTest)36*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcIsATTYTest, BadFdTest) {
37*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::libc_errno = 0;
38*71db0c75SAndroid Build Coastguard Worker   EXPECT_THAT(LIBC_NAMESPACE::isatty(-1), Fails(EBADF, 0)); // invalid fd
39*71db0c75SAndroid Build Coastguard Worker }
40*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcIsATTYTest,DevTTYTest)41*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcIsATTYTest, DevTTYTest) {
42*71db0c75SAndroid Build Coastguard Worker   constexpr const char *FILENAME = "/dev/tty";
43*71db0c75SAndroid Build Coastguard Worker   auto TTY_FILE = libc_make_test_file_path(FILENAME);
44*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::libc_errno = 0;
45*71db0c75SAndroid Build Coastguard Worker   int fd = LIBC_NAMESPACE::open(TTY_FILE, O_RDONLY);
46*71db0c75SAndroid Build Coastguard Worker   if (fd > 0) {
47*71db0c75SAndroid Build Coastguard Worker     ASSERT_ERRNO_SUCCESS();
48*71db0c75SAndroid Build Coastguard Worker     EXPECT_THAT(LIBC_NAMESPACE::isatty(fd), Succeeds(1));
49*71db0c75SAndroid Build Coastguard Worker     ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
50*71db0c75SAndroid Build Coastguard Worker   }
51*71db0c75SAndroid Build Coastguard Worker }
52*71db0c75SAndroid Build Coastguard Worker 
TEST(LlvmLibcIsATTYTest,FileTest)53*71db0c75SAndroid Build Coastguard Worker TEST(LlvmLibcIsATTYTest, FileTest) {
54*71db0c75SAndroid Build Coastguard Worker   constexpr const char *FILENAME = "isatty.test";
55*71db0c75SAndroid Build Coastguard Worker   auto TEST_FILE = libc_make_test_file_path(FILENAME);
56*71db0c75SAndroid Build Coastguard Worker   LIBC_NAMESPACE::libc_errno = 0;
57*71db0c75SAndroid Build Coastguard Worker   int fd = LIBC_NAMESPACE::open(TEST_FILE, O_WRONLY | O_CREAT, S_IRWXU);
58*71db0c75SAndroid Build Coastguard Worker   ASSERT_ERRNO_SUCCESS();
59*71db0c75SAndroid Build Coastguard Worker   ASSERT_GT(fd, 0);
60*71db0c75SAndroid Build Coastguard Worker   EXPECT_THAT(LIBC_NAMESPACE::isatty(fd), Fails(ENOTTY, 0));
61*71db0c75SAndroid Build Coastguard Worker   ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
62*71db0c75SAndroid Build Coastguard Worker }
63