Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Side by Side Diff: base/metrics/activity_tracker_unittest.cc

Issue 1980743002: Track thread activities in order to diagnose hangs. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@readwrite-mmf
Patch Set: general improvements and scoped activities Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/metrics/activity_tracker.h"
6
7 #include <memory>
8
9 #include "base/bind.h"
10 #include "base/files/file.h"
11 #include "base/files/file_util.h"
12 #include "base/files/memory_mapped_file.h"
13 #include "base/files/scoped_temp_dir.h"
14 #include "base/memory/ptr_util.h"
15 #include "base/pending_task.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17
18 namespace base {
19
20 namespace {
21
22 class TestActivityTracker : public ThreadActivityTracker {
23 public:
24 TestActivityTracker(std::unique_ptr<char[]> memory, size_t mem_size)
25 : ThreadActivityTracker(memset(memory.get(), 0, mem_size), mem_size),
26 mem_segment_(std::move(memory)) {}
27
28 ~TestActivityTracker() override {
29 delete GlobalActivityTracker::Get();
30 }
31
32 private:
33 std::unique_ptr<char[]> mem_segment_;
34 };
35
36 } // namespace
37
38
39 class ActivityTrackerTest : public testing::Test {
40 public:
41 const int kMemorySize = 1 << 10; // 1KiB
42 const int kStackSize = 256;
43
44 ActivityTrackerTest() {}
45
46 ~ActivityTrackerTest() {}
47
48 std::unique_ptr<ThreadActivityTracker> CreateActivityTracker() {
49 std::unique_ptr<char[]> memory(new char[kStackSize]);
50 return WrapUnique(new TestActivityTracker(std::move(memory), kStackSize));
51 }
52
53 static void DoNothing() {}
54 };
55
56 TEST_F(ActivityTrackerTest, PushPopTest) {
57 std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker();
58 std::vector<ThreadActivityTracker::StackEntry> stack;
59
60 ASSERT_EQ(0U, tracker->CopyStack(&stack));
61 ASSERT_EQ(0U, stack.size());
62
63 char source1;
64 tracker->RecordStart(&source1, ThreadActivityTracker::ACT_TASK, 2, 3);
65 ASSERT_EQ(1U, tracker->CopyStack(&stack));
66 ASSERT_EQ(1U, stack.size());
67 EXPECT_NE(0, stack[0].time_ticks);
68 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[0].activity_type);
69 EXPECT_EQ(reinterpret_cast<intptr_t>(&source1), stack[0].source_address);
70 EXPECT_EQ(2, stack[0].method_address);
71 EXPECT_EQ(3U, stack[0].sequence_id);
72
73 char source2;
74 tracker->RecordStart(&source2, ThreadActivityTracker::ACT_LOCK, 3, 4);
75 ASSERT_EQ(2U, tracker->CopyStack(&stack));
76 ASSERT_EQ(2U, stack.size());
77 EXPECT_LE(stack[0].time_ticks, stack[1].time_ticks);
78 EXPECT_EQ(ThreadActivityTracker::ACT_LOCK, stack[1].activity_type);
79 EXPECT_EQ(reinterpret_cast<intptr_t>(&source2), stack[1].source_address);
80 EXPECT_EQ(3, stack[1].method_address);
81 EXPECT_EQ(4U, stack[1].sequence_id);
82
83 tracker->RecordFinish(&source2);
84 ASSERT_EQ(1U, tracker->CopyStack(&stack));
85 ASSERT_EQ(1U, stack.size());
86 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[0].activity_type);
87 EXPECT_EQ(reinterpret_cast<intptr_t>(&source1), stack[0].source_address);
88 EXPECT_EQ(2, stack[0].method_address);
89 EXPECT_EQ(3U, stack[0].sequence_id);
90
91 tracker->RecordFinish(&source1);
92 ASSERT_EQ(0U, tracker->CopyStack(&stack));
93 ASSERT_EQ(0U, stack.size());
94 }
95
96 TEST_F(ActivityTrackerTest, ScopedTaskTest) {
97 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", kStackSize);
98
99 ThreadActivityTracker* tracker =
100 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
101 std::vector<ThreadActivityTracker::StackEntry> stack;
102
103 ASSERT_EQ(0U, tracker->CopyStack(&stack));
104 ASSERT_EQ(0U, stack.size());
105
106 {
107 PendingTask task1(FROM_HERE, base::Bind(&DoNothing));
108 ScopedTaskActivity activity1(task1);
109
110 ASSERT_EQ(1U, tracker->CopyStack(&stack));
111 ASSERT_EQ(1U, stack.size());
112 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[0].activity_type);
113
114 {
115 PendingTask task2(FROM_HERE, base::Bind(&DoNothing));
116 ScopedTaskActivity activity2(task2);
117
118 ASSERT_EQ(2U, tracker->CopyStack(&stack));
119 ASSERT_EQ(2U, stack.size());
120 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[1].activity_type);
121 }
122
123 ASSERT_EQ(1U, tracker->CopyStack(&stack));
124 ASSERT_EQ(1U, stack.size());
125 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[0].activity_type);
126 }
127
128 ASSERT_EQ(0U, tracker->CopyStack(&stack));
129 ASSERT_EQ(0U, stack.size());
130 }
131
132 } // namespace base
OLDNEW
« base/metrics/activity_tracker.h ('K') | « base/metrics/activity_tracker.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698