//===-- Interactive unittests for select ----------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #include "src/sys/select/select.h" #include "src/unistd/read.h" #include "test/UnitTest/ErrnoCheckingTest.h" #include "test/UnitTest/ErrnoSetterMatcher.h" #include "test/UnitTest/Test.h" #include #include using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher; using LlvmLibcSelectTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest; // This test is not be run automatically as part of the libc testsuite. // Instead, one has to run it manually and press a key on the keyboard // to make the test succeed. TEST_F(LlvmLibcSelectTest, ReadStdinAfterSelect) { constexpr int STDIN_FD = 0; fd_set set; FD_ZERO(&set); FD_SET(STDIN_FD, &set); struct timeval zero { 0, 0 }; // No wait struct timeval hr { 3600, 0 }; // Wait for an hour. // Zero timeout means we don't wait for input. So, select should return // immediately. ASSERT_THAT( LIBC_NAMESPACE::select(STDIN_FD + 1, &set, nullptr, nullptr, &zero), Succeeds(0)); // The set should indicate that stdin is NOT ready for reading. ASSERT_EQ(0, FD_ISSET(STDIN_FD, &set)); FD_SET(STDIN_FD, &set); // Wait for an hour and give the user a chance to hit a key. ASSERT_THAT(LIBC_NAMESPACE::select(STDIN_FD + 1, &set, nullptr, nullptr, &hr), Succeeds(1)); // The set should indicate that stdin is ready for reading. ASSERT_EQ(1, FD_ISSET(STDIN_FD, &set)); // Verify that atleast one character can be read. char c; ASSERT_THAT(LIBC_NAMESPACE::read(STDIN_FD, &c, 1), Succeeds(ssize_t(1))); }