1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
// 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_cpu_event.h"
#include "base/functional/bind.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace arc {
using ArcCpuEventTest = testing::Test;
using Type = ArcCpuEvent::Type;
namespace {
bool CheckTrasition(Type from_type,
uint32_t from_tid,
Type to_type,
uint32_t to_tid) {
CpuEvents cpu_events;
const bool added =
AddCpuEvent(&cpu_events, 1000 /* timestamp */, from_type, from_tid);
DCHECK(added);
DCHECK(cpu_events.size() == 1);
if (!AddCpuEvent(&cpu_events, 1001 /* timestamp */, to_type, to_tid)) {
DCHECK(cpu_events.size() == 1);
return false;
}
DCHECK(cpu_events.size() == 2);
return true;
}
} // namespace
TEST_F(ArcCpuEventTest, Generic) {
constexpr int idle_tid = 0;
constexpr int real_tid = 1;
AllCpuEvents all_cpu_events;
EXPECT_TRUE(AddAllCpuEvent(&all_cpu_events, 3 /* cpu_id */,
1000 /* timestamp */, Type::kIdleIn, idle_tid));
ASSERT_EQ(4U, all_cpu_events.size());
EXPECT_EQ(0U, all_cpu_events[0].size());
EXPECT_EQ(0U, all_cpu_events[1].size());
EXPECT_EQ(0U, all_cpu_events[2].size());
EXPECT_EQ(1U, all_cpu_events[3].size());
// Timestamp is before but this is separate CPU events band.
EXPECT_TRUE(AddAllCpuEvent(&all_cpu_events, 0 /* cpu_id */,
999 /* timestamp */, Type::kIdleIn, idle_tid));
ASSERT_EQ(4U, all_cpu_events.size());
EXPECT_EQ(1U, all_cpu_events[0].size());
EXPECT_EQ(0U, all_cpu_events[1].size());
EXPECT_EQ(0U, all_cpu_events[2].size());
EXPECT_EQ(1U, all_cpu_events[3].size());
// Broken timestamp.
EXPECT_FALSE(AddAllCpuEvent(&all_cpu_events, 0 /* cpu_id */,
998 /* timestamp */, Type::kIdleOut, idle_tid));
// Validate transitions.
EXPECT_FALSE(
CheckTrasition(Type::kIdleIn, idle_tid, Type::kIdleIn, idle_tid));
EXPECT_TRUE(
CheckTrasition(Type::kIdleIn, idle_tid, Type::kIdleOut, idle_tid));
EXPECT_TRUE(CheckTrasition(Type::kIdleIn, idle_tid, Type::kWakeUp, real_tid));
EXPECT_FALSE(
CheckTrasition(Type::kIdleIn, idle_tid, Type::kActive, real_tid));
EXPECT_TRUE(
CheckTrasition(Type::kIdleOut, idle_tid, Type::kIdleIn, idle_tid));
EXPECT_FALSE(
CheckTrasition(Type::kIdleOut, idle_tid, Type::kIdleOut, idle_tid));
EXPECT_TRUE(
CheckTrasition(Type::kIdleOut, idle_tid, Type::kWakeUp, real_tid));
EXPECT_TRUE(
CheckTrasition(Type::kIdleOut, idle_tid, Type::kActive, real_tid));
EXPECT_TRUE(CheckTrasition(Type::kWakeUp, real_tid, Type::kIdleIn, idle_tid));
EXPECT_TRUE(
CheckTrasition(Type::kWakeUp, real_tid, Type::kIdleOut, idle_tid));
EXPECT_TRUE(CheckTrasition(Type::kWakeUp, real_tid, Type::kWakeUp, real_tid));
EXPECT_TRUE(CheckTrasition(Type::kWakeUp, real_tid, Type::kActive, real_tid));
EXPECT_TRUE(CheckTrasition(Type::kActive, real_tid, Type::kIdleIn, idle_tid));
EXPECT_FALSE(
CheckTrasition(Type::kActive, real_tid, Type::kIdleOut, idle_tid));
EXPECT_TRUE(CheckTrasition(Type::kActive, real_tid, Type::kWakeUp, real_tid));
EXPECT_TRUE(CheckTrasition(Type::kActive, real_tid, Type::kActive, real_tid));
// tid is not idle for idle events.
EXPECT_FALSE(
CheckTrasition(Type::kIdleIn, idle_tid, Type::kIdleOut, real_tid));
EXPECT_FALSE(
CheckTrasition(Type::kIdleOut, idle_tid, Type::kIdleIn, real_tid));
// tid is idle for wake-up event.
EXPECT_FALSE(
CheckTrasition(Type::kIdleIn, idle_tid, Type::kWakeUp, idle_tid));
}
} // namespace arc
|