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

Side by Side Diff: base/tracked_objects_unittest.cc

Issue 9181002: Track parent-child relations during profiling (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 8 years, 10 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') | chrome/browser/chrome_browser_main.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 "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 17 matching lines...) Expand all
28 } 28 }
29 29
30 // Provide access, since this class is a friend of ThreadData. 30 // Provide access, since this class is a friend of ThreadData.
31 void ShutdownSingleThreadedCleanup(bool leak) { 31 void ShutdownSingleThreadedCleanup(bool leak) {
32 ThreadData::ShutdownSingleThreadedCleanup(leak); 32 ThreadData::ShutdownSingleThreadedCleanup(leak);
33 } 33 }
34 }; 34 };
35 35
36 TEST_F(TrackedObjectsTest, MinimalStartupShutdown) { 36 TEST_F(TrackedObjectsTest, MinimalStartupShutdown) {
37 // Minimal test doesn't even create any tasks. 37 // Minimal test doesn't even create any tasks.
38 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 38 if (!ThreadData::InitializeAndSetTrackingStatus(
39 ThreadData::PROFILING_CHILDREN_ACTIVE))
39 return; 40 return;
40 41
41 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 42 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread.
42 ThreadData* data = ThreadData::Get(); 43 ThreadData* data = ThreadData::Get();
43 EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 44 EXPECT_TRUE(ThreadData::first()); // Now class was constructed.
44 EXPECT_TRUE(data); 45 EXPECT_TRUE(data);
45 EXPECT_TRUE(!data->next()); 46 EXPECT_TRUE(!data->next());
46 EXPECT_EQ(data, ThreadData::Get()); 47 EXPECT_EQ(data, ThreadData::Get());
47 ThreadData::BirthMap birth_map; 48 ThreadData::BirthMap birth_map;
48 ThreadData::DeathMap death_map; 49 ThreadData::DeathMap death_map;
49 ThreadData::ParentChildSet parent_child_set; 50 ThreadData::ParentChildSet parent_child_set;
50 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 51 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set);
51 EXPECT_EQ(0u, birth_map.size()); 52 EXPECT_EQ(0u, birth_map.size());
52 EXPECT_EQ(0u, death_map.size()); 53 EXPECT_EQ(0u, death_map.size());
53 EXPECT_EQ(0u, parent_child_set.size()); 54 EXPECT_EQ(0u, parent_child_set.size());
54 // Cleanup with no leaking. 55 // Cleanup with no leaking.
55 ShutdownSingleThreadedCleanup(false); 56 ShutdownSingleThreadedCleanup(false);
56 57
57 // Do it again, just to be sure we reset state completely. 58 // Do it again, just to be sure we reset state completely.
58 ThreadData::InitializeAndSetTrackingStatus(true); 59 ThreadData::InitializeAndSetTrackingStatus(
60 ThreadData::PROFILING_CHILDREN_ACTIVE);
59 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. 61 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread.
60 data = ThreadData::Get(); 62 data = ThreadData::Get();
61 EXPECT_TRUE(ThreadData::first()); // Now class was constructed. 63 EXPECT_TRUE(ThreadData::first()); // Now class was constructed.
62 EXPECT_TRUE(data); 64 EXPECT_TRUE(data);
63 EXPECT_TRUE(!data->next()); 65 EXPECT_TRUE(!data->next());
64 EXPECT_EQ(data, ThreadData::Get()); 66 EXPECT_EQ(data, ThreadData::Get());
65 birth_map.clear(); 67 birth_map.clear();
66 death_map.clear(); 68 death_map.clear();
67 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 69 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set);
68 EXPECT_EQ(0u, birth_map.size()); 70 EXPECT_EQ(0u, birth_map.size());
69 EXPECT_EQ(0u, death_map.size()); 71 EXPECT_EQ(0u, death_map.size());
70 EXPECT_EQ(0u, parent_child_set.size()); 72 EXPECT_EQ(0u, parent_child_set.size());
71 } 73 }
72 74
73 TEST_F(TrackedObjectsTest, TinyStartupShutdown) { 75 TEST_F(TrackedObjectsTest, TinyStartupShutdown) {
74 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 76 if (!ThreadData::InitializeAndSetTrackingStatus(
77 ThreadData::PROFILING_CHILDREN_ACTIVE))
75 return; 78 return;
76 79
77 // Instigate tracking on a single tracked object, on our thread. 80 // Instigate tracking on a single tracked object, on our thread.
78 const Location& location = FROM_HERE; 81 const Location& location = FROM_HERE;
79 Births* first_birth = ThreadData::TallyABirthIfActive(location); 82 Births* first_birth = ThreadData::TallyABirthIfActive(location);
80 83
81 ThreadData* data = ThreadData::first(); 84 ThreadData* data = ThreadData::first();
82 ASSERT_TRUE(data); 85 ASSERT_TRUE(data);
83 EXPECT_TRUE(!data->next()); 86 EXPECT_TRUE(!data->next());
84 EXPECT_EQ(data, ThreadData::Get()); 87 EXPECT_EQ(data, ThreadData::Get());
(...skipping 21 matching lines...) Expand all
106 end_time); 109 end_time);
107 110
108 birth_map.clear(); 111 birth_map.clear();
109 death_map.clear(); 112 death_map.clear();
110 parent_child_set.clear(); 113 parent_child_set.clear();
111 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); 114 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set);
112 EXPECT_EQ(1u, birth_map.size()); // 1 birth location. 115 EXPECT_EQ(1u, birth_map.size()); // 1 birth location.
113 EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. 116 EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births.
114 EXPECT_EQ(1u, death_map.size()); // 1 location. 117 EXPECT_EQ(1u, death_map.size()); // 1 location.
115 EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death. 118 EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death.
116 if (ThreadData::tracking_parent_child_status()) { 119 if (ThreadData::TrackingParentChildStatus()) {
117 EXPECT_EQ(1u, parent_child_set.size()); // 1 child. 120 EXPECT_EQ(1u, parent_child_set.size()); // 1 child.
118 EXPECT_EQ(parent_child_set.begin()->first, 121 EXPECT_EQ(parent_child_set.begin()->first,
119 parent_child_set.begin()->second); 122 parent_child_set.begin()->second);
120 } else { 123 } else {
121 EXPECT_EQ(0u, parent_child_set.size()); // no stats. 124 EXPECT_EQ(0u, parent_child_set.size()); // no stats.
122 } 125 }
123 126
124 // The births were at the same location as the one known death. 127 // The births were at the same location as the one known death.
125 EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first); 128 EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first);
126 } 129 }
127 130
128 TEST_F(TrackedObjectsTest, ParentChildTest) { 131 TEST_F(TrackedObjectsTest, ParentChildTest) {
129 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 132 if (!ThreadData::InitializeAndSetTrackingStatus(
133 ThreadData::PROFILING_CHILDREN_ACTIVE))
130 return; 134 return;
131 if (!ThreadData::tracking_parent_child_status()) 135 if (!ThreadData::TrackingParentChildStatus())
132 return; // Feature not compiled in. 136 return; // Feature not compiled in.
133 137
134 // Instigate tracking on a single tracked object, on our thread. 138 // Instigate tracking on a single tracked object, on our thread.
135 const int kFakeLineNumber = 1776; 139 const int kFakeLineNumber = 1776;
136 const char* kFile = "FixedUnitTestFileName"; 140 const char* kFile = "FixedUnitTestFileName";
137 const char* kFunction = "ParentChildTest"; 141 const char* kFunction = "ParentChildTest";
138 Location location(kFunction, kFile, kFakeLineNumber, NULL); 142 Location location(kFunction, kFile, kFakeLineNumber, NULL);
139 143
140 // Now instigate another birth, while we are timing the run of the first 144 // Now instigate another birth, while we are timing the run of the first
141 // execution. 145 // execution.
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 "\"function_name\":\"ParentChildTest\"," 208 "\"function_name\":\"ParentChildTest\","
205 "\"line_number\":1776" 209 "\"line_number\":1776"
206 "}" 210 "}"
207 "}" 211 "}"
208 "]" 212 "]"
209 "}"; 213 "}";
210 EXPECT_EQ(json, birth_only_result); 214 EXPECT_EQ(json, birth_only_result);
211 } 215 }
212 216
213 TEST_F(TrackedObjectsTest, DeathDataTest) { 217 TEST_F(TrackedObjectsTest, DeathDataTest) {
214 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 218 if (!ThreadData::InitializeAndSetTrackingStatus(
219 ThreadData::PROFILING_CHILDREN_ACTIVE))
215 return; 220 return;
216 221
217 scoped_ptr<DeathData> data(new DeathData()); 222 scoped_ptr<DeathData> data(new DeathData());
218 ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL)); 223 ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL));
219 EXPECT_EQ(data->run_duration_sum(), 0); 224 EXPECT_EQ(data->run_duration_sum(), 0);
220 EXPECT_EQ(data->run_duration_sample(), 0); 225 EXPECT_EQ(data->run_duration_sample(), 0);
221 EXPECT_EQ(data->queue_duration_sum(), 0); 226 EXPECT_EQ(data->queue_duration_sum(), 0);
222 EXPECT_EQ(data->queue_duration_sample(), 0); 227 EXPECT_EQ(data->queue_duration_sample(), 0);
223 EXPECT_EQ(data->count(), 0); 228 EXPECT_EQ(data->count(), 0);
224 229
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
263 "\"queue_ms_sample\":8," 268 "\"queue_ms_sample\":8,"
264 "\"run_ms\":84," 269 "\"run_ms\":84,"
265 "\"run_ms_max\":42," 270 "\"run_ms_max\":42,"
266 "\"run_ms_sample\":42" 271 "\"run_ms_sample\":42"
267 "}"; 272 "}";
268 EXPECT_EQ(birth_only_result, json); 273 EXPECT_EQ(birth_only_result, json);
269 } 274 }
270 275
271 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueWorkerThread) { 276 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueWorkerThread) {
272 // Transition to Deactivated state before doing anything. 277 // Transition to Deactivated state before doing anything.
273 if (!ThreadData::InitializeAndSetTrackingStatus(false)) 278 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED))
274 return; 279 return;
275 // We don't initialize system with a thread name, so we're viewed as a worker 280 // We don't initialize system with a thread name, so we're viewed as a worker
276 // thread. 281 // thread.
277 const int kFakeLineNumber = 173; 282 const int kFakeLineNumber = 173;
278 const char* kFile = "FixedFileName"; 283 const char* kFile = "FixedFileName";
279 const char* kFunction = "BirthOnlyToValueWorkerThread"; 284 const char* kFunction = "BirthOnlyToValueWorkerThread";
280 Location location(kFunction, kFile, kFakeLineNumber, NULL); 285 Location location(kFunction, kFile, kFakeLineNumber, NULL);
281 Births* birth = ThreadData::TallyABirthIfActive(location); 286 Births* birth = ThreadData::TallyABirthIfActive(location);
282 // We should now see a NULL birth record. 287 // We should now see a NULL birth record.
283 EXPECT_EQ(birth, reinterpret_cast<Births*>(NULL)); 288 EXPECT_EQ(birth, reinterpret_cast<Births*>(NULL));
284 289
285 scoped_ptr<base::Value> value(ThreadData::ToValue(false)); 290 scoped_ptr<base::Value> value(ThreadData::ToValue(false));
286 std::string json; 291 std::string json;
287 base::JSONWriter::Write(value.get(), false, &json); 292 base::JSONWriter::Write(value.get(), false, &json);
288 std::string birth_only_result = "{" 293 std::string birth_only_result = "{"
289 "\"descendants\":[" 294 "\"descendants\":["
290 "]," 295 "],"
291 "\"list\":[" 296 "\"list\":["
292 "]" 297 "]"
293 "}"; 298 "}";
294 EXPECT_EQ(json, birth_only_result); 299 EXPECT_EQ(json, birth_only_result);
295 } 300 }
296 301
297 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueMainThread) { 302 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueMainThread) {
298 // Start in the deactivated state. 303 // Start in the deactivated state.
299 if (!ThreadData::InitializeAndSetTrackingStatus(false)) 304 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED))
300 return; 305 return;
301 306
302 // Use a well named thread. 307 // Use a well named thread.
303 ThreadData::InitializeThreadContext("SomeMainThreadName"); 308 ThreadData::InitializeThreadContext("SomeMainThreadName");
304 const int kFakeLineNumber = 173; 309 const int kFakeLineNumber = 173;
305 const char* kFile = "FixedFileName"; 310 const char* kFile = "FixedFileName";
306 const char* kFunction = "BirthOnlyToValueMainThread"; 311 const char* kFunction = "BirthOnlyToValueMainThread";
307 Location location(kFunction, kFile, kFakeLineNumber, NULL); 312 Location location(kFunction, kFile, kFakeLineNumber, NULL);
308 // Do not delete birth. We don't own it. 313 // Do not delete birth. We don't own it.
309 Births* birth = ThreadData::TallyABirthIfActive(location); 314 Births* birth = ThreadData::TallyABirthIfActive(location);
310 // We expect to not get a birth record. 315 // We expect to not get a birth record.
311 EXPECT_EQ(birth, reinterpret_cast<Births*>(NULL)); 316 EXPECT_EQ(birth, reinterpret_cast<Births*>(NULL));
312 317
313 scoped_ptr<base::Value> value(ThreadData::ToValue(false)); 318 scoped_ptr<base::Value> value(ThreadData::ToValue(false));
314 std::string json; 319 std::string json;
315 base::JSONWriter::Write(value.get(), false, &json); 320 base::JSONWriter::Write(value.get(), false, &json);
316 std::string birth_only_result = "{" 321 std::string birth_only_result = "{"
317 "\"descendants\":[" 322 "\"descendants\":["
318 "]," 323 "],"
319 "\"list\":[" 324 "\"list\":["
320 "]" 325 "]"
321 "}"; 326 "}";
322 EXPECT_EQ(json, birth_only_result); 327 EXPECT_EQ(json, birth_only_result);
323 } 328 }
324 329
325 TEST_F(TrackedObjectsTest, BirthOnlyToValueWorkerThread) { 330 TEST_F(TrackedObjectsTest, BirthOnlyToValueWorkerThread) {
326 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 331 if (!ThreadData::InitializeAndSetTrackingStatus(
332 ThreadData::PROFILING_CHILDREN_ACTIVE))
327 return; 333 return;
328 // We don't initialize system with a thread name, so we're viewed as a worker 334 // We don't initialize system with a thread name, so we're viewed as a worker
329 // thread. 335 // thread.
330 const int kFakeLineNumber = 173; 336 const int kFakeLineNumber = 173;
331 const char* kFile = "FixedFileName"; 337 const char* kFile = "FixedFileName";
332 const char* kFunction = "BirthOnlyToValueWorkerThread"; 338 const char* kFunction = "BirthOnlyToValueWorkerThread";
333 Location location(kFunction, kFile, kFakeLineNumber, NULL); 339 Location location(kFunction, kFile, kFakeLineNumber, NULL);
334 Births* birth = ThreadData::TallyABirthIfActive(location); 340 Births* birth = ThreadData::TallyABirthIfActive(location);
335 EXPECT_NE(birth, reinterpret_cast<Births*>(NULL)); 341 EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
336 342
(...skipping 21 matching lines...) Expand all
358 "\"function_name\":\"BirthOnlyToValueWorkerThread\"," 364 "\"function_name\":\"BirthOnlyToValueWorkerThread\","
359 "\"line_number\":173" 365 "\"line_number\":173"
360 "}" 366 "}"
361 "}" 367 "}"
362 "]" 368 "]"
363 "}"; 369 "}";
364 EXPECT_EQ(json, birth_only_result); 370 EXPECT_EQ(json, birth_only_result);
365 } 371 }
366 372
367 TEST_F(TrackedObjectsTest, BirthOnlyToValueMainThread) { 373 TEST_F(TrackedObjectsTest, BirthOnlyToValueMainThread) {
368 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 374 if (!ThreadData::InitializeAndSetTrackingStatus(
375 ThreadData::PROFILING_CHILDREN_ACTIVE))
369 return; 376 return;
370 377
371 // Use a well named thread. 378 // Use a well named thread.
372 ThreadData::InitializeThreadContext("SomeMainThreadName"); 379 ThreadData::InitializeThreadContext("SomeMainThreadName");
373 const int kFakeLineNumber = 173; 380 const int kFakeLineNumber = 173;
374 const char* kFile = "FixedFileName"; 381 const char* kFile = "FixedFileName";
375 const char* kFunction = "BirthOnlyToValueMainThread"; 382 const char* kFunction = "BirthOnlyToValueMainThread";
376 Location location(kFunction, kFile, kFakeLineNumber, NULL); 383 Location location(kFunction, kFile, kFakeLineNumber, NULL);
377 // Do not delete birth. We don't own it. 384 // Do not delete birth. We don't own it.
378 Births* birth = ThreadData::TallyABirthIfActive(location); 385 Births* birth = ThreadData::TallyABirthIfActive(location);
(...skipping 23 matching lines...) Expand all
402 "\"function_name\":\"BirthOnlyToValueMainThread\"," 409 "\"function_name\":\"BirthOnlyToValueMainThread\","
403 "\"line_number\":173" 410 "\"line_number\":173"
404 "}" 411 "}"
405 "}" 412 "}"
406 "]" 413 "]"
407 "}"; 414 "}";
408 EXPECT_EQ(json, birth_only_result); 415 EXPECT_EQ(json, birth_only_result);
409 } 416 }
410 417
411 TEST_F(TrackedObjectsTest, LifeCycleToValueMainThread) { 418 TEST_F(TrackedObjectsTest, LifeCycleToValueMainThread) {
412 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 419 if (!ThreadData::InitializeAndSetTrackingStatus(
420 ThreadData::PROFILING_CHILDREN_ACTIVE))
413 return; 421 return;
414 422
415 // Use a well named thread. 423 // Use a well named thread.
416 ThreadData::InitializeThreadContext("SomeMainThreadName"); 424 ThreadData::InitializeThreadContext("SomeMainThreadName");
417 const int kFakeLineNumber = 236; 425 const int kFakeLineNumber = 236;
418 const char* kFile = "FixedFileName"; 426 const char* kFile = "FixedFileName";
419 const char* kFunction = "LifeCycleToValueMainThread"; 427 const char* kFunction = "LifeCycleToValueMainThread";
420 Location location(kFunction, kFile, kFakeLineNumber, NULL); 428 Location location(kFunction, kFile, kFakeLineNumber, NULL);
421 // Do not delete birth. We don't own it. 429 // Do not delete birth. We don't own it.
422 Births* birth = ThreadData::TallyABirthIfActive(location); 430 Births* birth = ThreadData::TallyABirthIfActive(location);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 "]" 471 "]"
464 "}"; 472 "}";
465 EXPECT_EQ(one_line_result, json); 473 EXPECT_EQ(one_line_result, json);
466 } 474 }
467 475
468 // We will deactivate tracking after the birth, and before the death, and 476 // We will deactivate tracking after the birth, and before the death, and
469 // demonstrate that the lifecycle is completely tallied. This ensures that 477 // demonstrate that the lifecycle is completely tallied. This ensures that
470 // our tallied births are matched by tallied deaths (except for when the 478 // our tallied births are matched by tallied deaths (except for when the
471 // task is still running, or is queued). 479 // task is still running, or is queued).
472 TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToValueMainThread) { 480 TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToValueMainThread) {
473 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 481 if (!ThreadData::InitializeAndSetTrackingStatus(
482 ThreadData::PROFILING_CHILDREN_ACTIVE))
474 return; 483 return;
475 484
476 // Use a well named thread. 485 // Use a well named thread.
477 ThreadData::InitializeThreadContext("SomeMainThreadName"); 486 ThreadData::InitializeThreadContext("SomeMainThreadName");
478 const int kFakeLineNumber = 236; 487 const int kFakeLineNumber = 236;
479 const char* kFile = "FixedFileName"; 488 const char* kFile = "FixedFileName";
480 const char* kFunction = "LifeCycleToValueMainThread"; 489 const char* kFunction = "LifeCycleToValueMainThread";
481 Location location(kFunction, kFile, kFakeLineNumber, NULL); 490 Location location(kFunction, kFile, kFakeLineNumber, NULL);
482 // Do not delete birth. We don't own it. 491 // Do not delete birth. We don't own it.
483 Births* birth = ThreadData::TallyABirthIfActive(location); 492 Births* birth = ThreadData::TallyABirthIfActive(location);
484 EXPECT_NE(birth, reinterpret_cast<Births*>(NULL)); 493 EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
485 494
486 const base::TimeTicks kTimePosted = base::TimeTicks() 495 const base::TimeTicks kTimePosted = base::TimeTicks()
487 + base::TimeDelta::FromMilliseconds(1); 496 + base::TimeDelta::FromMilliseconds(1);
488 const base::TimeTicks kDelayedStartTime = base::TimeTicks(); 497 const base::TimeTicks kDelayedStartTime = base::TimeTicks();
489 // TrackingInfo will call TallyABirth() during construction. 498 // TrackingInfo will call TallyABirth() during construction.
490 base::TrackingInfo pending_task(location, kDelayedStartTime); 499 base::TrackingInfo pending_task(location, kDelayedStartTime);
491 pending_task.time_posted = kTimePosted; // Overwrite implied Now(). 500 pending_task.time_posted = kTimePosted; // Overwrite implied Now().
492 501
493 // Turn off tracking now that we have births. 502 // Turn off tracking now that we have births.
494 EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus(false)); 503 EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus(
504 ThreadData::DEACTIVATED));
495 505
496 const TrackedTime kStartOfRun = TrackedTime() + 506 const TrackedTime kStartOfRun = TrackedTime() +
497 Duration::FromMilliseconds(5); 507 Duration::FromMilliseconds(5);
498 const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7); 508 const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7);
499 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, 509 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task,
500 kStartOfRun, kEndOfRun); 510 kStartOfRun, kEndOfRun);
501 511
502 scoped_ptr<base::Value> value(ThreadData::ToValue(false)); 512 scoped_ptr<base::Value> value(ThreadData::ToValue(false));
503 std::string json; 513 std::string json;
504 base::JSONWriter::Write(value.get(), false, &json); 514 base::JSONWriter::Write(value.get(), false, &json);
(...skipping 20 matching lines...) Expand all
525 "}" 535 "}"
526 "}" 536 "}"
527 "]" 537 "]"
528 "}"; 538 "}";
529 EXPECT_EQ(one_line_result, json); 539 EXPECT_EQ(one_line_result, json);
530 } 540 }
531 541
532 // We will deactivate tracking before starting a life cycle, and neither 542 // We will deactivate tracking before starting a life cycle, and neither
533 // the birth nor the death will be recorded. 543 // the birth nor the death will be recorded.
534 TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToValueMainThread) { 544 TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToValueMainThread) {
535 if (!ThreadData::InitializeAndSetTrackingStatus(false)) 545 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED))
536 return; 546 return;
537 547
538 // Use a well named thread. 548 // Use a well named thread.
539 ThreadData::InitializeThreadContext("SomeMainThreadName"); 549 ThreadData::InitializeThreadContext("SomeMainThreadName");
540 const int kFakeLineNumber = 236; 550 const int kFakeLineNumber = 236;
541 const char* kFile = "FixedFileName"; 551 const char* kFile = "FixedFileName";
542 const char* kFunction = "LifeCycleToValueMainThread"; 552 const char* kFunction = "LifeCycleToValueMainThread";
543 Location location(kFunction, kFile, kFakeLineNumber, NULL); 553 Location location(kFunction, kFile, kFakeLineNumber, NULL);
544 // Do not delete birth. We don't own it. 554 // Do not delete birth. We don't own it.
545 Births* birth = ThreadData::TallyABirthIfActive(location); 555 Births* birth = ThreadData::TallyABirthIfActive(location);
(...skipping 18 matching lines...) Expand all
564 std::string one_line_result = "{" 574 std::string one_line_result = "{"
565 "\"descendants\":[" 575 "\"descendants\":["
566 "]," 576 "],"
567 "\"list\":[" 577 "\"list\":["
568 "]" 578 "]"
569 "}"; 579 "}";
570 EXPECT_EQ(one_line_result, json); 580 EXPECT_EQ(one_line_result, json);
571 } 581 }
572 582
573 TEST_F(TrackedObjectsTest, LifeCycleToValueWorkerThread) { 583 TEST_F(TrackedObjectsTest, LifeCycleToValueWorkerThread) {
574 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 584 if (!ThreadData::InitializeAndSetTrackingStatus(
585 ThreadData::PROFILING_CHILDREN_ACTIVE))
575 return; 586 return;
576 587
577 // Don't initialize thread, so that we appear as a worker thread. 588 // Don't initialize thread, so that we appear as a worker thread.
578 // ThreadData::InitializeThreadContext("SomeMainThreadName"); 589 // ThreadData::InitializeThreadContext("SomeMainThreadName");
579 590
580 const int kFakeLineNumber = 236; 591 const int kFakeLineNumber = 236;
581 const char* kFile = "FixedFileName"; 592 const char* kFile = "FixedFileName";
582 const char* kFunction = "LifeCycleToValueWorkerThread"; 593 const char* kFunction = "LifeCycleToValueWorkerThread";
583 Location location(kFunction, kFile, kFakeLineNumber, NULL); 594 Location location(kFunction, kFile, kFakeLineNumber, NULL);
584 // Do not delete birth. We don't own it. 595 // Do not delete birth. We don't own it.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 "\"function_name\":\"LifeCycleToValueWorkerThread\"," 666 "\"function_name\":\"LifeCycleToValueWorkerThread\","
656 "\"line_number\":236" 667 "\"line_number\":236"
657 "}" 668 "}"
658 "}" 669 "}"
659 "]" 670 "]"
660 "}"; 671 "}";
661 EXPECT_EQ(one_line_result_with_zeros, json); 672 EXPECT_EQ(one_line_result_with_zeros, json);
662 } 673 }
663 674
664 TEST_F(TrackedObjectsTest, TwoLives) { 675 TEST_F(TrackedObjectsTest, TwoLives) {
665 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 676 if (!ThreadData::InitializeAndSetTrackingStatus(
677 ThreadData::PROFILING_CHILDREN_ACTIVE))
666 return; 678 return;
667 679
668 // Use a well named thread. 680 // Use a well named thread.
669 ThreadData::InitializeThreadContext("SomeFileThreadName"); 681 ThreadData::InitializeThreadContext("SomeFileThreadName");
670 const int kFakeLineNumber = 222; 682 const int kFakeLineNumber = 222;
671 const char* kFile = "AnotherFileName"; 683 const char* kFile = "AnotherFileName";
672 const char* kFunction = "TwoLives"; 684 const char* kFunction = "TwoLives";
673 Location location(kFunction, kFile, kFakeLineNumber, NULL); 685 Location location(kFunction, kFile, kFakeLineNumber, NULL);
674 // Do not delete birth. We don't own it. 686 // Do not delete birth. We don't own it.
675 Births* birth = ThreadData::TallyABirthIfActive(location); 687 Births* birth = ThreadData::TallyABirthIfActive(location);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 "\"function_name\":\"TwoLives\"," 732 "\"function_name\":\"TwoLives\","
721 "\"line_number\":222" 733 "\"line_number\":222"
722 "}" 734 "}"
723 "}" 735 "}"
724 "]" 736 "]"
725 "}"; 737 "}";
726 EXPECT_EQ(one_line_result, json); 738 EXPECT_EQ(one_line_result, json);
727 } 739 }
728 740
729 TEST_F(TrackedObjectsTest, DifferentLives) { 741 TEST_F(TrackedObjectsTest, DifferentLives) {
730 if (!ThreadData::InitializeAndSetTrackingStatus(true)) 742 if (!ThreadData::InitializeAndSetTrackingStatus(
743 ThreadData::PROFILING_CHILDREN_ACTIVE))
731 return; 744 return;
732 745
733 // Use a well named thread. 746 // Use a well named thread.
734 ThreadData::InitializeThreadContext("SomeFileThreadName"); 747 ThreadData::InitializeThreadContext("SomeFileThreadName");
735 const int kFakeLineNumber = 567; 748 const int kFakeLineNumber = 567;
736 const char* kFile = "AnotherFileName"; 749 const char* kFile = "AnotherFileName";
737 const char* kFunction = "DifferentLives"; 750 const char* kFunction = "DifferentLives";
738 Location location(kFunction, kFile, kFakeLineNumber, NULL); 751 Location location(kFunction, kFile, kFakeLineNumber, NULL);
739 752
740 const base::TimeTicks kTimePosted = base::TimeTicks() 753 const base::TimeTicks kTimePosted = base::TimeTicks()
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
800 "\"line_number\":999" 813 "\"line_number\":999"
801 "}" 814 "}"
802 "}" 815 "}"
803 "]" 816 "]"
804 "}"; 817 "}";
805 EXPECT_EQ(one_line_result, json); 818 EXPECT_EQ(one_line_result, json);
806 } 819 }
807 820
808 821
809 } // namespace tracked_objects 822 } // namespace tracked_objects
OLDNEW
« no previous file with comments | « base/tracked_objects.cc ('k') | chrome/browser/chrome_browser_main.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698