xref: /llvm-project/libc/test/src/sys/resource/getrlimit_setrlimit_test.cpp (revision 3eb1e6d8e930f5aff17b8d6bcc160f5bbf8cabc7)
1f5cbbb99SSiva Chandra Reddy //===-- Unittests for getrlimit and setrlimit -----------------------------===//
2f5cbbb99SSiva Chandra Reddy //
3f5cbbb99SSiva Chandra Reddy // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f5cbbb99SSiva Chandra Reddy // See https://llvm.org/LICENSE.txt for license information.
5f5cbbb99SSiva Chandra Reddy // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f5cbbb99SSiva Chandra Reddy //
7f5cbbb99SSiva Chandra Reddy //===----------------------------------------------------------------------===//
8f5cbbb99SSiva Chandra Reddy 
9f5cbbb99SSiva Chandra Reddy #include "src/__support/CPP/string_view.h"
10af783db7SSiva Chandra Reddy #include "src/errno/libc_errno.h"
11f5cbbb99SSiva Chandra Reddy #include "src/fcntl/open.h"
12f5cbbb99SSiva Chandra Reddy #include "src/sys/resource/getrlimit.h"
13f5cbbb99SSiva Chandra Reddy #include "src/sys/resource/setrlimit.h"
14f5cbbb99SSiva Chandra Reddy #include "src/unistd/close.h"
15f5cbbb99SSiva Chandra Reddy #include "src/unistd/unlink.h"
164f1fe19dSSiva Chandra Reddy #include "test/UnitTest/ErrnoSetterMatcher.h"
17af1315c2SSiva Chandra Reddy #include "test/UnitTest/Test.h"
18f5cbbb99SSiva Chandra Reddy 
19f5cbbb99SSiva Chandra Reddy #include <sys/resource.h>
20c0ad6e2fSNick Desaulniers #include <sys/stat.h>
21f5cbbb99SSiva Chandra Reddy 
TEST(LlvmLibcResourceLimitsTest,SetNoFileLimit)22f5cbbb99SSiva Chandra Reddy TEST(LlvmLibcResourceLimitsTest, SetNoFileLimit) {
23b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
24b6bc9d72SGuillaume Chatelet   using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
25f5cbbb99SSiva Chandra Reddy 
26f5cbbb99SSiva Chandra Reddy   // The test strategy is to first create initialize two file descriptors
27f5cbbb99SSiva Chandra Reddy   // successfully. Next, close the files and set the file descriptor limit
28f5cbbb99SSiva Chandra Reddy   // to 4. This will allow us to open one of those file but not the other.
29f5cbbb99SSiva Chandra Reddy 
30f5cbbb99SSiva Chandra Reddy   constexpr const char *TEST_FILE1 = "testdata/resource_limits1.test";
31f5cbbb99SSiva Chandra Reddy   constexpr const char *TEST_FILE2 = "testdata/resource_limits2.test";
32*3eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
33f5cbbb99SSiva Chandra Reddy 
34b6bc9d72SGuillaume Chatelet   int fd1 = LIBC_NAMESPACE::open(TEST_FILE1, O_CREAT | O_WRONLY, S_IRWXU);
35f5cbbb99SSiva Chandra Reddy   ASSERT_GT(fd1, 0);
3673874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
37b6bc9d72SGuillaume Chatelet   int fd2 = LIBC_NAMESPACE::open(TEST_FILE2, O_CREAT | O_WRONLY, S_IRWXU);
38f5cbbb99SSiva Chandra Reddy   ASSERT_GT(fd2, 0);
3973874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
40f5cbbb99SSiva Chandra Reddy 
41b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd1), Succeeds(0));
42b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd2), Succeeds(0));
43f5cbbb99SSiva Chandra Reddy 
449050a59cSSiva Chandra Reddy   struct rlimit limits {
45f5cbbb99SSiva Chandra Reddy     4, 4
46f5cbbb99SSiva Chandra Reddy   };
47b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::setrlimit(RLIMIT_NOFILE, &limits), Succeeds(0));
48f5cbbb99SSiva Chandra Reddy 
49f5cbbb99SSiva Chandra Reddy   // One can now only open one of the files successfully.
50b6bc9d72SGuillaume Chatelet   fd1 = LIBC_NAMESPACE::open(TEST_FILE1, O_RDONLY);
51f5cbbb99SSiva Chandra Reddy   ASSERT_GT(fd1, 0);
5273874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
53b6bc9d72SGuillaume Chatelet   fd2 = LIBC_NAMESPACE::open(TEST_FILE2, O_RDONLY);
54f5cbbb99SSiva Chandra Reddy   ASSERT_LT(fd2, 0);
5573874f7aSGuillaume Chatelet   ASSERT_ERRNO_FAILURE();
56f5cbbb99SSiva Chandra Reddy 
57*3eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
58b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd1), Succeeds(0));
59f5cbbb99SSiva Chandra Reddy 
60b6bc9d72SGuillaume Chatelet   fd2 = LIBC_NAMESPACE::open(TEST_FILE2, O_RDONLY);
61f5cbbb99SSiva Chandra Reddy   ASSERT_GT(fd2, 0);
6273874f7aSGuillaume Chatelet   ASSERT_ERRNO_SUCCESS();
63b6bc9d72SGuillaume Chatelet   fd1 = LIBC_NAMESPACE::open(TEST_FILE1, O_RDONLY);
64f5cbbb99SSiva Chandra Reddy   ASSERT_LT(fd1, 0);
6573874f7aSGuillaume Chatelet   ASSERT_ERRNO_FAILURE();
66f5cbbb99SSiva Chandra Reddy 
67*3eb1e6d8Smichaelrj-google   LIBC_NAMESPACE::libc_errno = 0;
68b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::close(fd2), Succeeds(0));
69f5cbbb99SSiva Chandra Reddy 
70b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE1), Succeeds(0));
71b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE2), Succeeds(0));
72f5cbbb99SSiva Chandra Reddy 
739050a59cSSiva Chandra Reddy   struct rlimit current_limits;
74b6bc9d72SGuillaume Chatelet   ASSERT_THAT(LIBC_NAMESPACE::getrlimit(RLIMIT_NOFILE, &current_limits),
75f5cbbb99SSiva Chandra Reddy               Succeeds(0));
76f5cbbb99SSiva Chandra Reddy   ASSERT_EQ(current_limits.rlim_cur, rlim_t(4));
77f5cbbb99SSiva Chandra Reddy   ASSERT_EQ(current_limits.rlim_max, rlim_t(4));
78f5cbbb99SSiva Chandra Reddy }
79