brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.8 KiB · 4e0a3c7 Raw
79 lines · cpp
1//===-- Unittests for getrlimit and setrlimit -----------------------------===//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/__support/CPP/string_view.h"10#include "src/fcntl/open.h"11#include "src/sys/resource/getrlimit.h"12#include "src/sys/resource/setrlimit.h"13#include "src/unistd/close.h"14#include "src/unistd/unlink.h"15#include "test/UnitTest/ErrnoCheckingTest.h"16#include "test/UnitTest/ErrnoSetterMatcher.h"17#include "test/UnitTest/Test.h"18 19#include <sys/resource.h>20#include <sys/stat.h>21 22using namespace LIBC_NAMESPACE::testing::ErrnoSetterMatcher;23using LlvmLibcResourceLimitsTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;24 25TEST_F(LlvmLibcResourceLimitsTest, SetNoFileLimit) {26  // The test strategy is to first create initialize two file descriptors27  // successfully. Next, close the files and set the file descriptor limit28  // to 4. This will allow us to open one of those file but not the other.29 30  constexpr const char *TEST_FILE1_NAME = "resource_limits1.test";31  constexpr const char *TEST_FILE2_NAME = "resource_limits2.test";32 33  auto TEST_FILE1 = libc_make_test_file_path(TEST_FILE1_NAME);34  auto TEST_FILE2 = libc_make_test_file_path(TEST_FILE2_NAME);35 36  int fd1 = LIBC_NAMESPACE::open(TEST_FILE1, O_CREAT | O_WRONLY, S_IRWXU);37  ASSERT_GT(fd1, 0);38  ASSERT_ERRNO_SUCCESS();39  int fd2 = LIBC_NAMESPACE::open(TEST_FILE2, O_CREAT | O_WRONLY, S_IRWXU);40  ASSERT_GT(fd2, 0);41  ASSERT_ERRNO_SUCCESS();42 43  ASSERT_THAT(LIBC_NAMESPACE::close(fd1), Succeeds(0));44  ASSERT_THAT(LIBC_NAMESPACE::close(fd2), Succeeds(0));45 46  struct rlimit limits {47    4, 448  };49  ASSERT_THAT(LIBC_NAMESPACE::setrlimit(RLIMIT_NOFILE, &limits), Succeeds(0));50 51  // One can now only open one of the files successfully.52  fd1 = LIBC_NAMESPACE::open(TEST_FILE1, O_RDONLY);53  ASSERT_GT(fd1, 0);54  ASSERT_ERRNO_SUCCESS();55  fd2 = LIBC_NAMESPACE::open(TEST_FILE2, O_RDONLY);56  ASSERT_LT(fd2, 0);57  ASSERT_ERRNO_FAILURE();58 59  ASSERT_THAT(LIBC_NAMESPACE::close(fd1), Succeeds(0));60 61  fd2 = LIBC_NAMESPACE::open(TEST_FILE2, O_RDONLY);62  ASSERT_GT(fd2, 0);63  ASSERT_ERRNO_SUCCESS();64  fd1 = LIBC_NAMESPACE::open(TEST_FILE1, O_RDONLY);65  ASSERT_LT(fd1, 0);66  ASSERT_ERRNO_FAILURE();67 68  ASSERT_THAT(LIBC_NAMESPACE::close(fd2), Succeeds(0));69 70  ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE1), Succeeds(0));71  ASSERT_THAT(LIBC_NAMESPACE::unlink(TEST_FILE2), Succeeds(0));72 73  struct rlimit current_limits;74  ASSERT_THAT(LIBC_NAMESPACE::getrlimit(RLIMIT_NOFILE, &current_limits),75              Succeeds(0));76  ASSERT_EQ(current_limits.rlim_cur, rlim_t(4));77  ASSERT_EQ(current_limits.rlim_max, rlim_t(4));78}79