xref: /llvm-project/libc/test/src/sys/stat/fchmod_test.cpp (revision abc49cc19463970d5523d7d3332e4c1f83bc2ef7)
105532289SSiva Chandra Reddy //===-- Unittests for fchmod ----------------------------------------------===//
205532289SSiva Chandra Reddy //
305532289SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
405532289SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
505532289SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
605532289SSiva Chandra Reddy //
705532289SSiva Chandra Reddy //===----------------------------------------------------------------------===//
805532289SSiva Chandra Reddy 
9af783db7SSiva Chandra Reddy #include "src/errno/libc_errno.h"
1005532289SSiva Chandra Reddy #include "src/fcntl/open.h"
1105532289SSiva Chandra Reddy #include "src/sys/stat/fchmod.h"
1205532289SSiva Chandra Reddy #include "src/unistd/close.h"
1305532289SSiva Chandra Reddy #include "src/unistd/write.h"
144f1fe19dSSiva Chandra Reddy #include "test/UnitTest/ErrnoSetterMatcher.h"
15af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
1605532289SSiva Chandra Reddy 
17*abc49cc1SJob Henandez Lara #include "hdr/fcntl_macros.h"
1805532289SSiva Chandra Reddy #include <sys/stat.h>
1905532289SSiva Chandra Reddy 
2005532289SSiva Chandra Reddy TEST(LlvmLibcChmodTest, ChangeAndOpen) {
21b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
22b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
2305532289SSiva Chandra Reddy 
2405532289SSiva Chandra Reddy   // The test file is initially writable. We open it for writing and ensure
2505532289SSiva Chandra Reddy   // that it indeed can be opened for writing. Next, we close the file and
2605532289SSiva Chandra Reddy   // make it readonly using chmod. We test that chmod actually succeeded by
2705532289SSiva Chandra Reddy   // trying to open the file for writing and failing.
2805532289SSiva Chandra Reddy   constexpr const char *TEST_FILE = "testdata/fchmod.test";
2905532289SSiva Chandra Reddy   const char WRITE_DATA[] = "test data";
3005532289SSiva Chandra Reddy   constexpr ssize_t WRITE_SIZE = ssize_t(sizeof(WRITE_DATA));
313eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
3205532289SSiva Chandra Reddy 
33b6bc9d72SGuillaume Chatelet   int fd = LIBC_NAMESPACE::open(TEST_FILE, O_APPEND | O_WRONLY);
3405532289SSiva Chandra Reddy   ASSERT_GT(fd, 0);
3573874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
36b6bc9d72SGuillaume Chatelet   ASSERT_EQ(LIBC_NAMESPACE::write(fd, WRITE_DATA, sizeof(WRITE_DATA)),
37b6bc9d72SGuillaume Chatelet             WRITE_SIZE);
38b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
3905532289SSiva Chandra Reddy 
40b6bc9d72SGuillaume Chatelet   fd = LIBC_NAMESPACE::open(TEST_FILE, O_APPEND | O_WRONLY);
4105532289SSiva Chandra Reddy   ASSERT_GT(fd, 0);
4273874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
43b6bc9d72SGuillaume Chatelet   EXPECT_THAT(LIBC_NAMESPACE::fchmod(fd, S_IRUSR), Succeeds(0));
44b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
4505532289SSiva Chandra Reddy 
4605532289SSiva Chandra Reddy   // Opening for writing should fail.
47b6bc9d72SGuillaume Chatelet   EXPECT_EQ(LIBC_NAMESPACE::open(TEST_FILE, O_APPEND | O_WRONLY), -1);
4873874f7aSGuillaume Chatelet   ASSERT_ERRNO_FAILURE();
493eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
5005532289SSiva Chandra Reddy   // But opening for reading should succeed.
51b6bc9d72SGuillaume Chatelet   fd = LIBC_NAMESPACE::open(TEST_FILE, O_APPEND | O_RDONLY);
5205532289SSiva Chandra Reddy   EXPECT_GT(fd, 0);
5373874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
5405532289SSiva Chandra Reddy 
55b6bc9d72SGuillaume Chatelet   EXPECT_THAT(LIBC_NAMESPACE::fchmod(fd, S_IRWXU), Succeeds(0));
56b6bc9d72SGuillaume Chatelet   EXPECT_THAT(LIBC_NAMESPACE::close(fd), Succeeds(0));
5705532289SSiva Chandra Reddy }
5805532289SSiva Chandra Reddy 
5905532289SSiva Chandra Reddy TEST(LlvmLibcChmodTest, NonExistentFile) {
603eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
61b6bc9d72SGuillaume Chatelet   ASSERT_EQ(LIBC_NAMESPACE::fchmod(-1, S_IRUSR), -1);
6273874f7aSGuillaume Chatelet   ASSERT_ERRNO_FAILURE();
633eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
6405532289SSiva Chandra Reddy }
65