55 lines · cpp
1//===-- Unittests for access ----------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/fcntl/open.h"10#include "src/unistd/access.h"11#include "src/unistd/close.h"12#include "src/unistd/unlink.h"13#include "test/UnitTest/ErrnoCheckingTest.h"14#include "test/UnitTest/ErrnoSetterMatcher.h"15#include "test/UnitTest/Test.h"16 17#include <sys/stat.h>18#include <unistd.h>19 20using LlvmLibcAccessTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;21 22TEST_F(LlvmLibcAccessTest, CreateAndTest) {23 // The test strategy is to repeatedly create a file in different modes and24 // test that it is accessable in those modes but not in others.25 using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;26 using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;27 constexpr const char *FILENAME = "access.test";28 auto TEST_FILE = libc_make_test_file_path(FILENAME);29 int fd = LIBC_NAMESPACE::open(TEST_FILE, O_WRONLY | O_CREAT, S_IRWXU);30 ASSERT_ERRNO_SUCCESS();31 ASSERT_GT(fd, 0);32 ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));33 34 ASSERT_THAT(LIBC_NAMESPACE::access(TEST_FILE, F_OK), Succeeds(0));35 ASSERT_THAT(LIBC_NAMESPACE::access(TEST_FILE, X_OK | W_OK | R_OK),36 Succeeds(0));37 ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE), Succeeds(0));38 39 fd = LIBC_NAMESPACE::open(TEST_FILE, O_WRONLY | O_CREAT, S_IXUSR);40 ASSERT_ERRNO_SUCCESS();41 ASSERT_GT(fd, 0);42 ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));43 ASSERT_THAT(LIBC_NAMESPACE::access(TEST_FILE, F_OK), Succeeds(0));44 ASSERT_THAT(LIBC_NAMESPACE::access(TEST_FILE, X_OK), Succeeds(0));45 ASSERT_THAT(LIBC_NAMESPACE::access(TEST_FILE, R_OK), Fails(EACCES));46 ASSERT_THAT(LIBC_NAMESPACE::access(TEST_FILE, W_OK), Fails(EACCES));47 ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE), Succeeds(0));48}49 50TEST_F(LlvmLibcAccessTest, AccessNonExistentFile) {51 using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;52 ASSERT_THAT(LIBC_NAMESPACE::access("testdata/non-existent-file", F_OK),53 Fails(ENOENT));54}55