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, ¤t_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