xref: /llvm-project/compiler-rt/lib/scudo/standalone/tests/common_test.cpp (revision dd741fc1b1a2a809bedc71a704a6d702c3bc7c8a)
16435ca4eSVitaly Buka //===-- common_test.cpp -----------------------------------------*- C++ -*-===//
20bccdf82SVitaly Buka //
30bccdf82SVitaly Buka // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40bccdf82SVitaly Buka // See https://llvm.org/LICENSE.txt for license information.
50bccdf82SVitaly Buka // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60bccdf82SVitaly Buka //
70bccdf82SVitaly Buka //===----------------------------------------------------------------------===//
80bccdf82SVitaly Buka 
90bccdf82SVitaly Buka #include "internal_defs.h"
100bccdf82SVitaly Buka #include "tests/scudo_unit_test.h"
110bccdf82SVitaly Buka 
120bccdf82SVitaly Buka #include "common.h"
1375577104SChia-hung Duan #include "mem_map.h"
140bccdf82SVitaly Buka #include <algorithm>
150bccdf82SVitaly Buka #include <fstream>
160bccdf82SVitaly Buka 
170bccdf82SVitaly Buka namespace scudo {
180bccdf82SVitaly Buka 
190bccdf82SVitaly Buka static uptr getResidentMemorySize() {
206435ca4eSVitaly Buka   if (!SCUDO_LINUX)
216435ca4eSVitaly Buka     UNREACHABLE("Not implemented!");
220bccdf82SVitaly Buka   uptr Size;
230bccdf82SVitaly Buka   uptr Resident;
240bccdf82SVitaly Buka   std::ifstream IFS("/proc/self/statm");
250bccdf82SVitaly Buka   IFS >> Size;
260bccdf82SVitaly Buka   IFS >> Resident;
270bccdf82SVitaly Buka   return Resident * getPageSizeCached();
280bccdf82SVitaly Buka }
290bccdf82SVitaly Buka 
300bccdf82SVitaly Buka // Fuchsia needs getResidentMemorySize implementation.
310bccdf82SVitaly Buka TEST(ScudoCommonTest, SKIP_ON_FUCHSIA(ResidentMemorySize)) {
320bccdf82SVitaly Buka   uptr OnStart = getResidentMemorySize();
33bec6b022SJinsong Ji   EXPECT_GT(OnStart, 0UL);
340bccdf82SVitaly Buka 
350bccdf82SVitaly Buka   const uptr Size = 1ull << 30;
360bccdf82SVitaly Buka   const uptr Threshold = Size >> 3;
370bccdf82SVitaly Buka 
3875577104SChia-hung Duan   MemMapT MemMap;
3975577104SChia-hung Duan   ASSERT_TRUE(MemMap.map(/*Addr=*/0U, Size, "ResidentMemorySize"));
4075577104SChia-hung Duan   ASSERT_NE(MemMap.getBase(), 0U);
4175577104SChia-hung Duan   void *P = reinterpret_cast<void *>(MemMap.getBase());
42b40908e6SVitaly Buka   EXPECT_LT(getResidentMemorySize(), OnStart + Threshold);
430bccdf82SVitaly Buka 
440bccdf82SVitaly Buka   memset(P, 1, Size);
45b40908e6SVitaly Buka   EXPECT_GT(getResidentMemorySize(), OnStart + Size - Threshold);
460bccdf82SVitaly Buka 
4775577104SChia-hung Duan   MemMap.releasePagesToOS(MemMap.getBase(), Size);
48b40908e6SVitaly Buka   EXPECT_LT(getResidentMemorySize(), OnStart + Threshold);
490bccdf82SVitaly Buka 
500bccdf82SVitaly Buka   memset(P, 1, Size);
51b40908e6SVitaly Buka   EXPECT_GT(getResidentMemorySize(), OnStart + Size - Threshold);
52e14696bfSVitaly Buka 
53*dd741fc1SChiaHungDuan   MemMap.unmap();
540bccdf82SVitaly Buka }
550bccdf82SVitaly Buka 
56c261edb2SVitaly Buka TEST(ScudoCommonTest, Zeros) {
57c261edb2SVitaly Buka   const uptr Size = 1ull << 20;
58c261edb2SVitaly Buka 
5975577104SChia-hung Duan   MemMapT MemMap;
6075577104SChia-hung Duan   ASSERT_TRUE(MemMap.map(/*Addr=*/0U, Size, "Zeros"));
6175577104SChia-hung Duan   ASSERT_NE(MemMap.getBase(), 0U);
6275577104SChia-hung Duan   uptr *P = reinterpret_cast<uptr *>(MemMap.getBase());
6375577104SChia-hung Duan   const ptrdiff_t N = Size / sizeof(uptr);
64c261edb2SVitaly Buka   EXPECT_EQ(std::count(P, P + N, 0), N);
65c261edb2SVitaly Buka 
66c261edb2SVitaly Buka   memset(P, 1, Size);
67c261edb2SVitaly Buka   EXPECT_EQ(std::count(P, P + N, 0), 0);
68c261edb2SVitaly Buka 
6975577104SChia-hung Duan   MemMap.releasePagesToOS(MemMap.getBase(), Size);
70c261edb2SVitaly Buka   EXPECT_EQ(std::count(P, P + N, 0), N);
71c261edb2SVitaly Buka 
72*dd741fc1SChiaHungDuan   MemMap.unmap();
73c261edb2SVitaly Buka }
74c261edb2SVitaly Buka 
750bccdf82SVitaly Buka } // namespace scudo
76