100e51f04SSiva Chandra Reddy //===-- Unittests for readlink --------------------------------------------===// 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" 11*63a9662fSMikhail R. Gadelha #include "src/string/string_utils.h" 1200e51f04SSiva Chandra Reddy #include "src/unistd/readlink.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 18b6bc9d72SGuillaume Chatelet namespace cpp = LIBC_NAMESPACE::cpp; 1900e51f04SSiva Chandra Reddy 2000e51f04SSiva Chandra Reddy TEST(LlvmLibcReadlinkTest, CreateAndUnlink) { 21b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds; 22045e68f9Slntue constexpr const char *FILENAME = "readlink_test_file"; 237a7d5481Smichaelrj-google auto LINK_VAL = libc_make_test_file_path(FILENAME); 24045e68f9Slntue constexpr const char *FILENAME2 = "readlink_test_file.link"; 257a7d5481Smichaelrj-google auto LINK = libc_make_test_file_path(FILENAME2); 263eb1e6d8Smichaelrj-google LIBC_NAMESPACE::libc_errno = 0; 2700e51f04SSiva Chandra Reddy 2800e51f04SSiva Chandra Reddy // The test strategy is as follows: 2900e51f04SSiva Chandra Reddy // 1. Create a symlink with value LINK_VAL. 3000e51f04SSiva Chandra Reddy // 2. Read the symlink with readlink. The link value read should be LINK_VAL 3100e51f04SSiva Chandra Reddy // 3. Cleanup the symlink created in step #1. 32b6bc9d72SGuillaume Chatelet ASSERT_THAT(LIBC_NAMESPACE::symlink(LINK_VAL, LINK), Succeeds(0)); 3300e51f04SSiva Chandra Reddy 34*63a9662fSMikhail R. Gadelha char buf[256]; 35*63a9662fSMikhail R. Gadelha ssize_t len = LIBC_NAMESPACE::readlink( 36*63a9662fSMikhail R. Gadelha LINK, buf, LIBC_NAMESPACE::internal::string_length(FILENAME)); 3773874f7aSGuillaume Chatelet ASSERT_ERRNO_SUCCESS(); 3800e51f04SSiva Chandra Reddy ASSERT_EQ(cpp::string_view(buf, len), cpp::string_view(LINK_VAL)); 3900e51f04SSiva Chandra Reddy 40b6bc9d72SGuillaume Chatelet ASSERT_THAT(LIBC_NAMESPACE::unlink(LINK), Succeeds(0)); 4100e51f04SSiva Chandra Reddy } 4200e51f04SSiva Chandra Reddy 4300e51f04SSiva Chandra Reddy TEST(LlvmLibcReadlinkTest, ReadlinkInNonExistentPath) { 44b6bc9d72SGuillaume Chatelet using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails; 45*63a9662fSMikhail R. Gadelha constexpr auto LEN = 8; 46*63a9662fSMikhail R. Gadelha char buf[LEN]; 47*63a9662fSMikhail R. Gadelha ASSERT_THAT(LIBC_NAMESPACE::readlink("non-existent-link", buf, LEN), 4800e51f04SSiva Chandra Reddy Fails(ENOENT)); 4900e51f04SSiva Chandra Reddy } 50