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