xref: /llvm-project/libc/test/src/unistd/fchdir_test.cpp (revision 3eb1e6d8e930f5aff17b8d6bcc160f5bbf8cabc7)
105532289SSiva Chandra Reddy //===-- Unittests for fchdir ----------------------------------------------===//
205532289SSiva Chandra Reddy //
305532289SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
405532289SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
505532289SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
605532289SSiva Chandra Reddy //
705532289SSiva Chandra Reddy //===----------------------------------------------------------------------===//
805532289SSiva Chandra Reddy 
967de5381SSiva Chandra Reddy #include "src/errno/libc_errno.h"
1005532289SSiva Chandra Reddy #include "src/fcntl/open.h"
1105532289SSiva Chandra Reddy #include "src/unistd/close.h"
1205532289SSiva Chandra Reddy #include "src/unistd/fchdir.h"
134f1fe19dSSiva Chandra Reddy #include "test/UnitTest/ErrnoSetterMatcher.h"
14af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
1505532289SSiva Chandra Reddy 
1605532289SSiva Chandra Reddy #include <fcntl.h>
1705532289SSiva Chandra Reddy 
1805532289SSiva Chandra Reddy TEST(LlvmLibcChdirTest, ChangeAndOpen) {
1905532289SSiva Chandra Reddy   // The idea of this test is that we will first open an existing test file
2005532289SSiva Chandra Reddy   // without changing the directory to make sure it exists. Next, we change
2105532289SSiva Chandra Reddy   // directory and open the same file to make sure that the "fchdir" operation
2205532289SSiva Chandra Reddy   // succeeded.
23b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
247a7d5481Smichaelrj-google   constexpr const char *FILENAME = "testdata";
257a7d5481Smichaelrj-google   auto TEST_DIR = libc_make_test_file_path(FILENAME);
267a7d5481Smichaelrj-google   constexpr const char *FILENAME2 = "testdata/fchdir.test";
277a7d5481Smichaelrj-google   auto TEST_FILE = libc_make_test_file_path(FILENAME2);
287a7d5481Smichaelrj-google   constexpr const char *FILENAME3 = "fchdir.test";
297a7d5481Smichaelrj-google   auto TEST_FILE_BASE = libc_make_test_file_path(FILENAME3);
30*3eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
3105532289SSiva Chandra Reddy 
32b6bc9d72SGuillaume Chatelet   int dir_fd = LIBC_NAMESPACE::open(TEST_DIR, O_DIRECTORY);
3305532289SSiva Chandra Reddy   ASSERT_GT(dir_fd, 0);
3473874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
35b6bc9d72SGuillaume Chatelet   int file_fd = LIBC_NAMESPACE::open(TEST_FILE, O_PATH);
3605532289SSiva Chandra Reddy   ASSERT_GT(file_fd, 0);
3773874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
38b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(file_fd), Succeeds(0));
3905532289SSiva Chandra Reddy 
40b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::fchdir(dir_fd), Succeeds(0));
41b6bc9d72SGuillaume Chatelet   file_fd = LIBC_NAMESPACE::open(TEST_FILE_BASE, O_PATH);
4205532289SSiva Chandra Reddy   ASSERT_GT(file_fd, 0);
4373874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
44b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(file_fd), Succeeds(0));
45b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(dir_fd), Succeeds(0));
4605532289SSiva Chandra Reddy }
4705532289SSiva Chandra Reddy 
4805532289SSiva Chandra Reddy TEST(LlvmLibcChdirTest, ChangeToNonExistentDir) {
49b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
50*3eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
51b6bc9d72SGuillaume Chatelet   ASSERT_EQ(LIBC_NAMESPACE::fchdir(0), -1);
5273874f7aSGuillaume Chatelet   ASSERT_ERRNO_FAILURE();
53*3eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
5405532289SSiva Chandra Reddy }
55