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

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

Issue 2511043003: Support for extracting user-data from activity tracking. (Closed)
Patch Set: rebased Created 4 years 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
1 // Copyright 2016 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/debug/activity_tracker.h" 5 #include "base/debug/activity_tracker.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/files/file.h" 10 #include "base/files/file.h"
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 return GlobalActivityTracker::Get()->user_data_allocator_.cache_used(); 84 return GlobalActivityTracker::Get()->user_data_allocator_.cache_used();
85 } 85 }
86 86
87 static void DoNothing() {} 87 static void DoNothing() {}
88 }; 88 };
89 89
90 TEST_F(ActivityTrackerTest, UserDataTest) { 90 TEST_F(ActivityTrackerTest, UserDataTest) {
91 char buffer[256]; 91 char buffer[256];
92 memset(buffer, 0, sizeof(buffer)); 92 memset(buffer, 0, sizeof(buffer));
93 ActivityUserData data(buffer, sizeof(buffer)); 93 ActivityUserData data(buffer, sizeof(buffer));
94 ASSERT_EQ(sizeof(buffer), data.available_); 94 ASSERT_EQ(sizeof(buffer) - 8, data.available_);
95 95
96 data.SetInt("foo", 1); 96 data.SetInt("foo", 1);
97 ASSERT_EQ(sizeof(buffer) - 24, data.available_); 97 ASSERT_EQ(sizeof(buffer) - 8 - 24, data.available_);
98 98
99 data.SetUint("b", 1U); // Small names fit beside header in a word. 99 data.SetUint("b", 1U); // Small names fit beside header in a word.
100 ASSERT_EQ(sizeof(buffer) - 24 - 16, data.available_); 100 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16, data.available_);
101 101
102 data.Set("c", buffer, 10); 102 data.Set("c", buffer, 10);
103 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24, data.available_); 103 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24, data.available_);
104 104
105 data.SetString("dear john", "it's been fun"); 105 data.SetString("dear john", "it's been fun");
106 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32, data.available_); 106 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32, data.available_);
107 107
108 data.Set("c", buffer, 20); 108 data.Set("c", buffer, 20);
109 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32, data.available_); 109 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32, data.available_);
110 110
111 data.SetString("dear john", "but we're done together"); 111 data.SetString("dear john", "but we're done together");
112 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32, data.available_); 112 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32, data.available_);
113 113
114 data.SetString("dear john", "bye"); 114 data.SetString("dear john", "bye");
115 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32, data.available_); 115 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32, data.available_);
116 116
117 data.SetChar("d", 'x'); 117 data.SetChar("d", 'x');
118 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32 - 16, data.available_); 118 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32 - 8, data.available_);
119
120 data.SetBool("ee", true);
121 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32 - 8 - 16, data.available_);
119 } 122 }
120 123
121 TEST_F(ActivityTrackerTest, PushPopTest) { 124 TEST_F(ActivityTrackerTest, PushPopTest) {
122 std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker(); 125 std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker();
123 ActivitySnapshot snapshot; 126 ThreadActivityTracker::Snapshot snapshot;
124 127
125 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 128 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
126 ASSERT_EQ(0U, snapshot.activity_stack_depth); 129 ASSERT_EQ(0U, snapshot.activity_stack_depth);
127 ASSERT_EQ(0U, snapshot.activity_stack.size()); 130 ASSERT_EQ(0U, snapshot.activity_stack.size());
128 131
129 char origin1; 132 char origin1;
130 ActivityId id1 = tracker->PushActivity(&origin1, Activity::ACT_TASK, 133 ActivityId id1 = tracker->PushActivity(&origin1, Activity::ACT_TASK,
131 ActivityData::ForTask(11)); 134 ActivityData::ForTask(11));
132 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 135 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
133 ASSERT_EQ(1U, snapshot.activity_stack_depth); 136 ASSERT_EQ(1U, snapshot.activity_stack_depth);
134 ASSERT_EQ(1U, snapshot.activity_stack.size()); 137 ASSERT_EQ(1U, snapshot.activity_stack.size());
135 EXPECT_NE(0, snapshot.activity_stack[0].time_internal); 138 EXPECT_NE(0, snapshot.activity_stack[0].time_internal);
136 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); 139 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
137 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1), 140 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1),
138 snapshot.activity_stack[0].origin_address); 141 snapshot.activity_stack[0].origin_address);
139 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); 142 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id);
140 143
141 char origin2; 144 char origin2;
142 char lock2; 145 char lock2;
143 ActivityId id2 = tracker->PushActivity(&origin2, Activity::ACT_LOCK, 146 ActivityId id2 = tracker->PushActivity(&origin2, Activity::ACT_LOCK,
144 ActivityData::ForLock(&lock2)); 147 ActivityData::ForLock(&lock2));
145 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 148 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
146 ASSERT_EQ(2U, snapshot.activity_stack_depth); 149 ASSERT_EQ(2U, snapshot.activity_stack_depth);
147 ASSERT_EQ(2U, snapshot.activity_stack.size()); 150 ASSERT_EQ(2U, snapshot.activity_stack.size());
148 EXPECT_LE(snapshot.activity_stack[0].time_internal, 151 EXPECT_LE(snapshot.activity_stack[0].time_internal,
149 snapshot.activity_stack[1].time_internal); 152 snapshot.activity_stack[1].time_internal);
150 EXPECT_EQ(Activity::ACT_LOCK, snapshot.activity_stack[1].activity_type); 153 EXPECT_EQ(Activity::ACT_LOCK, snapshot.activity_stack[1].activity_type);
151 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin2), 154 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin2),
152 snapshot.activity_stack[1].origin_address); 155 snapshot.activity_stack[1].origin_address);
153 EXPECT_EQ(reinterpret_cast<uintptr_t>(&lock2), 156 EXPECT_EQ(reinterpret_cast<uintptr_t>(&lock2),
154 snapshot.activity_stack[1].data.lock.lock_address); 157 snapshot.activity_stack[1].data.lock.lock_address);
155 158
156 tracker->PopActivity(id2); 159 tracker->PopActivity(id2);
157 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 160 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
158 ASSERT_EQ(1U, snapshot.activity_stack_depth); 161 ASSERT_EQ(1U, snapshot.activity_stack_depth);
159 ASSERT_EQ(1U, snapshot.activity_stack.size()); 162 ASSERT_EQ(1U, snapshot.activity_stack.size());
160 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); 163 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
161 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1), 164 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1),
162 snapshot.activity_stack[0].origin_address); 165 snapshot.activity_stack[0].origin_address);
163 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); 166 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id);
164 167
165 tracker->PopActivity(id1); 168 tracker->PopActivity(id1);
166 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 169 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
167 ASSERT_EQ(0U, snapshot.activity_stack_depth); 170 ASSERT_EQ(0U, snapshot.activity_stack_depth);
168 ASSERT_EQ(0U, snapshot.activity_stack.size()); 171 ASSERT_EQ(0U, snapshot.activity_stack.size());
169 } 172 }
170 173
171 TEST_F(ActivityTrackerTest, ScopedTaskTest) { 174 TEST_F(ActivityTrackerTest, ScopedTaskTest) {
172 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); 175 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3);
173 176
174 ThreadActivityTracker* tracker = 177 ThreadActivityTracker* tracker =
175 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); 178 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
176 ActivitySnapshot snapshot; 179 ThreadActivityTracker::Snapshot snapshot;
177 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); 180 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed());
178 181
179 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 182 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
180 ASSERT_EQ(0U, snapshot.activity_stack_depth); 183 ASSERT_EQ(0U, snapshot.activity_stack_depth);
181 ASSERT_EQ(0U, snapshot.activity_stack.size()); 184 ASSERT_EQ(0U, snapshot.activity_stack.size());
182 185
183 { 186 {
184 PendingTask task1(FROM_HERE, base::Bind(&DoNothing)); 187 PendingTask task1(FROM_HERE, base::Bind(&DoNothing));
185 ScopedTaskRunActivity activity1(task1); 188 ScopedTaskRunActivity activity1(task1);
186 ActivityUserData& user_data1 = activity1.user_data(); 189 ActivityUserData& user_data1 = activity1.user_data();
187 (void)user_data1; // Tell compiler it's been used. 190 (void)user_data1; // Tell compiler it's been used.
188 191
189 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 192 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
190 ASSERT_EQ(1U, snapshot.activity_stack_depth); 193 ASSERT_EQ(1U, snapshot.activity_stack_depth);
191 ASSERT_EQ(1U, snapshot.activity_stack.size()); 194 ASSERT_EQ(1U, snapshot.activity_stack.size());
192 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); 195 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
193 196
194 { 197 {
195 PendingTask task2(FROM_HERE, base::Bind(&DoNothing)); 198 PendingTask task2(FROM_HERE, base::Bind(&DoNothing));
196 ScopedTaskRunActivity activity2(task2); 199 ScopedTaskRunActivity activity2(task2);
197 ActivityUserData& user_data2 = activity2.user_data(); 200 ActivityUserData& user_data2 = activity2.user_data();
198 (void)user_data2; // Tell compiler it's been used. 201 (void)user_data2; // Tell compiler it's been used.
199 202
200 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 203 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
201 ASSERT_EQ(2U, snapshot.activity_stack_depth); 204 ASSERT_EQ(2U, snapshot.activity_stack_depth);
202 ASSERT_EQ(2U, snapshot.activity_stack.size()); 205 ASSERT_EQ(2U, snapshot.activity_stack.size());
203 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[1].activity_type); 206 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[1].activity_type);
204 } 207 }
205 208
206 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 209 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
207 ASSERT_EQ(1U, snapshot.activity_stack_depth); 210 ASSERT_EQ(1U, snapshot.activity_stack_depth);
208 ASSERT_EQ(1U, snapshot.activity_stack.size()); 211 ASSERT_EQ(1U, snapshot.activity_stack.size());
209 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); 212 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
210 } 213 }
211 214
212 ASSERT_TRUE(tracker->Snapshot(&snapshot)); 215 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
213 ASSERT_EQ(0U, snapshot.activity_stack_depth); 216 ASSERT_EQ(0U, snapshot.activity_stack_depth);
214 ASSERT_EQ(0U, snapshot.activity_stack.size()); 217 ASSERT_EQ(0U, snapshot.activity_stack.size());
215 ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed()); 218 ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed());
216 } 219 }
217 220
218 TEST_F(ActivityTrackerTest, CreateWithFileTest) { 221 TEST_F(ActivityTrackerTest, CreateWithFileTest) {
219 const char temp_name[] = "CreateWithFileTest"; 222 const char temp_name[] = "CreateWithFileTest";
220 ScopedTempDir temp_dir; 223 ScopedTempDir temp_dir;
221 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 224 ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
222 FilePath temp_file = temp_dir.GetPath().AppendASCII(temp_name); 225 FilePath temp_file = temp_dir.GetPath().AppendASCII(temp_name);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount()); 327 EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount());
325 328
326 t2.Exit(); 329 t2.Exit();
327 t2.Join(); 330 t2.Join();
328 EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount()); 331 EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount());
329 EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount()); 332 EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount());
330 } 333 }
331 334
332 } // namespace debug 335 } // namespace debug
333 } // namespace base 336 } // namespace base
OLDNEW
« no previous file with comments | « base/debug/activity_tracker.cc ('k') | components/browser_watcher/postmortem_report_collector.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698