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

Side by Side Diff: base/tracked_objects_unittest.cc

Issue 445413003: Creating a framework for suppressing pollution of the profiler data (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixing unit tests again. Created 6 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « base/tracked_objects.cc ('k') | content/browser/gpu/browser_gpu_channel_host_factory.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 // Test of classes in the tracked_objects.h classes. 5 // Test of classes in the tracked_objects.h classes.
6 6
7 #include "base/tracked_objects.h" 7 #include "base/tracked_objects.h"
8 8
9 #include <stddef.h> 9 #include <stddef.h>
10 10
(...skipping 10 matching lines...) Expand all
21 const char kStillAlive[] = "Still_Alive"; 21 const char kStillAlive[] = "Still_Alive";
22 22
23 namespace tracked_objects { 23 namespace tracked_objects {
24 24
25 class TrackedObjectsTest : public testing::Test { 25 class TrackedObjectsTest : public testing::Test {
26 protected: 26 protected:
27 TrackedObjectsTest() { 27 TrackedObjectsTest() {
28 // On entry, leak any database structures in case they are still in use by 28 // On entry, leak any database structures in case they are still in use by
29 // prior threads. 29 // prior threads.
30 ThreadData::ShutdownSingleThreadedCleanup(true); 30 ThreadData::ShutdownSingleThreadedCleanup(true);
31
32 test_time_ = 0;
33 ThreadData::SetAlternateTimeSource(&TrackedObjectsTest::GetTestTime);
34 ThreadData::now_function_is_time_ = true;
31 } 35 }
32 36
33 virtual ~TrackedObjectsTest() { 37 virtual ~TrackedObjectsTest() {
34 // We should not need to leak any structures we create, since we are 38 // We should not need to leak any structures we create, since we are
35 // single threaded, and carefully accounting for items. 39 // single threaded, and carefully accounting for items.
36 ThreadData::ShutdownSingleThreadedCleanup(false); 40 ThreadData::ShutdownSingleThreadedCleanup(false);
37 } 41 }
38 42
39 // Reset the profiler state. 43 // Reset the profiler state.
40 void Reset() { 44 void Reset() {
41 ThreadData::ShutdownSingleThreadedCleanup(false); 45 ThreadData::ShutdownSingleThreadedCleanup(false);
46 test_time_ = 0;
42 } 47 }
43 48
44 // Simulate a birth on the thread named |thread_name|, at the given 49 // Simulate a birth on the thread named |thread_name|, at the given
45 // |location|. 50 // |location|.
46 void TallyABirth(const Location& location, const std::string& thread_name) { 51 void TallyABirth(const Location& location, const std::string& thread_name) {
47 // If the |thread_name| is empty, we don't initialize system with a thread 52 // If the |thread_name| is empty, we don't initialize system with a thread
48 // name, so we're viewed as a worker thread. 53 // name, so we're viewed as a worker thread.
49 if (!thread_name.empty()) 54 if (!thread_name.empty())
50 ThreadData::InitializeThreadContext(kMainThreadName); 55 ThreadData::InitializeThreadContext(kMainThreadName);
51 56
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 process_data.tasks[0].death_data.queue_duration_sum); 89 process_data.tasks[0].death_data.queue_duration_sum);
85 EXPECT_EQ(queue_ms, process_data.tasks[0].death_data.queue_duration_max); 90 EXPECT_EQ(queue_ms, process_data.tasks[0].death_data.queue_duration_max);
86 EXPECT_EQ(queue_ms, process_data.tasks[0].death_data.queue_duration_sample); 91 EXPECT_EQ(queue_ms, process_data.tasks[0].death_data.queue_duration_sample);
87 92
88 EXPECT_EQ(death_thread, process_data.tasks[0].death_thread_name); 93 EXPECT_EQ(death_thread, process_data.tasks[0].death_thread_name);
89 94
90 EXPECT_EQ(0u, process_data.descendants.size()); 95 EXPECT_EQ(0u, process_data.descendants.size());
91 96
92 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 97 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
93 } 98 }
99
100 // Sets time that will be returned by ThreadData::Now().
101 static void SetTestTime(unsigned int test_time) { test_time_ = test_time; }
102
103 private:
104 // Returns test time in milliseconds.
105 static unsigned int GetTestTime() { return test_time_; }
106
107 // Test time in milliseconds.
108 static unsigned int test_time_;
94 }; 109 };
95 110
111 // static
112 unsigned int TrackedObjectsTest::test_time_;
113
114
96 TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { 115 TEST_F(TrackedObjectsTest, MinimalStartupShutdown) {
97 // Minimal test doesn't even create any tasks. 116 // Minimal test doesn't even create any tasks.
98 if (!ThreadData::InitializeAndSetTrackingStatus( 117 if (!ThreadData::InitializeAndSetTrackingStatus(
99 ThreadData::PROFILING_CHILDREN_ACTIVE)) 118 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
100 return; 119 return;
120 }
101 121
102 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 122 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread.
103 ThreadData* data = ThreadData::Get(); 123 ThreadData* data = ThreadData::Get();
104 EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 124 EXPECT_TRUE(ThreadData::first()); // Now class was constructed.
105 ASSERT_TRUE(data); 125 ASSERT_TRUE(data);
106 EXPECT_FALSE(data->next()); 126 EXPECT_FALSE(data->next());
107 EXPECT_EQ(data, ThreadData::Get()); 127 EXPECT_EQ(data, ThreadData::Get());
108 ThreadData::BirthMap birth_map; 128 ThreadData::BirthMap birth_map;
109 ThreadData::DeathMap death_map; 129 ThreadData::DeathMap death_map;
110 ThreadData::ParentChildSet parent_child_set; 130 ThreadData::ParentChildSet parent_child_set;
(...skipping 18 matching lines...) Expand all
129 death_map.clear(); 149 death_map.clear();
130 parent_child_set.clear(); 150 parent_child_set.clear();
131 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 151 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set);
132 EXPECT_EQ(0u, birth_map.size()); 152 EXPECT_EQ(0u, birth_map.size());
133 EXPECT_EQ(0u, death_map.size()); 153 EXPECT_EQ(0u, death_map.size());
134 EXPECT_EQ(0u, parent_child_set.size()); 154 EXPECT_EQ(0u, parent_child_set.size());
135 } 155 }
136 156
137 TEST_F(TrackedObjectsTest, TinyStartupShutdown) { 157 TEST_F(TrackedObjectsTest, TinyStartupShutdown) {
138 if (!ThreadData::InitializeAndSetTrackingStatus( 158 if (!ThreadData::InitializeAndSetTrackingStatus(
139 ThreadData::PROFILING_CHILDREN_ACTIVE)) 159 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
140 return; 160 return;
161 }
141 162
142 // Instigate tracking on a single tracked object, on our thread. 163 // Instigate tracking on a single tracked object, on our thread.
143 const char kFunction[] = "TinyStartupShutdown"; 164 const char kFunction[] = "TinyStartupShutdown";
144 Location location(kFunction, kFile, kLineNumber, NULL); 165 Location location(kFunction, kFile, kLineNumber, NULL);
145 Births* first_birth = ThreadData::TallyABirthIfActive(location); 166 Births* first_birth = ThreadData::TallyABirthIfActive(location);
146 167
147 ThreadData* data = ThreadData::first(); 168 ThreadData* data = ThreadData::first();
148 ASSERT_TRUE(data); 169 ASSERT_TRUE(data);
149 EXPECT_FALSE(data->next()); 170 EXPECT_FALSE(data->next());
150 EXPECT_EQ(data, ThreadData::Get()); 171 EXPECT_EQ(data, ThreadData::Get());
151 ThreadData::BirthMap birth_map; 172 ThreadData::BirthMap birth_map;
152 ThreadData::DeathMap death_map; 173 ThreadData::DeathMap death_map;
153 ThreadData::ParentChildSet parent_child_set; 174 ThreadData::ParentChildSet parent_child_set;
154 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 175 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set);
155 EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 176 EXPECT_EQ(1u, birth_map.size()); // 1 birth location.
156 EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth. 177 EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth.
157 EXPECT_EQ(0u, death_map.size()); // No deaths. 178 EXPECT_EQ(0u, death_map.size()); // No deaths.
158 EXPECT_EQ(0u, parent_child_set.size()); // No children. 179 EXPECT_EQ(0u, parent_child_set.size()); // No children.
159 180
160 181
161 // Now instigate another birth, while we are timing the run of the first 182 // Now instigate another birth, while we are timing the run of the first
162 // execution. 183 // execution.
163 ThreadData::NowForStartOfRun(first_birth); 184 ThreadData::PrepareForStartOfRun(first_birth);
164 // Create a child (using the same birth location). 185 // Create a child (using the same birth location).
165 // TrackingInfo will call TallyABirth() during construction. 186 // TrackingInfo will call TallyABirth() during construction.
166 base::TimeTicks kBogusBirthTime; 187 const int32 start_time = 1;
188 base::TimeTicks kBogusBirthTime = base::TimeTicks() +
189 base::TimeDelta::FromMilliseconds(start_time);
167 base::TrackingInfo pending_task(location, kBogusBirthTime); 190 base::TrackingInfo pending_task(location, kBogusBirthTime);
168 TrackedTime start_time(pending_task.time_posted); 191 SetTestTime(1);
192 TaskStopwatch stopwatch;
169 // Finally conclude the outer run. 193 // Finally conclude the outer run.
170 TrackedTime end_time = ThreadData::NowForEndOfRun(); 194 const int32 time_elapsed = 1000;
171 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, start_time, 195 SetTestTime(start_time + time_elapsed);
172 end_time); 196 stopwatch.Stop();
197
198 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch);
173 199
174 birth_map.clear(); 200 birth_map.clear();
175 death_map.clear(); 201 death_map.clear();
176 parent_child_set.clear(); 202 parent_child_set.clear();
177 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 203 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set);
178 EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 204 EXPECT_EQ(1u, birth_map.size()); // 1 birth location.
179 EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. 205 EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births.
180 EXPECT_EQ(1u, death_map.size()); // 1 location. 206 EXPECT_EQ(1u, death_map.size()); // 1 location.
181 EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death. 207 EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death.
182 if (ThreadData::TrackingParentChildStatus()) { 208 if (ThreadData::TrackingParentChildStatus()) {
183 EXPECT_EQ(1u, parent_child_set.size()); // 1 child. 209 EXPECT_EQ(1u, parent_child_set.size()); // 1 child.
184 EXPECT_EQ(parent_child_set.begin()->first, 210 EXPECT_EQ(parent_child_set.begin()->first,
185 parent_child_set.begin()->second); 211 parent_child_set.begin()->second);
186 } else { 212 } else {
187 EXPECT_EQ(0u, parent_child_set.size()); // no stats. 213 EXPECT_EQ(0u, parent_child_set.size()); // no stats.
188 } 214 }
189 215
190 // The births were at the same location as the one known death. 216 // The births were at the same location as the one known death.
191 EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first); 217 EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first);
192 218
193 ProcessDataSnapshot process_data; 219 ProcessDataSnapshot process_data;
194 ThreadData::Snapshot(false, &process_data); 220 ThreadData::Snapshot(false, &process_data);
195 221
196 const int32 time_elapsed = (end_time - start_time).InMilliseconds();
197 ASSERT_EQ(1u, process_data.tasks.size()); 222 ASSERT_EQ(1u, process_data.tasks.size());
198 EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); 223 EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name);
199 EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); 224 EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name);
200 EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); 225 EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number);
201 EXPECT_EQ(kWorkerThreadName, process_data.tasks[0].birth.thread_name); 226 EXPECT_EQ(kWorkerThreadName, process_data.tasks[0].birth.thread_name);
202 EXPECT_EQ(1, process_data.tasks[0].death_data.count); 227 EXPECT_EQ(1, process_data.tasks[0].death_data.count);
203 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sum); 228 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sum);
204 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_max); 229 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_max);
205 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sample); 230 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sample);
206 EXPECT_EQ(0, process_data.tasks[0].death_data.queue_duration_sum); 231 EXPECT_EQ(0, process_data.tasks[0].death_data.queue_duration_sum);
(...skipping 16 matching lines...) Expand all
223 EXPECT_EQ(kLineNumber, 248 EXPECT_EQ(kLineNumber,
224 process_data.descendants[0].child.location.line_number); 249 process_data.descendants[0].child.location.line_number);
225 EXPECT_EQ(kWorkerThreadName, process_data.descendants[0].child.thread_name); 250 EXPECT_EQ(kWorkerThreadName, process_data.descendants[0].child.thread_name);
226 } else { 251 } else {
227 EXPECT_EQ(0u, process_data.descendants.size()); 252 EXPECT_EQ(0u, process_data.descendants.size());
228 } 253 }
229 } 254 }
230 255
231 TEST_F(TrackedObjectsTest, DeathDataTest) { 256 TEST_F(TrackedObjectsTest, DeathDataTest) {
232 if (!ThreadData::InitializeAndSetTrackingStatus( 257 if (!ThreadData::InitializeAndSetTrackingStatus(
233 ThreadData::PROFILING_CHILDREN_ACTIVE)) 258 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
234 return; 259 return;
260 }
235 261
236 scoped_ptr<DeathData> data(new DeathData()); 262 scoped_ptr<DeathData> data(new DeathData());
237 ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL)); 263 ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL));
238 EXPECT_EQ(data->run_duration_sum(), 0); 264 EXPECT_EQ(data->run_duration_sum(), 0);
239 EXPECT_EQ(data->run_duration_sample(), 0); 265 EXPECT_EQ(data->run_duration_sample(), 0);
240 EXPECT_EQ(data->queue_duration_sum(), 0); 266 EXPECT_EQ(data->queue_duration_sum(), 0);
241 EXPECT_EQ(data->queue_duration_sample(), 0); 267 EXPECT_EQ(data->queue_duration_sample(), 0);
242 EXPECT_EQ(data->count(), 0); 268 EXPECT_EQ(data->count(), 0);
243 269
244 int32 run_ms = 42; 270 int32 run_ms = 42;
(...skipping 19 matching lines...) Expand all
264 EXPECT_EQ(2 * run_ms, snapshot.run_duration_sum); 290 EXPECT_EQ(2 * run_ms, snapshot.run_duration_sum);
265 EXPECT_EQ(run_ms, snapshot.run_duration_max); 291 EXPECT_EQ(run_ms, snapshot.run_duration_max);
266 EXPECT_EQ(run_ms, snapshot.run_duration_sample); 292 EXPECT_EQ(run_ms, snapshot.run_duration_sample);
267 EXPECT_EQ(2 * queue_ms, snapshot.queue_duration_sum); 293 EXPECT_EQ(2 * queue_ms, snapshot.queue_duration_sum);
268 EXPECT_EQ(queue_ms, snapshot.queue_duration_max); 294 EXPECT_EQ(queue_ms, snapshot.queue_duration_max);
269 EXPECT_EQ(queue_ms, snapshot.queue_duration_sample); 295 EXPECT_EQ(queue_ms, snapshot.queue_duration_sample);
270 } 296 }
271 297
272 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotWorkerThread) { 298 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotWorkerThread) {
273 // Start in the deactivated state. 299 // Start in the deactivated state.
274 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) 300 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) {
275 return; 301 return;
302 }
276 303
277 const char kFunction[] = "DeactivatedBirthOnlyToSnapshotWorkerThread"; 304 const char kFunction[] = "DeactivatedBirthOnlyToSnapshotWorkerThread";
278 Location location(kFunction, kFile, kLineNumber, NULL); 305 Location location(kFunction, kFile, kLineNumber, NULL);
279 TallyABirth(location, std::string()); 306 TallyABirth(location, std::string());
280 307
281 ProcessDataSnapshot process_data; 308 ProcessDataSnapshot process_data;
282 ThreadData::Snapshot(false, &process_data); 309 ThreadData::Snapshot(false, &process_data);
283 EXPECT_EQ(0u, process_data.tasks.size()); 310 EXPECT_EQ(0u, process_data.tasks.size());
284 EXPECT_EQ(0u, process_data.descendants.size()); 311 EXPECT_EQ(0u, process_data.descendants.size());
285 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 312 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
286 } 313 }
287 314
288 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotMainThread) { 315 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotMainThread) {
289 // Start in the deactivated state. 316 // Start in the deactivated state.
290 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) 317 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) {
291 return; 318 return;
319 }
292 320
293 const char kFunction[] = "DeactivatedBirthOnlyToSnapshotMainThread"; 321 const char kFunction[] = "DeactivatedBirthOnlyToSnapshotMainThread";
294 Location location(kFunction, kFile, kLineNumber, NULL); 322 Location location(kFunction, kFile, kLineNumber, NULL);
295 TallyABirth(location, kMainThreadName); 323 TallyABirth(location, kMainThreadName);
296 324
297 ProcessDataSnapshot process_data; 325 ProcessDataSnapshot process_data;
298 ThreadData::Snapshot(false, &process_data); 326 ThreadData::Snapshot(false, &process_data);
299 EXPECT_EQ(0u, process_data.tasks.size()); 327 EXPECT_EQ(0u, process_data.tasks.size());
300 EXPECT_EQ(0u, process_data.descendants.size()); 328 EXPECT_EQ(0u, process_data.descendants.size());
301 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 329 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
302 } 330 }
303 331
304 TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotWorkerThread) { 332 TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotWorkerThread) {
305 if (!ThreadData::InitializeAndSetTrackingStatus( 333 if (!ThreadData::InitializeAndSetTrackingStatus(
306 ThreadData::PROFILING_CHILDREN_ACTIVE)) 334 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
307 return; 335 return;
336 }
308 337
309 const char kFunction[] = "BirthOnlyToSnapshotWorkerThread"; 338 const char kFunction[] = "BirthOnlyToSnapshotWorkerThread";
310 Location location(kFunction, kFile, kLineNumber, NULL); 339 Location location(kFunction, kFile, kLineNumber, NULL);
311 TallyABirth(location, std::string()); 340 TallyABirth(location, std::string());
312 341
313 ProcessDataSnapshot process_data; 342 ProcessDataSnapshot process_data;
314 ThreadData::Snapshot(false, &process_data); 343 ThreadData::Snapshot(false, &process_data);
315 ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 344 ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName,
316 kStillAlive, 1, 0, 0); 345 kStillAlive, 1, 0, 0);
317 } 346 }
318 347
319 TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotMainThread) { 348 TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotMainThread) {
320 if (!ThreadData::InitializeAndSetTrackingStatus( 349 if (!ThreadData::InitializeAndSetTrackingStatus(
321 ThreadData::PROFILING_CHILDREN_ACTIVE)) 350 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
322 return; 351 return;
352 }
323 353
324 const char kFunction[] = "BirthOnlyToSnapshotMainThread"; 354 const char kFunction[] = "BirthOnlyToSnapshotMainThread";
325 Location location(kFunction, kFile, kLineNumber, NULL); 355 Location location(kFunction, kFile, kLineNumber, NULL);
326 TallyABirth(location, kMainThreadName); 356 TallyABirth(location, kMainThreadName);
327 357
328 ProcessDataSnapshot process_data; 358 ProcessDataSnapshot process_data;
329 ThreadData::Snapshot(false, &process_data); 359 ThreadData::Snapshot(false, &process_data);
330 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, kStillAlive, 360 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, kStillAlive,
331 1, 0, 0); 361 1, 0, 0);
332 } 362 }
333 363
334 TEST_F(TrackedObjectsTest, LifeCycleToSnapshotMainThread) { 364 TEST_F(TrackedObjectsTest, LifeCycleToSnapshotMainThread) {
335 if (!ThreadData::InitializeAndSetTrackingStatus( 365 if (!ThreadData::InitializeAndSetTrackingStatus(
336 ThreadData::PROFILING_CHILDREN_ACTIVE)) 366 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
337 return; 367 return;
368 }
338 369
339 const char kFunction[] = "LifeCycleToSnapshotMainThread"; 370 const char kFunction[] = "LifeCycleToSnapshotMainThread";
340 Location location(kFunction, kFile, kLineNumber, NULL); 371 Location location(kFunction, kFile, kLineNumber, NULL);
341 TallyABirth(location, kMainThreadName); 372 TallyABirth(location, kMainThreadName);
342 373
343 const base::TimeTicks kTimePosted = base::TimeTicks() + 374 const base::TimeTicks kTimePosted = base::TimeTicks() +
344 base::TimeDelta::FromMilliseconds(1); 375 base::TimeDelta::FromMilliseconds(1);
345 const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 376 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
346 // TrackingInfo will call TallyABirth() during construction. 377 // TrackingInfo will call TallyABirth() during construction.
347 base::TrackingInfo pending_task(location, kDelayedStartTime); 378 base::TrackingInfo pending_task(location, kDelayedStartTime);
348 pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 379 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
349 380
350 const TrackedTime kStartOfRun = TrackedTime() + 381 const unsigned int kStartOfRun = 5;
351 Duration::FromMilliseconds(5); 382 const unsigned int kEndOfRun = 7;
352 const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 383 SetTestTime(kStartOfRun);
353 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 384 TaskStopwatch stopwatch;
354 kStartOfRun, kEndOfRun); 385 SetTestTime(kEndOfRun);
386 stopwatch.Stop();
387
388 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch);
355 389
356 ProcessDataSnapshot process_data; 390 ProcessDataSnapshot process_data;
357 ThreadData::Snapshot(false, &process_data); 391 ThreadData::Snapshot(false, &process_data);
358 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 392 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName,
359 kMainThreadName, 1, 2, 4); 393 kMainThreadName, 1, 2, 4);
360 } 394 }
361 395
362 // We will deactivate tracking after the birth, and before the death, and 396 // We will deactivate tracking after the birth, and before the death, and
363 // demonstrate that the lifecycle is completely tallied. This ensures that 397 // demonstrate that the lifecycle is completely tallied. This ensures that
364 // our tallied births are matched by tallied deaths (except for when the 398 // our tallied births are matched by tallied deaths (except for when the
365 // task is still running, or is queued). 399 // task is still running, or is queued).
366 TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToSnapshotMainThread) { 400 TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToSnapshotMainThread) {
367 if (!ThreadData::InitializeAndSetTrackingStatus( 401 if (!ThreadData::InitializeAndSetTrackingStatus(
368 ThreadData::PROFILING_CHILDREN_ACTIVE)) 402 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
369 return; 403 return;
404 }
370 405
371 const char kFunction[] = "LifeCycleMidDeactivatedToSnapshotMainThread"; 406 const char kFunction[] = "LifeCycleMidDeactivatedToSnapshotMainThread";
372 Location location(kFunction, kFile, kLineNumber, NULL); 407 Location location(kFunction, kFile, kLineNumber, NULL);
373 TallyABirth(location, kMainThreadName); 408 TallyABirth(location, kMainThreadName);
374 409
375 const base::TimeTicks kTimePosted = base::TimeTicks() + 410 const base::TimeTicks kTimePosted = base::TimeTicks() +
376 base::TimeDelta::FromMilliseconds(1); 411 base::TimeDelta::FromMilliseconds(1);
377 const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 412 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
378 // TrackingInfo will call TallyABirth() during construction. 413 // TrackingInfo will call TallyABirth() during construction.
379 base::TrackingInfo pending_task(location, kDelayedStartTime); 414 base::TrackingInfo pending_task(location, kDelayedStartTime);
380 pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 415 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
381 416
382 // Turn off tracking now that we have births. 417 // Turn off tracking now that we have births.
383 EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus( 418 EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus(
384 ThreadData::DEACTIVATED)); 419 ThreadData::DEACTIVATED));
385 420
386 const TrackedTime kStartOfRun = TrackedTime() + 421 const unsigned int kStartOfRun = 5;
387 Duration::FromMilliseconds(5); 422 const unsigned int kEndOfRun = 7;
388 const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 423 SetTestTime(kStartOfRun);
389 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 424 TaskStopwatch stopwatch;
390 kStartOfRun, kEndOfRun); 425 SetTestTime(kEndOfRun);
426 stopwatch.Stop();
427
428 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch);
391 429
392 ProcessDataSnapshot process_data; 430 ProcessDataSnapshot process_data;
393 ThreadData::Snapshot(false, &process_data); 431 ThreadData::Snapshot(false, &process_data);
394 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 432 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName,
395 kMainThreadName, 1, 2, 4); 433 kMainThreadName, 1, 2, 4);
396 } 434 }
397 435
398 // We will deactivate tracking before starting a life cycle, and neither 436 // We will deactivate tracking before starting a life cycle, and neither
399 // the birth nor the death will be recorded. 437 // the birth nor the death will be recorded.
400 TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToSnapshotMainThread) { 438 TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToSnapshotMainThread) {
401 // Start in the deactivated state. 439 // Start in the deactivated state.
402 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) 440 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) {
403 return; 441 return;
442 }
404 443
405 const char kFunction[] = "LifeCyclePreDeactivatedToSnapshotMainThread"; 444 const char kFunction[] = "LifeCyclePreDeactivatedToSnapshotMainThread";
406 Location location(kFunction, kFile, kLineNumber, NULL); 445 Location location(kFunction, kFile, kLineNumber, NULL);
407 TallyABirth(location, kMainThreadName); 446 TallyABirth(location, kMainThreadName);
408 447
409 const base::TimeTicks kTimePosted = base::TimeTicks() + 448 const base::TimeTicks kTimePosted = base::TimeTicks() +
410 base::TimeDelta::FromMilliseconds(1); 449 base::TimeDelta::FromMilliseconds(1);
411 const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 450 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
412 // TrackingInfo will call TallyABirth() during construction. 451 // TrackingInfo will call TallyABirth() during construction.
413 base::TrackingInfo pending_task(location, kDelayedStartTime); 452 base::TrackingInfo pending_task(location, kDelayedStartTime);
414 pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 453 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
415 454
416 const TrackedTime kStartOfRun = TrackedTime() + 455 const unsigned int kStartOfRun = 5;
417 Duration::FromMilliseconds(5); 456 const unsigned int kEndOfRun = 7;
418 const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 457 SetTestTime(kStartOfRun);
419 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 458 TaskStopwatch stopwatch;
420 kStartOfRun, kEndOfRun); 459 SetTestTime(kEndOfRun);
460 stopwatch.Stop();
461
462 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch);
421 463
422 ProcessDataSnapshot process_data; 464 ProcessDataSnapshot process_data;
423 ThreadData::Snapshot(false, &process_data); 465 ThreadData::Snapshot(false, &process_data);
424 EXPECT_EQ(0u, process_data.tasks.size()); 466 EXPECT_EQ(0u, process_data.tasks.size());
425 EXPECT_EQ(0u, process_data.descendants.size()); 467 EXPECT_EQ(0u, process_data.descendants.size());
426 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 468 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
427 } 469 }
428 470
429 TEST_F(TrackedObjectsTest, LifeCycleToSnapshotWorkerThread) { 471 TEST_F(TrackedObjectsTest, LifeCycleToSnapshotWorkerThread) {
430 if (!ThreadData::InitializeAndSetTrackingStatus( 472 if (!ThreadData::InitializeAndSetTrackingStatus(
431 ThreadData::PROFILING_CHILDREN_ACTIVE)) 473 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
432 return; 474 return;
475 }
433 476
434 const char kFunction[] = "LifeCycleToSnapshotWorkerThread"; 477 const char kFunction[] = "LifeCycleToSnapshotWorkerThread";
435 Location location(kFunction, kFile, kLineNumber, NULL); 478 Location location(kFunction, kFile, kLineNumber, NULL);
436 // Do not delete |birth|. We don't own it. 479 // Do not delete |birth|. We don't own it.
437 Births* birth = ThreadData::TallyABirthIfActive(location); 480 Births* birth = ThreadData::TallyABirthIfActive(location);
438 EXPECT_NE(reinterpret_cast<Births*>(NULL), birth); 481 EXPECT_NE(reinterpret_cast<Births*>(NULL), birth);
439 482
440 const TrackedTime kTimePosted = TrackedTime() + Duration::FromMilliseconds(1); 483 const unsigned int kTimePosted = 1;
441 const TrackedTime kStartOfRun = TrackedTime() + 484 const unsigned int kStartOfRun = 5;
442 Duration::FromMilliseconds(5); 485 const unsigned int kEndOfRun = 7;
443 const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 486 SetTestTime(kStartOfRun);
444 ThreadData::TallyRunOnWorkerThreadIfTracking(birth, kTimePosted, 487 TaskStopwatch stopwatch;
445 kStartOfRun, kEndOfRun); 488 SetTestTime(kEndOfRun);
489 stopwatch.Stop();
490
491 ThreadData::TallyRunOnWorkerThreadIfTracking(
492 birth, TrackedTime() + Duration::FromMilliseconds(kTimePosted), stopwatch);
446 493
447 // Call for the ToSnapshot, but tell it to not reset the maxes after scanning. 494 // Call for the ToSnapshot, but tell it to not reset the maxes after scanning.
448 ProcessDataSnapshot process_data; 495 ProcessDataSnapshot process_data;
449 ThreadData::Snapshot(false, &process_data); 496 ThreadData::Snapshot(false, &process_data);
450 ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, 497 ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName,
451 kWorkerThreadName, 1, 2, 4); 498 kWorkerThreadName, 1, 2, 4);
452 499
453 // Call for the ToSnapshot, but tell it to reset the maxes after scanning. 500 // Call for the ToSnapshot, but tell it to reset the maxes after scanning.
454 // We'll still get the same values, but the data will be reset (which we'll 501 // We'll still get the same values, but the data will be reset (which we'll
455 // see in a moment). 502 // see in a moment).
(...skipping 23 matching lines...) Expand all
479 EXPECT_EQ(4, 526 EXPECT_EQ(4,
480 process_data_post_reset.tasks[0].death_data.queue_duration_sample); 527 process_data_post_reset.tasks[0].death_data.queue_duration_sample);
481 EXPECT_EQ(kWorkerThreadName, 528 EXPECT_EQ(kWorkerThreadName,
482 process_data_post_reset.tasks[0].death_thread_name); 529 process_data_post_reset.tasks[0].death_thread_name);
483 EXPECT_EQ(0u, process_data_post_reset.descendants.size()); 530 EXPECT_EQ(0u, process_data_post_reset.descendants.size());
484 EXPECT_EQ(base::GetCurrentProcId(), process_data_post_reset.process_id); 531 EXPECT_EQ(base::GetCurrentProcId(), process_data_post_reset.process_id);
485 } 532 }
486 533
487 TEST_F(TrackedObjectsTest, TwoLives) { 534 TEST_F(TrackedObjectsTest, TwoLives) {
488 if (!ThreadData::InitializeAndSetTrackingStatus( 535 if (!ThreadData::InitializeAndSetTrackingStatus(
489 ThreadData::PROFILING_CHILDREN_ACTIVE)) 536 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
490 return; 537 return;
538 }
491 539
492 const char kFunction[] = "TwoLives"; 540 const char kFunction[] = "TwoLives";
493 Location location(kFunction, kFile, kLineNumber, NULL); 541 Location location(kFunction, kFile, kLineNumber, NULL);
494 TallyABirth(location, kMainThreadName); 542 TallyABirth(location, kMainThreadName);
495 543
496 const base::TimeTicks kTimePosted = base::TimeTicks() + 544 const base::TimeTicks kTimePosted = base::TimeTicks() +
497 base::TimeDelta::FromMilliseconds(1); 545 base::TimeDelta::FromMilliseconds(1);
498 const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 546 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
499 // TrackingInfo will call TallyABirth() during construction. 547 // TrackingInfo will call TallyABirth() during construction.
500 base::TrackingInfo pending_task(location, kDelayedStartTime); 548 base::TrackingInfo pending_task(location, kDelayedStartTime);
501 pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 549 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
502 550
503 const TrackedTime kStartOfRun = TrackedTime() + 551 const unsigned int kStartOfRun = 5;
504 Duration::FromMilliseconds(5); 552 const unsigned int kEndOfRun = 7;
505 const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 553 SetTestTime(kStartOfRun);
506 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 554 TaskStopwatch stopwatch;
507 kStartOfRun, kEndOfRun); 555 SetTestTime(kEndOfRun);
556 stopwatch.Stop();
557
558 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch);
508 559
509 // TrackingInfo will call TallyABirth() during construction. 560 // TrackingInfo will call TallyABirth() during construction.
510 base::TrackingInfo pending_task2(location, kDelayedStartTime); 561 base::TrackingInfo pending_task2(location, kDelayedStartTime);
511 pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). 562 pending_task2.time_posted = kTimePosted; // Overwrite implied Now().
563 SetTestTime(kStartOfRun);
564 TaskStopwatch stopwatch2;
565 SetTestTime(kEndOfRun);
566 stopwatch2.Stop();
512 567
513 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2, 568 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2, stopwatch2);
514 kStartOfRun, kEndOfRun);
515 569
516 ProcessDataSnapshot process_data; 570 ProcessDataSnapshot process_data;
517 ThreadData::Snapshot(false, &process_data); 571 ThreadData::Snapshot(false, &process_data);
518 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, 572 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName,
519 kMainThreadName, 2, 2, 4); 573 kMainThreadName, 2, 2, 4);
520 } 574 }
521 575
522 TEST_F(TrackedObjectsTest, DifferentLives) { 576 TEST_F(TrackedObjectsTest, DifferentLives) {
523 if (!ThreadData::InitializeAndSetTrackingStatus( 577 if (!ThreadData::InitializeAndSetTrackingStatus(
524 ThreadData::PROFILING_CHILDREN_ACTIVE)) 578 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
525 return; 579 return;
580 }
526 581
527 // Use a well named thread. 582 // Use a well named thread.
528 ThreadData::InitializeThreadContext(kMainThreadName); 583 ThreadData::InitializeThreadContext(kMainThreadName);
529 const char kFunction[] = "DifferentLives"; 584 const char kFunction[] = "DifferentLives";
530 Location location(kFunction, kFile, kLineNumber, NULL); 585 Location location(kFunction, kFile, kLineNumber, NULL);
531 586
532 const base::TimeTicks kTimePosted = base::TimeTicks() + 587 const base::TimeTicks kTimePosted = base::TimeTicks() +
533 base::TimeDelta::FromMilliseconds(1); 588 base::TimeDelta::FromMilliseconds(1);
534 const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 589 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
535 // TrackingInfo will call TallyABirth() during construction. 590 // TrackingInfo will call TallyABirth() during construction.
536 base::TrackingInfo pending_task(location, kDelayedStartTime); 591 base::TrackingInfo pending_task(location, kDelayedStartTime);
537 pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 592 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
538 593
539 const TrackedTime kStartOfRun = TrackedTime() + 594 const unsigned int kStartOfRun = 5;
540 Duration::FromMilliseconds(5); 595 const unsigned int kEndOfRun = 7;
541 const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 596 SetTestTime(kStartOfRun);
542 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 597 TaskStopwatch stopwatch;
543 kStartOfRun, kEndOfRun); 598 SetTestTime(kEndOfRun);
599 stopwatch.Stop();
600
601 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch);
544 602
545 const int kSecondFakeLineNumber = 999; 603 const int kSecondFakeLineNumber = 999;
546 Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL); 604 Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL);
547 605
548 // TrackingInfo will call TallyABirth() during construction. 606 // TrackingInfo will call TallyABirth() during construction.
549 base::TrackingInfo pending_task2(second_location, kDelayedStartTime); 607 base::TrackingInfo pending_task2(second_location, kDelayedStartTime);
550 pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). 608 pending_task2.time_posted = kTimePosted; // Overwrite implied Now().
551 609
552 ProcessDataSnapshot process_data; 610 ProcessDataSnapshot process_data;
553 ThreadData::Snapshot(false, &process_data); 611 ThreadData::Snapshot(false, &process_data);
554 ASSERT_EQ(2u, process_data.tasks.size()); 612 ASSERT_EQ(2u, process_data.tasks.size());
613
555 EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); 614 EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name);
556 EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); 615 EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name);
557 EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); 616 EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number);
558 EXPECT_EQ(kMainThreadName, process_data.tasks[0].birth.thread_name); 617 EXPECT_EQ(kMainThreadName, process_data.tasks[0].birth.thread_name);
559 EXPECT_EQ(1, process_data.tasks[0].death_data.count); 618 EXPECT_EQ(1, process_data.tasks[0].death_data.count);
560 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sum); 619 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sum);
561 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_max); 620 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_max);
562 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sample); 621 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sample);
563 EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_sum); 622 EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_sum);
564 EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_max); 623 EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_max);
565 EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_sample); 624 EXPECT_EQ(4, process_data.tasks[0].death_data.queue_duration_sample);
566 EXPECT_EQ(kMainThreadName, process_data.tasks[0].death_thread_name); 625 EXPECT_EQ(kMainThreadName, process_data.tasks[0].death_thread_name);
567 EXPECT_EQ(kFile, process_data.tasks[1].birth.location.file_name); 626 EXPECT_EQ(kFile, process_data.tasks[1].birth.location.file_name);
568 EXPECT_EQ(kFunction, process_data.tasks[1].birth.location.function_name); 627 EXPECT_EQ(kFunction, process_data.tasks[1].birth.location.function_name);
569 EXPECT_EQ(kSecondFakeLineNumber, 628 EXPECT_EQ(kSecondFakeLineNumber,
570 process_data.tasks[1].birth.location.line_number); 629 process_data.tasks[1].birth.location.line_number);
571 EXPECT_EQ(kMainThreadName, process_data.tasks[1].birth.thread_name); 630 EXPECT_EQ(kMainThreadName, process_data.tasks[1].birth.thread_name);
572 EXPECT_EQ(1, process_data.tasks[1].death_data.count); 631 EXPECT_EQ(1, process_data.tasks[1].death_data.count);
573 EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_sum); 632 EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_sum);
574 EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_max); 633 EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_max);
575 EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_sample); 634 EXPECT_EQ(0, process_data.tasks[1].death_data.run_duration_sample);
576 EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_sum); 635 EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_sum);
577 EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_max); 636 EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_max);
578 EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_sample); 637 EXPECT_EQ(0, process_data.tasks[1].death_data.queue_duration_sample);
579 EXPECT_EQ(kStillAlive, process_data.tasks[1].death_thread_name); 638 EXPECT_EQ(kStillAlive, process_data.tasks[1].death_thread_name);
580 EXPECT_EQ(0u, process_data.descendants.size()); 639 EXPECT_EQ(0u, process_data.descendants.size());
581 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); 640 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
582 } 641 }
583 642
643 TEST_F(TrackedObjectsTest, TaskWithNestedExclusion) {
644 if (!ThreadData::InitializeAndSetTrackingStatus(
645 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
646 return;
647 }
648
649 const char kFunction[] = "TaskWithNestedExclusion";
650 Location location(kFunction, kFile, kLineNumber, NULL);
651 TallyABirth(location, kMainThreadName);
652
653 const base::TimeTicks kTimePosted = base::TimeTicks() +
654 base::TimeDelta::FromMilliseconds(1);
655 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
656 // TrackingInfo will call TallyABirth() during construction.
657 base::TrackingInfo pending_task(location, kDelayedStartTime);
658 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
659
660 SetTestTime(5);
661 TaskStopwatch task_stopwatch;
662 {
663 SetTestTime(8);
664 TaskStopwatch exclusion_stopwatch;
665 SetTestTime(12);
666 exclusion_stopwatch.Stop();
667 }
668 SetTestTime(15);
669 task_stopwatch.Stop();
670
671 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch);
672
673 ProcessDataSnapshot process_data;
674 ThreadData::Snapshot(false, &process_data);
675 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName,
676 kMainThreadName, 1, 6, 4);
677 }
678
679 TEST_F(TrackedObjectsTest, TaskWith2NestedExclusions) {
680 if (!ThreadData::InitializeAndSetTrackingStatus(
681 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
682 return;
683 }
684
685 const char kFunction[] = "TaskWith2NestedExclusions";
686 Location location(kFunction, kFile, kLineNumber, NULL);
687 TallyABirth(location, kMainThreadName);
688
689 const base::TimeTicks kTimePosted = base::TimeTicks() +
690 base::TimeDelta::FromMilliseconds(1);
691 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
692 // TrackingInfo will call TallyABirth() during construction.
693 base::TrackingInfo pending_task(location, kDelayedStartTime);
694 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
695
696 SetTestTime(5);
697 TaskStopwatch task_stopwatch;
698 {
699 SetTestTime(8);
700 TaskStopwatch exclusion_stopwatch;
701 SetTestTime(12);
702 exclusion_stopwatch.Stop();
703
704 SetTestTime(15);
705 TaskStopwatch exclusion_stopwatch2;
706 SetTestTime(18);
707 exclusion_stopwatch2.Stop();
708 }
709 SetTestTime(25);
710 task_stopwatch.Stop();
711
712 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch);
713
714 ProcessDataSnapshot process_data;
715 ThreadData::Snapshot(false, &process_data);
716 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName,
717 kMainThreadName, 1, 13, 4);
718 }
719
720 TEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) {
721 if (!ThreadData::InitializeAndSetTrackingStatus(
722 ThreadData::PROFILING_CHILDREN_ACTIVE)) {
723 return;
724 }
725
726 const char kFunction[] = "TaskWithNestedExclusionWithNestedTask";
727 Location location(kFunction, kFile, kLineNumber, NULL);
728
729 const int kSecondFakeLineNumber = 999;
730
731 TallyABirth(location, kMainThreadName);
732
733 const base::TimeTicks kTimePosted = base::TimeTicks() +
734 base::TimeDelta::FromMilliseconds(1);
735 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
736 // TrackingInfo will call TallyABirth() during construction.
737 base::TrackingInfo pending_task(location, kDelayedStartTime);
738 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
739
740 SetTestTime(5);
741 TaskStopwatch task_stopwatch;
742 {
743 SetTestTime(8);
744 TaskStopwatch exclusion_stopwatch;
745 {
746 Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL);
747 base::TrackingInfo nested_task(second_location, kDelayedStartTime);
748 // Overwrite implied Now().
749 nested_task.time_posted =
750 base::TimeTicks() + base::TimeDelta::FromMilliseconds(8);
751 SetTestTime(9);
752 TaskStopwatch nested_task_stopwatch;
753 SetTestTime(11);
754 nested_task_stopwatch.Stop();
755 ThreadData::TallyRunOnNamedThreadIfTracking(
756 nested_task, nested_task_stopwatch);
757 }
758 SetTestTime(12);
759 exclusion_stopwatch.Stop();
760 }
761 SetTestTime(15);
762 task_stopwatch.Stop();
763
764 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch);
765
766 ProcessDataSnapshot process_data;
767 ThreadData::Snapshot(false, &process_data);
768
769 // The order in which the two task follow is platform-dependent.
770 int t0 = (process_data.tasks[0].birth.location.line_number == kLineNumber) ?
771 0 : 1;
772 int t1 = 1 - t0;
773
774 ASSERT_EQ(2u, process_data.tasks.size());
775 EXPECT_EQ(kFile, process_data.tasks[t0].birth.location.file_name);
776 EXPECT_EQ(kFunction, process_data.tasks[t0].birth.location.function_name);
777 EXPECT_EQ(kLineNumber, process_data.tasks[t0].birth.location.line_number);
778 EXPECT_EQ(kMainThreadName, process_data.tasks[t0].birth.thread_name);
779 EXPECT_EQ(1, process_data.tasks[t0].death_data.count);
780 EXPECT_EQ(6, process_data.tasks[t0].death_data.run_duration_sum);
781 EXPECT_EQ(6, process_data.tasks[t0].death_data.run_duration_max);
782 EXPECT_EQ(6, process_data.tasks[t0].death_data.run_duration_sample);
783 EXPECT_EQ(4, process_data.tasks[t0].death_data.queue_duration_sum);
784 EXPECT_EQ(4, process_data.tasks[t0].death_data.queue_duration_max);
785 EXPECT_EQ(4, process_data.tasks[t0].death_data.queue_duration_sample);
786 EXPECT_EQ(kMainThreadName, process_data.tasks[t0].death_thread_name);
787 EXPECT_EQ(kFile, process_data.tasks[t1].birth.location.file_name);
788 EXPECT_EQ(kFunction, process_data.tasks[t1].birth.location.function_name);
789 EXPECT_EQ(kSecondFakeLineNumber,
790 process_data.tasks[t1].birth.location.line_number);
791 EXPECT_EQ(kMainThreadName, process_data.tasks[t1].birth.thread_name);
792 EXPECT_EQ(1, process_data.tasks[t1].death_data.count);
793 EXPECT_EQ(2, process_data.tasks[t1].death_data.run_duration_sum);
794 EXPECT_EQ(2, process_data.tasks[t1].death_data.run_duration_max);
795 EXPECT_EQ(2, process_data.tasks[t1].death_data.run_duration_sample);
796 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_sum);
797 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_max);
798 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_sample);
799 EXPECT_EQ(kMainThreadName, process_data.tasks[t1].death_thread_name);
800 EXPECT_EQ(0u, process_data.descendants.size());
801 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id);
802 }
803
584 } // namespace tracked_objects 804 } // namespace tracked_objects
OLDNEW
« no previous file with comments | « base/tracked_objects.cc ('k') | content/browser/gpu/browser_gpu_channel_host_factory.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698