100e51f04SSiva Chandra Reddy //===-- Unittests for readlinkat ------------------------------------------===// 200e51f04SSiva Chandra Reddy // 300e51f04SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 400e51f04SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information. 500e51f04SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 600e51f04SSiva Chandra Reddy // 700e51f04SSiva Chandra Reddy //===----------------------------------------------------------------------===// 800e51f04SSiva Chandra Reddy 900e51f04SSiva Chandra Reddy #include "src/__support/CPP/string_view.h" 1067de5381SSiva Chandra Reddy #include "src/errno/libc_errno.h" 1163a9662fSMikhail R. Gadelha #include "src/string/string_utils.h" 1200e51f04SSiva Chandra Reddy #include "src/unistd/readlinkat.h" 1300e51f04SSiva Chandra Reddy #include "src/unistd/symlink.h" 1400e51f04SSiva Chandra Reddy #include "src/unistd/unlink.h" 154f1fe19dSSiva Chandra Reddy #include "test/UnitTest/ErrnoSetterMatcher.h" 16af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h" 1700e51f04SSiva Chandra Reddy 18*abc49cc1SJob Henandez Lara #include "hdr/fcntl_macros.h" 1900e51f04SSiva Chandra Reddy 20b6bc9d72SGuillaume Chatelet namespace cpp = LIBC_NAMESPACE::cpp; 2100e51f04SSiva Chandra Reddy 2200e51f04SSiva Chandra Reddy TEST(LlvmLibcReadlinkatTest, CreateAndUnlink) { 23b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds; 24045e68f9Slntue constexpr const char *FILENAME = "readlinkat_test_file"; 257a7d5481Smichaelrj-google auto LINK_VAL = libc_make_test_file_path(FILENAME); 26045e68f9Slntue constexpr const char *FILENAME2 = "readlinkat_test_file.link"; 277a7d5481Smichaelrj-google auto LINK = libc_make_test_file_path(FILENAME2); 283eb1e6d8Smichaelrj-google LIBC_NAMESPACE::libc_errno = 0; 2900e51f04SSiva Chandra Reddy 3000e51f04SSiva Chandra Reddy // The test strategy is as follows: 3100e51f04SSiva Chandra Reddy // 1. Create a symlink with value LINK_VAL. 3200e51f04SSiva Chandra Reddy // 2. Read the symlink with readlink. The link value read should be LINK_VAL 3300e51f04SSiva Chandra Reddy // 3. Cleanup the symlink created in step #1. 34b6bc9d72SGuillaume Chatelet ASSERT_THAT(LIBC_NAMESPACE::symlink(LINK_VAL, LINK), Succeeds(0)); 3500e51f04SSiva Chandra Reddy 3663a9662fSMikhail R. Gadelha char buf[256]; 3763a9662fSMikhail R. Gadelha ssize_t len = LIBC_NAMESPACE::readlinkat( 3863a9662fSMikhail R. Gadelha AT_FDCWD, LINK, buf, LIBC_NAMESPACE::internal::string_length(FILENAME)); 3973874f7aSGuillaume Chatelet ASSERT_ERRNO_SUCCESS(); 4000e51f04SSiva Chandra Reddy ASSERT_EQ(cpp::string_view(buf, len), cpp::string_view(LINK_VAL)); 4100e51f04SSiva Chandra Reddy 42b6bc9d72SGuillaume Chatelet ASSERT_THAT(LIBC_NAMESPACE::unlink(LINK), Succeeds(0)); 4300e51f04SSiva Chandra Reddy } 4400e51f04SSiva Chandra Reddy 4500e51f04SSiva Chandra Reddy TEST(LlvmLibcReadlinkatTest, ReadlinkInNonExistentPath) { 46b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails; 4763a9662fSMikhail R. Gadelha constexpr auto LEN = 8; 4863a9662fSMikhail R. Gadelha char buf[LEN]; 4963a9662fSMikhail R. Gadelha ASSERT_THAT( 5063a9662fSMikhail R. Gadelha LIBC_NAMESPACE::readlinkat(AT_FDCWD, "non-existent-link", buf, LEN), 5100e51f04SSiva Chandra Reddy Fails(ENOENT)); 5200e51f04SSiva Chandra Reddy } 53