blob: 98c24fcda9f1355522d04a10701ff5f9b90e1d65 [file] [log] [blame]
// Copyright 2019 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/arc/tracing/arc_system_model.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace arc {
using ArcSystemModelTest = testing::Test;
TEST_F(ArcSystemModelTest, TrimByTimestampCPU) {
ArcSystemModel model;
constexpr uint64_t trim_timestamp = 25;
constexpr int idle_tid = 0;
constexpr int non_idle_tid = 100;
// Second event is before |trim_timestamp|. First event should be discard,
// second should be preserved but with clamped timestamp to |trim_timestamp|.
AddAllCpuEvent(&model.all_cpu_events(), 0 /* cpu_id */, 10 /* timestamp */,
ArcCpuEvent::Type::kIdleIn, idle_tid);
AddAllCpuEvent(&model.all_cpu_events(), 0 /* cpu_id */, 20 /* timestamp */,
ArcCpuEvent::Type::kWakeUp, non_idle_tid);
AddAllCpuEvent(&model.all_cpu_events(), 0 /* cpu_id */, 30 /* timestamp */,
ArcCpuEvent::Type::kIdleOut, idle_tid);
// All events are after |trim_timestamp|. Everything should be preserved.
AddAllCpuEvent(&model.all_cpu_events(), 1 /* cpu_id */, 32 /* timestamp */,
ArcCpuEvent::Type::kIdleIn, idle_tid);
AddAllCpuEvent(&model.all_cpu_events(), 1 /* cpu_id */, 42 /* timestamp */,
ArcCpuEvent::Type::kWakeUp, non_idle_tid);
AddAllCpuEvent(&model.all_cpu_events(), 1 /* cpu_id */, 52 /* timestamp */,
ArcCpuEvent::Type::kIdleOut, idle_tid);
// Second event is exactly |on trim_timestamp|. First even should be
// discarded.
AddAllCpuEvent(&model.all_cpu_events(), 2 /* cpu_id */, 15 /* timestamp */,
ArcCpuEvent::Type::kIdleIn, idle_tid);
AddAllCpuEvent(&model.all_cpu_events(), 2 /* cpu_id */, 25 /* timestamp */,
ArcCpuEvent::Type::kWakeUp, non_idle_tid);
AddAllCpuEvent(&model.all_cpu_events(), 2 /* cpu_id */, 35 /* timestamp */,
ArcCpuEvent::Type::kIdleOut, idle_tid);
// All events are before |trim_timestamp|. Last one should be preserved but
// with clamped timestamp to |trim_timestamp|.
AddAllCpuEvent(&model.all_cpu_events(), 3 /* cpu_id */, 10 /* timestamp */,
ArcCpuEvent::Type::kIdleIn, idle_tid);
AddAllCpuEvent(&model.all_cpu_events(), 3 /* cpu_id */, 15 /* timestamp */,
ArcCpuEvent::Type::kWakeUp, non_idle_tid);
AddAllCpuEvent(&model.all_cpu_events(), 3 /* cpu_id */, 20 /* timestamp */,
ArcCpuEvent::Type::kIdleOut, idle_tid);
model.Trim(trim_timestamp);
ASSERT_EQ(4U, model.all_cpu_events().size());
const CpuEvents& cpu_events_0 = model.all_cpu_events()[0 /* cpu_id */];
const CpuEvents& cpu_events_1 = model.all_cpu_events()[1 /* cpu_id */];
const CpuEvents& cpu_events_2 = model.all_cpu_events()[2 /* cpu_id */];
const CpuEvents& cpu_events_3 = model.all_cpu_events()[3 /* cpu_id */];
ASSERT_EQ(2U, cpu_events_0.size());
EXPECT_EQ(ArcCpuEvent::Type::kWakeUp, cpu_events_0[0].type);
EXPECT_EQ(trim_timestamp, cpu_events_0[0].timestamp);
ASSERT_EQ(3U, cpu_events_1.size());
EXPECT_EQ(ArcCpuEvent::Type::kIdleIn, cpu_events_1[0].type);
EXPECT_EQ(32u, cpu_events_1[0].timestamp);
ASSERT_EQ(2U, cpu_events_2.size());
EXPECT_EQ(ArcCpuEvent::Type::kWakeUp, cpu_events_2[0].type);
EXPECT_EQ(trim_timestamp, cpu_events_2[0].timestamp);
ASSERT_EQ(1U, cpu_events_3.size());
EXPECT_EQ(ArcCpuEvent::Type::kIdleOut, cpu_events_3[0].type);
EXPECT_EQ(trim_timestamp, cpu_events_3[0].timestamp);
}
TEST_F(ArcSystemModelTest, TrimByTimestampMemory) {
ArcSystemModel model;
constexpr uint64_t trim_timestamp = 25;
// First of ArcValueEvent::Type::kMemTotal should be clamped to
// |trim_timestamp|.
model.memory_events().emplace_back(
0 /* timestamp */, ArcValueEvent::Type::kMemTotal, 100 /* value */);
model.memory_events().emplace_back(
0 /* timestamp */, ArcValueEvent::Type::kMemUsed, 20 /* value */);
model.memory_events().emplace_back(
0 /* timestamp */, ArcValueEvent::Type::kSwapRead, 0 /* value */);
model.memory_events().emplace_back(
10 /* timestamp */, ArcValueEvent::Type::kSwapRead, 1 /* value */);
model.memory_events().emplace_back(
20 /* timestamp */, ArcValueEvent::Type::kSwapRead, 2 /* value */);
// Second of |ArcValueEvent::Type::kMemUsed| is exactly on |trim_timestamp|.
// First |ArcValueEvent::Type::kMemUsed| should be discarded.
model.memory_events().emplace_back(
25 /* timestamp */, ArcValueEvent::Type::kMemUsed, 30 /* value */);
// We have 3 |ArcValueEvent::Type::kSwapRead| before. Two first should be
// discarded and third one should be clamped to |trim_timestamp|.
model.memory_events().emplace_back(
30 /* timestamp */, ArcValueEvent::Type::kSwapRead, 3 /* value */);
model.memory_events().emplace_back(
40 /* timestamp */, ArcValueEvent::Type::kSwapRead, 4 /* value */);
model.memory_events().emplace_back(
50 /* timestamp */, ArcValueEvent::Type::kMemTotal, 100 /* value */);
model.memory_events().emplace_back(
50 /* timestamp */, ArcValueEvent::Type::kMemUsed, 40 /* value */);
model.memory_events().emplace_back(
50 /* timestamp */, ArcValueEvent::Type::kSwapRead, 5 /* value */);
EXPECT_EQ(11u, model.memory_events().size());
model.Trim(trim_timestamp);
ASSERT_EQ(8u, model.memory_events().size());
EXPECT_EQ(ArcValueEvent(trim_timestamp, ArcValueEvent::Type::kMemTotal, 100),
model.memory_events()[0]);
EXPECT_EQ(ArcValueEvent(trim_timestamp, ArcValueEvent::Type::kSwapRead, 2),
model.memory_events()[1]);
EXPECT_EQ(ArcValueEvent(trim_timestamp, ArcValueEvent::Type::kMemUsed, 30),
model.memory_events()[2]);
EXPECT_EQ(ArcValueEvent(30, ArcValueEvent::Type::kSwapRead, 3),
model.memory_events()[3]);
EXPECT_EQ(ArcValueEvent(40, ArcValueEvent::Type::kSwapRead, 4),
model.memory_events()[4]);
EXPECT_EQ(ArcValueEvent(50, ArcValueEvent::Type::kMemTotal, 100),
model.memory_events()[5]);
EXPECT_EQ(ArcValueEvent(50, ArcValueEvent::Type::kMemUsed, 40),
model.memory_events()[6]);
EXPECT_EQ(ArcValueEvent(50, ArcValueEvent::Type::kSwapRead, 5),
model.memory_events()[7]);
}
TEST_F(ArcSystemModelTest, CloseRange) {
ArcSystemModel model;
model.memory_events().emplace_back(
0 /* timestamp */, ArcValueEvent::Type::kGpuFrequency, 100 /* value */);
model.memory_events().emplace_back(
0 /* timestamp */, ArcValueEvent::Type::kCpuTemperature, 20 /* value */);
model.memory_events().emplace_back(
100 /* timestamp */, ArcValueEvent::Type::kGpuFrequency, 150 /* value */);
model.memory_events().emplace_back(200 /* timestamp */,
ArcValueEvent::Type::kCpuTemperature,
50 /* value */);
EXPECT_EQ(4u, model.memory_events().size());
model.CloseRangeForValueEvents(200 /* timestamp */);
// kGpuFrequency is extended.
ASSERT_EQ(5u, model.memory_events().size());
EXPECT_EQ(ArcValueEvent(200 /* timestamp */,
ArcValueEvent::Type::kGpuFrequency, 150 /* value */),
model.memory_events().back());
}
} // namespace arc