xref: /aosp_15_r20/external/perfetto/src/base/scoped_mmap_unittest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2024 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/scoped_mmap.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
20*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
21*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
22*6dbdd20aSAndroid Build Coastguard Worker #include <sys/mman.h>
23*6dbdd20aSAndroid Build Coastguard Worker #include <unistd.h>
24*6dbdd20aSAndroid Build Coastguard Worker #endif
25*6dbdd20aSAndroid Build Coastguard Worker 
26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/file_utils.h"
27*6dbdd20aSAndroid Build Coastguard Worker #include "src/base/test/tmp_dir_tree.h"
28*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
29*6dbdd20aSAndroid Build Coastguard Worker 
30*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto::base {
31*6dbdd20aSAndroid Build Coastguard Worker namespace {
32*6dbdd20aSAndroid Build Coastguard Worker 
33*6dbdd20aSAndroid Build Coastguard Worker class ScopedMmapTest : public ::testing::Test {
SetUp()34*6dbdd20aSAndroid Build Coastguard Worker   void SetUp() override {
35*6dbdd20aSAndroid Build Coastguard Worker #if !PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) &&   \
36*6dbdd20aSAndroid Build Coastguard Worker     !PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) && \
37*6dbdd20aSAndroid Build Coastguard Worker     !PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE) &&   \
38*6dbdd20aSAndroid Build Coastguard Worker     !PERFETTO_BUILDFLAG(PERFETTO_OS_WIN)
39*6dbdd20aSAndroid Build Coastguard Worker     GTEST_SKIP() << "mmap not supported";
40*6dbdd20aSAndroid Build Coastguard Worker #endif
41*6dbdd20aSAndroid Build Coastguard Worker   }
42*6dbdd20aSAndroid Build Coastguard Worker };
43*6dbdd20aSAndroid Build Coastguard Worker 
TEST_F(ScopedMmapTest,WholeNonExistingFile)44*6dbdd20aSAndroid Build Coastguard Worker TEST_F(ScopedMmapTest, WholeNonExistingFile) {
45*6dbdd20aSAndroid Build Coastguard Worker   base::TmpDirTree tmp;
46*6dbdd20aSAndroid Build Coastguard Worker 
47*6dbdd20aSAndroid Build Coastguard Worker   ScopedMmap mapped = ReadMmapWholeFile(tmp.AbsolutePath("f1.txt").c_str());
48*6dbdd20aSAndroid Build Coastguard Worker 
49*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_FALSE(mapped.IsValid());
50*6dbdd20aSAndroid Build Coastguard Worker }
51*6dbdd20aSAndroid Build Coastguard Worker 
TEST_F(ScopedMmapTest,PartNonExistingFile)52*6dbdd20aSAndroid Build Coastguard Worker TEST_F(ScopedMmapTest, PartNonExistingFile) {
53*6dbdd20aSAndroid Build Coastguard Worker   base::TmpDirTree tmp;
54*6dbdd20aSAndroid Build Coastguard Worker 
55*6dbdd20aSAndroid Build Coastguard Worker   ScopedMmap mapped = ReadMmapFilePart(tmp.AbsolutePath("f1.txt").c_str(), 4);
56*6dbdd20aSAndroid Build Coastguard Worker 
57*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_FALSE(mapped.IsValid());
58*6dbdd20aSAndroid Build Coastguard Worker }
59*6dbdd20aSAndroid Build Coastguard Worker 
TEST_F(ScopedMmapTest,WholeOneByteFile)60*6dbdd20aSAndroid Build Coastguard Worker TEST_F(ScopedMmapTest, WholeOneByteFile) {
61*6dbdd20aSAndroid Build Coastguard Worker   base::TmpDirTree tmp;
62*6dbdd20aSAndroid Build Coastguard Worker   tmp.AddFile("f1.txt", "c");
63*6dbdd20aSAndroid Build Coastguard Worker 
64*6dbdd20aSAndroid Build Coastguard Worker   ScopedMmap mapped = ReadMmapWholeFile(tmp.AbsolutePath("f1.txt").c_str());
65*6dbdd20aSAndroid Build Coastguard Worker 
66*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(mapped.IsValid());
67*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_NE(mapped.data(), nullptr);
68*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(mapped.length(), 1u);
69*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(*static_cast<char*>(mapped.data()), 'c');
70*6dbdd20aSAndroid Build Coastguard Worker }
71*6dbdd20aSAndroid Build Coastguard Worker 
TEST_F(ScopedMmapTest,PartThreeBytes)72*6dbdd20aSAndroid Build Coastguard Worker TEST_F(ScopedMmapTest, PartThreeBytes) {
73*6dbdd20aSAndroid Build Coastguard Worker   base::TmpDirTree tmp;
74*6dbdd20aSAndroid Build Coastguard Worker   tmp.AddFile("f1.txt", "ccccc");
75*6dbdd20aSAndroid Build Coastguard Worker 
76*6dbdd20aSAndroid Build Coastguard Worker   ScopedMmap mapped = ReadMmapFilePart(tmp.AbsolutePath("f1.txt").c_str(), 3);
77*6dbdd20aSAndroid Build Coastguard Worker 
78*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(mapped.IsValid());
79*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_NE(mapped.data(), nullptr);
80*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(mapped.length(), 3u);
81*6dbdd20aSAndroid Build Coastguard Worker }
82*6dbdd20aSAndroid Build Coastguard Worker 
TEST_F(ScopedMmapTest,Reset)83*6dbdd20aSAndroid Build Coastguard Worker TEST_F(ScopedMmapTest, Reset) {
84*6dbdd20aSAndroid Build Coastguard Worker   base::TmpDirTree tmp;
85*6dbdd20aSAndroid Build Coastguard Worker   tmp.AddFile("f1.txt", "ccccc");
86*6dbdd20aSAndroid Build Coastguard Worker   ScopedMmap mapped = ReadMmapWholeFile(tmp.AbsolutePath("f1.txt").c_str());
87*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(mapped.IsValid());
88*6dbdd20aSAndroid Build Coastguard Worker 
89*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_TRUE(mapped.reset());
90*6dbdd20aSAndroid Build Coastguard Worker 
91*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_FALSE(mapped.IsValid());
92*6dbdd20aSAndroid Build Coastguard Worker }
93*6dbdd20aSAndroid Build Coastguard Worker 
94*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_LINUX) ||   \
95*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID) || \
96*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_BUILDFLAG(PERFETTO_OS_APPLE)
TEST_F(ScopedMmapTest,InheritMmappedRange)97*6dbdd20aSAndroid Build Coastguard Worker TEST_F(ScopedMmapTest, InheritMmappedRange) {
98*6dbdd20aSAndroid Build Coastguard Worker   base::TmpDirTree tmp;
99*6dbdd20aSAndroid Build Coastguard Worker   tmp.AddFile("f1.txt", "ccccc");
100*6dbdd20aSAndroid Build Coastguard Worker   ScopedPlatformHandle file(
101*6dbdd20aSAndroid Build Coastguard Worker       base::OpenFile(tmp.AbsolutePath("f1.txt").c_str(), O_RDONLY));
102*6dbdd20aSAndroid Build Coastguard Worker   void* ptr = mmap(nullptr, 5, PROT_READ, MAP_PRIVATE, *file, 0);
103*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_NE(ptr, MAP_FAILED);
104*6dbdd20aSAndroid Build Coastguard Worker 
105*6dbdd20aSAndroid Build Coastguard Worker   ScopedMmap mapped = ScopedMmap::InheritMmappedRange(ptr, 5);
106*6dbdd20aSAndroid Build Coastguard Worker   file.reset();
107*6dbdd20aSAndroid Build Coastguard Worker 
108*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(mapped.IsValid());
109*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_EQ(mapped.length(), 5u);
110*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_EQ(*static_cast<char*>(mapped.data()), 'c');
111*6dbdd20aSAndroid Build Coastguard Worker }
112*6dbdd20aSAndroid Build Coastguard Worker #endif
113*6dbdd20aSAndroid Build Coastguard Worker 
114*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
115*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto::base
116