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-exception
6+ //
7+ // ===----------------------------------------------------------------------===//
8+
9+ #include " src/errno/libc_errno.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 " test/UnitTest/ErrnoSetterMatcher.h"
14+ #include " test/UnitTest/Test.h"
15+ #include " src/unistd/sysconf.h"
16+
17+ #include < sys/mman.h>
18+
19+
20+ using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Fails;
21+ using LIBC_NAMESPACE::testing::ErrnoSetterMatcher::Succeeds;
22+
23+ TEST (LlvmLibcRemapFilePagesTest, NoError) {
24+ size_t page_size = sysconf (_SC_PAGE_SIZE);
25+ ASSERT_GT (page_size, size_t (0 ));
26+
27+ // First, allocate some memory using mmap
28+ size_t alloc_size = 2 * page_size;
29+ LIBC_NAMESPACE::libc_errno = 0 ;
30+ void *addr = LIBC_NAMESPACE::mmap (nullptr , alloc_size, PROT_READ | PROT_WRITE,
31+ MAP_PRIVATE | MAP_ANONYMOUS, -1 , 0 );
32+ ASSERT_ERRNO_SUCCESS ();
33+ EXPECT_NE (addr, MAP_FAILED);
34+
35+ // Reset error number for the new function
36+ LIBC_NAMESPACE::libc_errno = 0 ;
37+
38+ // Now try to remap the pages
39+ EXPECT_THAT (LIBC_NAMESPACE::remap_file_pages (addr, page_size, PROT_READ, page_size, 0 ),
40+ Succeeds ());
41+
42+ // Reset error number for the new function
43+ LIBC_NAMESPACE::libc_errno = 0 ;
44+
45+ // Clean up
46+ EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, alloc_size), Succeeds ());
47+ }
48+
49+ TEST (LlvmLibcRemapFilePagesTest, ErrorInvalidFlags) {
50+ size_t page_size = sysconf (_SC_PAGESIZE);
51+ ASSERT_GT (page_size, size_t (0 ));
52+
53+ void *addr = LIBC_NAMESPACE::mmap (nullptr , page_size, PROT_READ | PROT_WRITE,
54+ MAP_PRIVATE | MAP_ANONYMOUS, -1 , 0 );
55+ ASSERT_NE (addr, MAP_FAILED);
56+
57+ // Try to remap pages with an invalid flag MAP_PRIVATE
58+ EXPECT_THAT (LIBC_NAMESPACE::remap_file_pages (addr, page_size, PROT_READ, 0 , MAP_PRIVATE),
59+ Fails (EINVAL));
60+
61+ // Clean up
62+ EXPECT_THAT (LIBC_NAMESPACE::munmap (addr, page_size), Succeeds ());
63+ }
64+
65+ TEST (LlvmLibcRemapFilePagesTest, ErrorInvalidAddress) {
66+ size_t page_size = sysconf (_SC_PAGESIZE);
67+ ASSERT_GT (page_size, size_t (0 ));
68+
69+ // Use an address that we haven't mapped
70+ void *invalid_addr = reinterpret_cast <void *>(0x12345000 );
71+
72+ EXPECT_THAT (LIBC_NAMESPACE::remap_file_pages (invalid_addr, page_size, PROT_READ, 0 , 0 ),
73+ Fails (EINVAL));
74+ }
0 commit comments