1 //===-- common_test.cpp -----------------------------------------*- C++ -*-===//
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 "internal_defs.h"
10 #include "tests/scudo_unit_test.h"
11
12 #include "common.h"
13 #include <algorithm>
14 #include <fstream>
15
16 namespace scudo {
17
getResidentMemorySize()18 static uptr getResidentMemorySize() {
19 if (!SCUDO_LINUX)
20 UNREACHABLE("Not implemented!");
21 uptr Size;
22 uptr Resident;
23 std::ifstream IFS("/proc/self/statm");
24 IFS >> Size;
25 IFS >> Resident;
26 return Resident * getPageSizeCached();
27 }
28
29 // Fuchsia needs getResidentMemorySize implementation.
TEST(ScudoCommonTest,SKIP_ON_FUCHSIA (ResidentMemorySize))30 TEST(ScudoCommonTest, SKIP_ON_FUCHSIA(ResidentMemorySize)) {
31 uptr OnStart = getResidentMemorySize();
32 EXPECT_GT(OnStart, 0UL);
33
34 const uptr Size = 1ull << 30;
35 const uptr Threshold = Size >> 3;
36
37 MapPlatformData Data = {};
38 void *P = map(nullptr, Size, "ResidentMemorySize", 0, &Data);
39 ASSERT_NE(nullptr, P);
40 EXPECT_LT(getResidentMemorySize(), OnStart + Threshold);
41
42 memset(P, 1, Size);
43 EXPECT_GT(getResidentMemorySize(), OnStart + Size - Threshold);
44
45 releasePagesToOS((uptr)P, 0, Size, &Data);
46 EXPECT_LT(getResidentMemorySize(), OnStart + Threshold);
47
48 memset(P, 1, Size);
49 EXPECT_GT(getResidentMemorySize(), OnStart + Size - Threshold);
50
51 unmap(P, Size, 0, &Data);
52 }
53
TEST(ScudoCommonTest,Zeros)54 TEST(ScudoCommonTest, Zeros) {
55 const uptr Size = 1ull << 20;
56
57 MapPlatformData Data = {};
58 uptr *P = reinterpret_cast<uptr *>(map(nullptr, Size, "Zeros", 0, &Data));
59 const ptrdiff_t N = Size / sizeof(*P);
60 ASSERT_NE(nullptr, P);
61 EXPECT_EQ(std::count(P, P + N, 0), N);
62
63 memset(P, 1, Size);
64 EXPECT_EQ(std::count(P, P + N, 0), 0);
65
66 releasePagesToOS((uptr)P, 0, Size, &Data);
67 EXPECT_EQ(std::count(P, P + N, 0), N);
68
69 unmap(P, Size, 0, &Data);
70 }
71
72 } // namespace scudo
73