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