blob: f85a5d57cf7006fc5d5c048eb7f9f1487e6e44df [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "src/developer/memory/metrics/summary.h"
#include <gtest/gtest.h>
#include "src/developer/memory/metrics/capture.h"
#include "src/developer/memory/metrics/tests/test_utils.h"
namespace memory {
namespace test {
using SummaryUnitTest = testing::Test;
TEST_F(SummaryUnitTest, Single) {
// One process, one vmo.
Capture c;
TestUtils::CreateCapture(&c, {
.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
},
.processes =
{
{.koid = 2, .name = "p1", .vmos = {1}},
},
});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, TwoVmos) {
// One process, two vmos with same name.
Capture c;
TestUtils::CreateCapture(&c, {
.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
{.koid = 2, .name = "v1", .committed_bytes = 100},
},
.processes =
{
{.koid = 2, .name = "p1", .vmos = {1, 2}},
},
});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(200U, sizes.private_bytes);
EXPECT_EQ(200U, sizes.scaled_bytes);
EXPECT_EQ(200U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(200U, sizes.private_bytes);
EXPECT_EQ(200U, sizes.scaled_bytes);
EXPECT_EQ(200U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, TwoVmoNames) {
// One process, two vmos with different names.
Capture c;
TestUtils::CreateCapture(&c, {
.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
{.koid = 2, .name = "v2", .committed_bytes = 100},
},
.processes = {{.koid = 2, .name = "p1", .vmos = {1, 2}}},
});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(200U, sizes.private_bytes);
EXPECT_EQ(200U, sizes.scaled_bytes);
EXPECT_EQ(200U, sizes.total_bytes);
EXPECT_EQ(2U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
sizes = ps.GetSizes("v2");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, Parent) {
// One process, two vmos with different names, one is child.
Capture c;
TestUtils::CreateCapture(
&c, {
.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
{.koid = 2, .name = "v2", .committed_bytes = 100, .parent_koid = 1},
},
.processes = {{.koid = 2, .name = "p1", .vmos = {2}}},
});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(200U, sizes.private_bytes);
EXPECT_EQ(200U, sizes.scaled_bytes);
EXPECT_EQ(200U, sizes.total_bytes);
EXPECT_EQ(2U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
sizes = ps.GetSizes("v2");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, TwoProcesses) {
// Two processes, with different vmos.
Capture c;
TestUtils::CreateCapture(&c, {.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
{.koid = 2, .name = "v2", .committed_bytes = 100},
},
.processes = {
{.koid = 2, .name = "p1", .vmos = {1}},
{.koid = 3, .name = "p2", .vmos = {2}},
}});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(3U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
ps = process_summaries.at(2);
EXPECT_EQ(3U, ps.koid());
EXPECT_STREQ("p2", ps.name().c_str());
sizes = ps.sizes();
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v2");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, TwoProcessesShared) {
// Two processes, with same vmos.
Capture c;
TestUtils::CreateCapture(&c, {.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
},
.processes = {
{.koid = 2, .name = "p1", .vmos = {1}},
{.koid = 3, .name = "p2", .vmos = {1}},
}});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(3U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
ps = process_summaries.at(2);
EXPECT_EQ(3U, ps.koid());
EXPECT_STREQ("p2", ps.name().c_str());
sizes = ps.sizes();
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, TwoProcessesChild) {
// Two processes, with one vmo shared through parantage.
Capture c;
TestUtils::CreateCapture(
&c, {.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
{.koid = 2, .name = "v2", .committed_bytes = 100, .parent_koid = 1},
},
.processes = {
{.koid = 2, .name = "p1", .vmos = {1}},
{.koid = 3, .name = "p2", .vmos = {2}},
}});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(3U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
ps = process_summaries.at(2);
EXPECT_EQ(3U, ps.koid());
EXPECT_STREQ("p2", ps.name().c_str());
sizes = ps.sizes();
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(150U, sizes.scaled_bytes);
EXPECT_EQ(200U, sizes.total_bytes);
EXPECT_EQ(2U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
sizes = ps.GetSizes("v2");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, MissingParent) {
// Child VMO with parent koid that's not found.
Capture c;
TestUtils::CreateCapture(
&c, {.vmos =
{
{.koid = 2, .name = "v2", .committed_bytes = 100, .parent_koid = 1},
},
.processes = {
{.koid = 2, .name = "p1", .vmos = {2}},
}});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
ProcessSummary ps = process_summaries.at(1);
EXPECT_STREQ("p1", ps.name().c_str());
EXPECT_EQ(2U, ps.koid());
Sizes sizes = ps.sizes();
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
sizes = ps.GetSizes("v2");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, Kernel) {
// Test kernel stats.
Capture c;
TestUtils::CreateCapture(&c, {
.kmem =
{
.wired_bytes = 10,
.total_heap_bytes = 20,
.mmu_overhead_bytes = 30,
.ipc_bytes = 40,
.other_bytes = 50,
.vmo_bytes = 60,
},
});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(1U, process_summaries.size());
ProcessSummary ps = process_summaries.at(0);
EXPECT_EQ(ProcessSummary::kKernelKoid, ps.koid());
EXPECT_STREQ("kernel", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(210U, sizes.private_bytes);
EXPECT_EQ(210U, sizes.scaled_bytes);
EXPECT_EQ(210U, sizes.total_bytes);
EXPECT_EQ(6U, ps.name_to_sizes().size());
sizes = ps.GetSizes("wired");
EXPECT_EQ(10U, sizes.private_bytes);
EXPECT_EQ(10U, sizes.scaled_bytes);
EXPECT_EQ(10U, sizes.total_bytes);
sizes = ps.GetSizes("heap");
EXPECT_EQ(20U, sizes.private_bytes);
EXPECT_EQ(20U, sizes.scaled_bytes);
EXPECT_EQ(20U, sizes.total_bytes);
sizes = ps.GetSizes("mmu");
EXPECT_EQ(30U, sizes.private_bytes);
EXPECT_EQ(30U, sizes.scaled_bytes);
EXPECT_EQ(30U, sizes.total_bytes);
sizes = ps.GetSizes("ipc");
EXPECT_EQ(40U, sizes.private_bytes);
EXPECT_EQ(40U, sizes.scaled_bytes);
EXPECT_EQ(40U, sizes.total_bytes);
sizes = ps.GetSizes("other");
EXPECT_EQ(50U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(50U, sizes.total_bytes);
sizes = ps.GetSizes("vmo");
EXPECT_EQ(60U, sizes.private_bytes);
EXPECT_EQ(60U, sizes.scaled_bytes);
EXPECT_EQ(60U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, KernelVmo) {
// Test kernel that kernel vmo memory that isn't found in
// user space vmos is listed under the kernel.
Capture c;
TestUtils::CreateCapture(&c, {
.kmem =
{
.vmo_bytes = 110,
},
.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
},
.processes =
{
{.koid = 2, .name = "p1", .vmos = {1}},
},
});
Summary s(c);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
ProcessSummary ps = process_summaries.at(0);
EXPECT_EQ(ProcessSummary::kKernelKoid, ps.koid());
EXPECT_STREQ("kernel", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(10U, sizes.private_bytes);
EXPECT_EQ(10U, sizes.scaled_bytes);
EXPECT_EQ(10U, sizes.total_bytes);
sizes = ps.GetSizes("vmo");
EXPECT_EQ(10U, sizes.private_bytes);
EXPECT_EQ(10U, sizes.scaled_bytes);
EXPECT_EQ(10U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, NameMatch) {
// One process, two vmos with same name.
Capture c;
TestUtils::CreateCapture(
&c, {
.vmos =
{
{.koid = 1, .name = "blob-12a", .committed_bytes = 100},
{.koid = 2, .name = "mrkl-12a", .committed_bytes = 100},
{.koid = 3, .name = "blob-de", .committed_bytes = 100},
{.koid = 4, .name = "pthread_t:0x59853000/TLS=0x548", .committed_bytes = 100},
{.koid = 5, .name = "thrd_t:0x59853000/TLS=0x548", .committed_bytes = 100},
{.koid = 6, .name = "data:libfoo.so", .committed_bytes = 100},
{.koid = 7, .name = "", .committed_bytes = 100},
{.koid = 8, .name = "scudo:primary", .committed_bytes = 100},
{.koid = 9, .name = "scudo:secondary", .committed_bytes = 100},
{.koid = 10, .name = "foo", .committed_bytes = 100},
{.koid = 11, .name = "initial-thread", .committed_bytes = 100},
{.koid = 12, .name = "libfoo.so.1", .committed_bytes = 100},
},
.processes =
{
{.koid = 2, .name = "p1", .vmos = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}},
},
});
Summary s(c, Summary::kNameMatches);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(1200U, sizes.private_bytes);
EXPECT_EQ(8U, ps.name_to_sizes().size());
EXPECT_EQ(200U, ps.GetSizes("[blobs]").private_bytes);
EXPECT_EQ(100U, ps.GetSizes("[blob-merkles]").private_bytes);
EXPECT_EQ(300U, ps.GetSizes("[stacks]").private_bytes);
EXPECT_EQ(100U, ps.GetSizes("[data]").private_bytes);
EXPECT_EQ(100U, ps.GetSizes("[unnamed]").private_bytes);
EXPECT_EQ(200U, ps.GetSizes("[scudo]").private_bytes);
EXPECT_EQ(100U, ps.GetSizes("foo").private_bytes);
EXPECT_EQ(100U, ps.GetSizes("[libraries]").private_bytes);
}
TEST_F(SummaryUnitTest, AllUndigested) {
// One process, two vmos with different names.
Capture c;
TestUtils::CreateCapture(&c, {
.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
{.koid = 2, .name = "v2", .committed_bytes = 100},
},
.processes = {{.koid = 2, .name = "p1", .vmos = {1, 2}}},
});
Namer namer({});
Summary s(c, &namer, {1, 2});
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(200U, sizes.private_bytes);
EXPECT_EQ(200U, sizes.scaled_bytes);
EXPECT_EQ(200U, sizes.total_bytes);
EXPECT_EQ(2U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
sizes = ps.GetSizes("v2");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, OneUndigested) {
// One process, two vmos with different names.
Capture c;
TestUtils::CreateCapture(&c, {
.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
{.koid = 2, .name = "v2", .committed_bytes = 100},
},
.processes = {{.koid = 2, .name = "p1", .vmos = {1, 2}}},
});
Namer namer({});
Summary s(c, &namer, {1});
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, TwoProcessesOneUndigested) {
// Two processes, with different vmos.
Capture c;
TestUtils::CreateCapture(&c, {.vmos =
{
{.koid = 1, .name = "v1", .committed_bytes = 100},
{.koid = 2, .name = "v2", .committed_bytes = 100},
},
.processes = {
{.koid = 2, .name = "p1", .vmos = {1}},
{.koid = 3, .name = "p2", .vmos = {2}},
}});
Namer namer({});
Summary s(c, &namer, {1});
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(2U, process_summaries.size());
// Skip kernel summary.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(2U, ps.koid());
EXPECT_STREQ("p1", ps.name().c_str());
Sizes sizes = ps.sizes();
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
EXPECT_EQ(1U, ps.name_to_sizes().size());
sizes = ps.GetSizes("v1");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
}
TEST_F(SummaryUnitTest, Pools) {
// One process, two vmos with same name.
Capture c;
TestUtils::CreateCapture(
&c, {.vmos =
{
{.koid = 1, .name = "SysmemContiguousPool", .committed_bytes = 400},
{.koid = 2, .name = "ContiguousChild", .size_bytes = 300, .parent_koid = 1},
{.koid = 3, .name = "ContiguousGrandchild", .size_bytes = 100, .parent_koid = 2},
{.koid = 4, .name = "ContiguousGrandchild", .size_bytes = 50, .parent_koid = 2},
{.koid = 5, .name = "Sysmem-core", .committed_bytes = 50},
{.koid = 6, .name = "CoreChild", .size_bytes = 50, .parent_koid = 5},
},
.processes =
{
{.koid = 10, .name = "p1", .vmos = {1, 2, 5}},
{.koid = 20, .name = "p2", .vmos = {3}},
{.koid = 30, .name = "p3", .vmos = {4}},
{.koid = 40, .name = "p4", .vmos = {6}},
},
.rooted_vmo_names = Capture::kDefaultRootedVmoNames});
Summary s(c, Summary::kNameMatches);
auto process_summaries = TestUtils::GetProcessSummaries(s);
ASSERT_EQ(5U, process_summaries.size());
// Skip kernel summary.
// SysmemContiguousPool will be left with 100 bytes, shared by all three processes.
// ContiguousChild will be left with 150 bytes, shared by all three processes.
// p2 will have a private ContiguousGrandchild VMO of 100 bytes.
// p3 will have a private ContiguousGrandchild VMO of 50 bytes.
ProcessSummary ps = process_summaries.at(1);
EXPECT_EQ(10U, ps.koid());
Sizes sizes = ps.sizes();
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(250U / 3, sizes.scaled_bytes);
EXPECT_EQ(250U, sizes.total_bytes);
sizes = ps.GetSizes("SysmemContiguousPool");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(100U / 3, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
sizes = ps.GetSizes("ContiguousChild");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(150U / 3, sizes.scaled_bytes);
EXPECT_EQ(150U, sizes.total_bytes);
ps = process_summaries.at(2);
EXPECT_EQ(20U, ps.koid());
sizes = ps.sizes();
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U + 250U / 3, sizes.scaled_bytes);
EXPECT_EQ(100U + 250U, sizes.total_bytes);
sizes = ps.GetSizes("SysmemContiguousPool");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(100U / 3, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
sizes = ps.GetSizes("ContiguousChild");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(150U / 3, sizes.scaled_bytes);
EXPECT_EQ(150U, sizes.total_bytes);
sizes = ps.GetSizes("ContiguousGrandchild");
EXPECT_EQ(100U, sizes.private_bytes);
EXPECT_EQ(100U, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
ps = process_summaries.at(3);
EXPECT_EQ(30U, ps.koid());
sizes = ps.sizes();
EXPECT_EQ(50U, sizes.private_bytes);
EXPECT_EQ(50U + 250U / 3, sizes.scaled_bytes);
EXPECT_EQ(50U + 250U, sizes.total_bytes);
sizes = ps.GetSizes("SysmemContiguousPool");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(100U / 3, sizes.scaled_bytes);
EXPECT_EQ(100U, sizes.total_bytes);
sizes = ps.GetSizes("ContiguousChild");
EXPECT_EQ(0U, sizes.private_bytes);
EXPECT_EQ(150U / 3, sizes.scaled_bytes);
EXPECT_EQ(150U, sizes.total_bytes);
sizes = ps.GetSizes("ContiguousGrandchild");
EXPECT_EQ(50U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(50U, sizes.total_bytes);
ps = process_summaries.at(4);
EXPECT_EQ(40U, ps.koid());
sizes = ps.sizes();
EXPECT_EQ(50U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(50U, sizes.total_bytes);
sizes = ps.GetSizes("CoreChild");
EXPECT_EQ(50U, sizes.private_bytes);
EXPECT_EQ(50U, sizes.scaled_bytes);
EXPECT_EQ(50U, sizes.total_bytes);
}
} // namespace test
} // namespace memory