92 lines · cpp
1//===-- Unittests for remap_file_pages ------------------------------------===//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/sys/mman/mmap.h"11#include "src/sys/mman/munmap.h"12#include "src/sys/mman/remap_file_pages.h"13#include "src/unistd/close.h"14#include "src/unistd/sysconf.h"15#include "test/UnitTest/ErrnoCheckingTest.h"16#include "test/UnitTest/ErrnoSetterMatcher.h"17#include "test/UnitTest/Test.h"18 19#include <sys/mman.h>20#include <sys/stat.h> // For S_IRWXU21 22const size_t PAGE_SIZE = LIBC_NAMESPACE::sysconf(_SC_PAGESIZE);23 24using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;25using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;26using LlvmLibcRemapFilePagesTest = LIBC_NAMESPACE::testing::ErrnoCheckingTest;27 28TEST_F(LlvmLibcRemapFilePagesTest, NoError) {29 size_t page_size = PAGE_SIZE;30 ASSERT_GT(page_size, size_t(0));31 32 // Create a file-backed mapping33 constexpr const char *file_name = "remap_file_pages.test.noerror";34 auto test_file = libc_make_test_file_path(file_name);35 int fd = LIBC_NAMESPACE::open(test_file, O_RDWR | O_CREAT, S_IRWXU);36 ASSERT_GT(fd, 0);37 38 // First, allocate some memory using mmap39 size_t alloc_size = 2 * page_size;40 void *addr = LIBC_NAMESPACE::mmap(nullptr, alloc_size, PROT_READ | PROT_WRITE,41 MAP_SHARED, fd, 0);42 ASSERT_ERRNO_SUCCESS();43 EXPECT_NE(addr, MAP_FAILED);44 45 // Now try to remap the pages46 EXPECT_THAT(LIBC_NAMESPACE::remap_file_pages(addr, page_size, 0, 1, 0),47 Succeeds());48 49 // Clean up50 EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, alloc_size), Succeeds());51 EXPECT_THAT(LIBC_NAMESPACE::close(fd), Succeeds());52}53 54TEST_F(LlvmLibcRemapFilePagesTest, ErrorInvalidFlags) {55 size_t page_size = PAGE_SIZE;56 ASSERT_GT(page_size, size_t(0));57 58 // Create a file-backed mapping59 constexpr const char *file_name = "remap_file_pages.test.error";60 auto test_file = libc_make_test_file_path(file_name);61 int fd = LIBC_NAMESPACE::open(test_file, O_RDWR | O_CREAT, S_IRWXU);62 ASSERT_GT(fd, 0);63 64 // First, allocate some memory using mmap65 size_t alloc_size = 2 * page_size;66 void *addr = LIBC_NAMESPACE::mmap(nullptr, alloc_size, PROT_READ | PROT_WRITE,67 MAP_SHARED, fd, 0);68 ASSERT_ERRNO_SUCCESS();69 EXPECT_NE(addr, MAP_FAILED);70 71 // Try to remap pages with an invalid flag MAP_PRIVATE72 EXPECT_THAT(LIBC_NAMESPACE::remap_file_pages(addr, page_size, PROT_READ, 0,73 MAP_PRIVATE),74 Fails(EINVAL));75 76 // Clean up77 EXPECT_THAT(LIBC_NAMESPACE::munmap(addr, page_size), Succeeds());78 EXPECT_THAT(LIBC_NAMESPACE::close(fd), Succeeds());79}80 81TEST_F(LlvmLibcRemapFilePagesTest, ErrorInvalidAddress) {82 size_t page_size = PAGE_SIZE;83 ASSERT_GT(page_size, size_t(0));84 85 // Use an address that we haven't mapped86 void *invalid_addr = reinterpret_cast<void *>(0x12345000);87 88 EXPECT_THAT(LIBC_NAMESPACE::remap_file_pages(invalid_addr, page_size,89 PROT_READ, 0, 0),90 Fails(EINVAL));91}92