xref: /llvm-project/libc/test/src/unistd/readlink_test.cpp (revision 63a9662f6cc41658f36ccddfb565d3dc5ad0135f)
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