| OLD | NEW |
| 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 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 131 | 131 |
| 132 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. | 132 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. |
| 133 ThreadData* data = ThreadData::Get(); | 133 ThreadData* data = ThreadData::Get(); |
| 134 EXPECT_TRUE(ThreadData::first()); // Now class was constructed. | 134 EXPECT_TRUE(ThreadData::first()); // Now class was constructed. |
| 135 ASSERT_TRUE(data); | 135 ASSERT_TRUE(data); |
| 136 EXPECT_FALSE(data->next()); | 136 EXPECT_FALSE(data->next()); |
| 137 EXPECT_EQ(data, ThreadData::Get()); | 137 EXPECT_EQ(data, ThreadData::Get()); |
| 138 ThreadData::BirthMap birth_map; | 138 ThreadData::BirthMap birth_map; |
| 139 ThreadData::DeathMap death_map; | 139 ThreadData::DeathMap death_map; |
| 140 ThreadData::ParentChildSet parent_child_set; | 140 ThreadData::ParentChildSet parent_child_set; |
| 141 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); | 141 data->SnapshotMaps(&birth_map, &death_map, &parent_child_set); |
| 142 EXPECT_EQ(0u, birth_map.size()); | 142 EXPECT_EQ(0u, birth_map.size()); |
| 143 EXPECT_EQ(0u, death_map.size()); | 143 EXPECT_EQ(0u, death_map.size()); |
| 144 EXPECT_EQ(0u, parent_child_set.size()); | 144 EXPECT_EQ(0u, parent_child_set.size()); |
| 145 | 145 |
| 146 // Clean up with no leaking. | 146 // Clean up with no leaking. |
| 147 Reset(); | 147 Reset(); |
| 148 | 148 |
| 149 // Do it again, just to be sure we reset state completely. | 149 // Do it again, just to be sure we reset state completely. |
| 150 EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus( | 150 EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus( |
| 151 ThreadData::PROFILING_CHILDREN_ACTIVE)); | 151 ThreadData::PROFILING_CHILDREN_ACTIVE)); |
| 152 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. | 152 EXPECT_FALSE(ThreadData::first()); // No activity even on this thread. |
| 153 data = ThreadData::Get(); | 153 data = ThreadData::Get(); |
| 154 EXPECT_TRUE(ThreadData::first()); // Now class was constructed. | 154 EXPECT_TRUE(ThreadData::first()); // Now class was constructed. |
| 155 ASSERT_TRUE(data); | 155 ASSERT_TRUE(data); |
| 156 EXPECT_FALSE(data->next()); | 156 EXPECT_FALSE(data->next()); |
| 157 EXPECT_EQ(data, ThreadData::Get()); | 157 EXPECT_EQ(data, ThreadData::Get()); |
| 158 birth_map.clear(); | 158 birth_map.clear(); |
| 159 death_map.clear(); | 159 death_map.clear(); |
| 160 parent_child_set.clear(); | 160 parent_child_set.clear(); |
| 161 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); | 161 data->SnapshotMaps(&birth_map, &death_map, &parent_child_set); |
| 162 EXPECT_EQ(0u, birth_map.size()); | 162 EXPECT_EQ(0u, birth_map.size()); |
| 163 EXPECT_EQ(0u, death_map.size()); | 163 EXPECT_EQ(0u, death_map.size()); |
| 164 EXPECT_EQ(0u, parent_child_set.size()); | 164 EXPECT_EQ(0u, parent_child_set.size()); |
| 165 } | 165 } |
| 166 | 166 |
| 167 TEST_F(TrackedObjectsTest, TinyStartupShutdown) { | 167 TEST_F(TrackedObjectsTest, TinyStartupShutdown) { |
| 168 if (!ThreadData::InitializeAndSetTrackingStatus( | 168 if (!ThreadData::InitializeAndSetTrackingStatus( |
| 169 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | 169 ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
| 170 return; | 170 return; |
| 171 } | 171 } |
| 172 | 172 |
| 173 // Instigate tracking on a single tracked object, on our thread. | 173 // Instigate tracking on a single tracked object, on our thread. |
| 174 const char kFunction[] = "TinyStartupShutdown"; | 174 const char kFunction[] = "TinyStartupShutdown"; |
| 175 Location location(kFunction, kFile, kLineNumber, NULL); | 175 Location location(kFunction, kFile, kLineNumber, NULL); |
| 176 Births* first_birth = ThreadData::TallyABirthIfActive(location); | 176 Births* first_birth = ThreadData::TallyABirthIfActive(location); |
| 177 | 177 |
| 178 ThreadData* data = ThreadData::first(); | 178 ThreadData* data = ThreadData::first(); |
| 179 ASSERT_TRUE(data); | 179 ASSERT_TRUE(data); |
| 180 EXPECT_FALSE(data->next()); | 180 EXPECT_FALSE(data->next()); |
| 181 EXPECT_EQ(data, ThreadData::Get()); | 181 EXPECT_EQ(data, ThreadData::Get()); |
| 182 ThreadData::BirthMap birth_map; | 182 ThreadData::BirthMap birth_map; |
| 183 ThreadData::DeathMap death_map; | 183 ThreadData::DeathMap death_map; |
| 184 ThreadData::ParentChildSet parent_child_set; | 184 ThreadData::ParentChildSet parent_child_set; |
| 185 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); | 185 data->SnapshotMaps(&birth_map, &death_map, &parent_child_set); |
| 186 EXPECT_EQ(1u, birth_map.size()); // 1 birth location. | 186 EXPECT_EQ(1u, birth_map.size()); // 1 birth location. |
| 187 EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth. | 187 EXPECT_EQ(1, birth_map.begin()->second->birth_count()); // 1 birth. |
| 188 EXPECT_EQ(0u, death_map.size()); // No deaths. | 188 EXPECT_EQ(0u, death_map.size()); // No deaths. |
| 189 EXPECT_EQ(0u, parent_child_set.size()); // No children. | 189 EXPECT_EQ(0u, parent_child_set.size()); // No children. |
| 190 | 190 |
| 191 | 191 |
| 192 // Now instigate another birth, while we are timing the run of the first | 192 // Now instigate another birth, while we are timing the run of the first |
| 193 // execution. | 193 // execution. |
| 194 ThreadData::PrepareForStartOfRun(first_birth); | 194 ThreadData::PrepareForStartOfRun(first_birth); |
| 195 // Create a child (using the same birth location). | 195 // Create a child (using the same birth location). |
| 196 // TrackingInfo will call TallyABirth() during construction. | 196 // TrackingInfo will call TallyABirth() during construction. |
| 197 const int32 start_time = 1; | 197 const int32 start_time = 1; |
| 198 base::TimeTicks kBogusBirthTime = base::TimeTicks() + | 198 base::TimeTicks kBogusBirthTime = base::TimeTicks() + |
| 199 base::TimeDelta::FromMilliseconds(start_time); | 199 base::TimeDelta::FromMilliseconds(start_time); |
| 200 base::TrackingInfo pending_task(location, kBogusBirthTime); | 200 base::TrackingInfo pending_task(location, kBogusBirthTime); |
| 201 SetTestTime(1); | 201 SetTestTime(1); |
| 202 TaskStopwatch stopwatch; | 202 TaskStopwatch stopwatch; |
| 203 stopwatch.Start(); | 203 stopwatch.Start(); |
| 204 // Finally conclude the outer run. | 204 // Finally conclude the outer run. |
| 205 const int32 time_elapsed = 1000; | 205 const int32 time_elapsed = 1000; |
| 206 SetTestTime(start_time + time_elapsed); | 206 SetTestTime(start_time + time_elapsed); |
| 207 stopwatch.Stop(); | 207 stopwatch.Stop(); |
| 208 | 208 |
| 209 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); | 209 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
| 210 | 210 |
| 211 birth_map.clear(); | 211 birth_map.clear(); |
| 212 death_map.clear(); | 212 death_map.clear(); |
| 213 parent_child_set.clear(); | 213 parent_child_set.clear(); |
| 214 data->SnapshotMaps(false, &birth_map, &death_map, &parent_child_set); | 214 data->SnapshotMaps(&birth_map, &death_map, &parent_child_set); |
| 215 EXPECT_EQ(1u, birth_map.size()); // 1 birth location. | 215 EXPECT_EQ(1u, birth_map.size()); // 1 birth location. |
| 216 EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. | 216 EXPECT_EQ(2, birth_map.begin()->second->birth_count()); // 2 births. |
| 217 EXPECT_EQ(1u, death_map.size()); // 1 location. | 217 EXPECT_EQ(1u, death_map.size()); // 1 location. |
| 218 EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death. | 218 EXPECT_EQ(1, death_map.begin()->second.count()); // 1 death. |
| 219 if (ThreadData::TrackingParentChildStatus()) { | 219 if (ThreadData::TrackingParentChildStatus()) { |
| 220 EXPECT_EQ(1u, parent_child_set.size()); // 1 child. | 220 EXPECT_EQ(1u, parent_child_set.size()); // 1 child. |
| 221 EXPECT_EQ(parent_child_set.begin()->first, | 221 EXPECT_EQ(parent_child_set.begin()->first, |
| 222 parent_child_set.begin()->second); | 222 parent_child_set.begin()->second); |
| 223 } else { | 223 } else { |
| 224 EXPECT_EQ(0u, parent_child_set.size()); // no stats. | 224 EXPECT_EQ(0u, parent_child_set.size()); // no stats. |
| 225 } | 225 } |
| 226 | 226 |
| 227 // The births were at the same location as the one known death. | 227 // The births were at the same location as the one known death. |
| 228 EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first); | 228 EXPECT_EQ(birth_map.begin()->second, death_map.begin()->first); |
| 229 | 229 |
| 230 ProcessDataSnapshot process_data; | 230 ProcessDataSnapshot process_data; |
| 231 ThreadData::Snapshot(false, &process_data); | 231 ThreadData::Snapshot(&process_data); |
| 232 | 232 |
| 233 ASSERT_EQ(1u, process_data.tasks.size()); | 233 ASSERT_EQ(1u, process_data.tasks.size()); |
| 234 EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); | 234 EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); |
| 235 EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); | 235 EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); |
| 236 EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); | 236 EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); |
| 237 EXPECT_EQ(kWorkerThreadName, process_data.tasks[0].birth.thread_name); | 237 EXPECT_EQ(kWorkerThreadName, process_data.tasks[0].birth.thread_name); |
| 238 EXPECT_EQ(1, process_data.tasks[0].death_data.count); | 238 EXPECT_EQ(1, process_data.tasks[0].death_data.count); |
| 239 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sum); | 239 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sum); |
| 240 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_max); | 240 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_max); |
| 241 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sample); | 241 EXPECT_EQ(time_elapsed, process_data.tasks[0].death_data.run_duration_sample); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 // Start in the deactivated state. | 310 // Start in the deactivated state. |
| 311 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { | 311 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { |
| 312 return; | 312 return; |
| 313 } | 313 } |
| 314 | 314 |
| 315 const char kFunction[] = "DeactivatedBirthOnlyToSnapshotWorkerThread"; | 315 const char kFunction[] = "DeactivatedBirthOnlyToSnapshotWorkerThread"; |
| 316 Location location(kFunction, kFile, kLineNumber, NULL); | 316 Location location(kFunction, kFile, kLineNumber, NULL); |
| 317 TallyABirth(location, std::string()); | 317 TallyABirth(location, std::string()); |
| 318 | 318 |
| 319 ProcessDataSnapshot process_data; | 319 ProcessDataSnapshot process_data; |
| 320 ThreadData::Snapshot(false, &process_data); | 320 ThreadData::Snapshot(&process_data); |
| 321 EXPECT_EQ(0u, process_data.tasks.size()); | 321 EXPECT_EQ(0u, process_data.tasks.size()); |
| 322 EXPECT_EQ(0u, process_data.descendants.size()); | 322 EXPECT_EQ(0u, process_data.descendants.size()); |
| 323 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); | 323 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); |
| 324 } | 324 } |
| 325 | 325 |
| 326 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotMainThread) { | 326 TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToSnapshotMainThread) { |
| 327 // Start in the deactivated state. | 327 // Start in the deactivated state. |
| 328 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { | 328 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { |
| 329 return; | 329 return; |
| 330 } | 330 } |
| 331 | 331 |
| 332 const char kFunction[] = "DeactivatedBirthOnlyToSnapshotMainThread"; | 332 const char kFunction[] = "DeactivatedBirthOnlyToSnapshotMainThread"; |
| 333 Location location(kFunction, kFile, kLineNumber, NULL); | 333 Location location(kFunction, kFile, kLineNumber, NULL); |
| 334 TallyABirth(location, kMainThreadName); | 334 TallyABirth(location, kMainThreadName); |
| 335 | 335 |
| 336 ProcessDataSnapshot process_data; | 336 ProcessDataSnapshot process_data; |
| 337 ThreadData::Snapshot(false, &process_data); | 337 ThreadData::Snapshot(&process_data); |
| 338 EXPECT_EQ(0u, process_data.tasks.size()); | 338 EXPECT_EQ(0u, process_data.tasks.size()); |
| 339 EXPECT_EQ(0u, process_data.descendants.size()); | 339 EXPECT_EQ(0u, process_data.descendants.size()); |
| 340 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); | 340 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); |
| 341 } | 341 } |
| 342 | 342 |
| 343 TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotWorkerThread) { | 343 TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotWorkerThread) { |
| 344 if (!ThreadData::InitializeAndSetTrackingStatus( | 344 if (!ThreadData::InitializeAndSetTrackingStatus( |
| 345 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | 345 ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
| 346 return; | 346 return; |
| 347 } | 347 } |
| 348 | 348 |
| 349 const char kFunction[] = "BirthOnlyToSnapshotWorkerThread"; | 349 const char kFunction[] = "BirthOnlyToSnapshotWorkerThread"; |
| 350 Location location(kFunction, kFile, kLineNumber, NULL); | 350 Location location(kFunction, kFile, kLineNumber, NULL); |
| 351 TallyABirth(location, std::string()); | 351 TallyABirth(location, std::string()); |
| 352 | 352 |
| 353 ProcessDataSnapshot process_data; | 353 ProcessDataSnapshot process_data; |
| 354 ThreadData::Snapshot(false, &process_data); | 354 ThreadData::Snapshot(&process_data); |
| 355 ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, | 355 ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, |
| 356 kStillAlive, 1, 0, 0); | 356 kStillAlive, 1, 0, 0); |
| 357 } | 357 } |
| 358 | 358 |
| 359 TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotMainThread) { | 359 TEST_F(TrackedObjectsTest, BirthOnlyToSnapshotMainThread) { |
| 360 if (!ThreadData::InitializeAndSetTrackingStatus( | 360 if (!ThreadData::InitializeAndSetTrackingStatus( |
| 361 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | 361 ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
| 362 return; | 362 return; |
| 363 } | 363 } |
| 364 | 364 |
| 365 const char kFunction[] = "BirthOnlyToSnapshotMainThread"; | 365 const char kFunction[] = "BirthOnlyToSnapshotMainThread"; |
| 366 Location location(kFunction, kFile, kLineNumber, NULL); | 366 Location location(kFunction, kFile, kLineNumber, NULL); |
| 367 TallyABirth(location, kMainThreadName); | 367 TallyABirth(location, kMainThreadName); |
| 368 | 368 |
| 369 ProcessDataSnapshot process_data; | 369 ProcessDataSnapshot process_data; |
| 370 ThreadData::Snapshot(false, &process_data); | 370 ThreadData::Snapshot(&process_data); |
| 371 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, kStillAlive, | 371 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, kStillAlive, |
| 372 1, 0, 0); | 372 1, 0, 0); |
| 373 } | 373 } |
| 374 | 374 |
| 375 TEST_F(TrackedObjectsTest, LifeCycleToSnapshotMainThread) { | 375 TEST_F(TrackedObjectsTest, LifeCycleToSnapshotMainThread) { |
| 376 if (!ThreadData::InitializeAndSetTrackingStatus( | 376 if (!ThreadData::InitializeAndSetTrackingStatus( |
| 377 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | 377 ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
| 378 return; | 378 return; |
| 379 } | 379 } |
| 380 | 380 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 392 const unsigned int kEndOfRun = 7; | 392 const unsigned int kEndOfRun = 7; |
| 393 SetTestTime(kStartOfRun); | 393 SetTestTime(kStartOfRun); |
| 394 TaskStopwatch stopwatch; | 394 TaskStopwatch stopwatch; |
| 395 stopwatch.Start(); | 395 stopwatch.Start(); |
| 396 SetTestTime(kEndOfRun); | 396 SetTestTime(kEndOfRun); |
| 397 stopwatch.Stop(); | 397 stopwatch.Stop(); |
| 398 | 398 |
| 399 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); | 399 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
| 400 | 400 |
| 401 ProcessDataSnapshot process_data; | 401 ProcessDataSnapshot process_data; |
| 402 ThreadData::Snapshot(false, &process_data); | 402 ThreadData::Snapshot(&process_data); |
| 403 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, | 403 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
| 404 kMainThreadName, 1, 2, 4); | 404 kMainThreadName, 1, 2, 4); |
| 405 } | 405 } |
| 406 | 406 |
| 407 // We will deactivate tracking after the birth, and before the death, and | 407 // We will deactivate tracking after the birth, and before the death, and |
| 408 // demonstrate that the lifecycle is completely tallied. This ensures that | 408 // demonstrate that the lifecycle is completely tallied. This ensures that |
| 409 // our tallied births are matched by tallied deaths (except for when the | 409 // our tallied births are matched by tallied deaths (except for when the |
| 410 // task is still running, or is queued). | 410 // task is still running, or is queued). |
| 411 TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToSnapshotMainThread) { | 411 TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToSnapshotMainThread) { |
| 412 if (!ThreadData::InitializeAndSetTrackingStatus( | 412 if (!ThreadData::InitializeAndSetTrackingStatus( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 432 const unsigned int kEndOfRun = 7; | 432 const unsigned int kEndOfRun = 7; |
| 433 SetTestTime(kStartOfRun); | 433 SetTestTime(kStartOfRun); |
| 434 TaskStopwatch stopwatch; | 434 TaskStopwatch stopwatch; |
| 435 stopwatch.Start(); | 435 stopwatch.Start(); |
| 436 SetTestTime(kEndOfRun); | 436 SetTestTime(kEndOfRun); |
| 437 stopwatch.Stop(); | 437 stopwatch.Stop(); |
| 438 | 438 |
| 439 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); | 439 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
| 440 | 440 |
| 441 ProcessDataSnapshot process_data; | 441 ProcessDataSnapshot process_data; |
| 442 ThreadData::Snapshot(false, &process_data); | 442 ThreadData::Snapshot(&process_data); |
| 443 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, | 443 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
| 444 kMainThreadName, 1, 2, 4); | 444 kMainThreadName, 1, 2, 4); |
| 445 } | 445 } |
| 446 | 446 |
| 447 // We will deactivate tracking before starting a life cycle, and neither | 447 // We will deactivate tracking before starting a life cycle, and neither |
| 448 // the birth nor the death will be recorded. | 448 // the birth nor the death will be recorded. |
| 449 TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToSnapshotMainThread) { | 449 TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToSnapshotMainThread) { |
| 450 // Start in the deactivated state. | 450 // Start in the deactivated state. |
| 451 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { | 451 if (!ThreadData::InitializeAndSetTrackingStatus(ThreadData::DEACTIVATED)) { |
| 452 return; | 452 return; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 466 const unsigned int kEndOfRun = 7; | 466 const unsigned int kEndOfRun = 7; |
| 467 SetTestTime(kStartOfRun); | 467 SetTestTime(kStartOfRun); |
| 468 TaskStopwatch stopwatch; | 468 TaskStopwatch stopwatch; |
| 469 stopwatch.Start(); | 469 stopwatch.Start(); |
| 470 SetTestTime(kEndOfRun); | 470 SetTestTime(kEndOfRun); |
| 471 stopwatch.Stop(); | 471 stopwatch.Stop(); |
| 472 | 472 |
| 473 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); | 473 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
| 474 | 474 |
| 475 ProcessDataSnapshot process_data; | 475 ProcessDataSnapshot process_data; |
| 476 ThreadData::Snapshot(false, &process_data); | 476 ThreadData::Snapshot(&process_data); |
| 477 EXPECT_EQ(0u, process_data.tasks.size()); | 477 EXPECT_EQ(0u, process_data.tasks.size()); |
| 478 EXPECT_EQ(0u, process_data.descendants.size()); | 478 EXPECT_EQ(0u, process_data.descendants.size()); |
| 479 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); | 479 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); |
| 480 } | 480 } |
| 481 | 481 |
| 482 TEST_F(TrackedObjectsTest, LifeCycleToSnapshotWorkerThread) { | |
| 483 if (!ThreadData::InitializeAndSetTrackingStatus( | |
| 484 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | |
| 485 return; | |
| 486 } | |
| 487 | |
| 488 const char kFunction[] = "LifeCycleToSnapshotWorkerThread"; | |
| 489 Location location(kFunction, kFile, kLineNumber, NULL); | |
| 490 // Do not delete |birth|. We don't own it. | |
| 491 Births* birth = ThreadData::TallyABirthIfActive(location); | |
| 492 EXPECT_NE(reinterpret_cast<Births*>(NULL), birth); | |
| 493 | |
| 494 const unsigned int kTimePosted = 1; | |
| 495 const unsigned int kStartOfRun = 5; | |
| 496 const unsigned int kEndOfRun = 7; | |
| 497 SetTestTime(kStartOfRun); | |
| 498 TaskStopwatch stopwatch; | |
| 499 stopwatch.Start(); | |
| 500 SetTestTime(kEndOfRun); | |
| 501 stopwatch.Stop(); | |
| 502 | |
| 503 ThreadData::TallyRunOnWorkerThreadIfTracking( | |
| 504 birth, TrackedTime() + Duration::FromMilliseconds(kTimePosted), stopwatch); | |
| 505 | |
| 506 // Call for the ToSnapshot, but tell it to not reset the maxes after scanning. | |
| 507 ProcessDataSnapshot process_data; | |
| 508 ThreadData::Snapshot(false, &process_data); | |
| 509 ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, | |
| 510 kWorkerThreadName, 1, 2, 4); | |
| 511 | |
| 512 // Call for the ToSnapshot, but tell it to reset the maxes after scanning. | |
| 513 // We'll still get the same values, but the data will be reset (which we'll | |
| 514 // see in a moment). | |
| 515 ProcessDataSnapshot process_data_pre_reset; | |
| 516 ThreadData::Snapshot(true, &process_data_pre_reset); | |
| 517 ExpectSimpleProcessData(process_data, kFunction, kWorkerThreadName, | |
| 518 kWorkerThreadName, 1, 2, 4); | |
| 519 | |
| 520 // Call for the ToSnapshot, and now we'll see the result of the last | |
| 521 // translation, as the max will have been pushed back to zero. | |
| 522 ProcessDataSnapshot process_data_post_reset; | |
| 523 ThreadData::Snapshot(true, &process_data_post_reset); | |
| 524 ASSERT_EQ(1u, process_data_post_reset.tasks.size()); | |
| 525 EXPECT_EQ(kFile, process_data_post_reset.tasks[0].birth.location.file_name); | |
| 526 EXPECT_EQ(kFunction, | |
| 527 process_data_post_reset.tasks[0].birth.location.function_name); | |
| 528 EXPECT_EQ(kLineNumber, | |
| 529 process_data_post_reset.tasks[0].birth.location.line_number); | |
| 530 EXPECT_EQ(kWorkerThreadName, | |
| 531 process_data_post_reset.tasks[0].birth.thread_name); | |
| 532 EXPECT_EQ(1, process_data_post_reset.tasks[0].death_data.count); | |
| 533 EXPECT_EQ(2, process_data_post_reset.tasks[0].death_data.run_duration_sum); | |
| 534 EXPECT_EQ(0, process_data_post_reset.tasks[0].death_data.run_duration_max); | |
| 535 EXPECT_EQ(2, process_data_post_reset.tasks[0].death_data.run_duration_sample); | |
| 536 EXPECT_EQ(4, process_data_post_reset.tasks[0].death_data.queue_duration_sum); | |
| 537 EXPECT_EQ(0, process_data_post_reset.tasks[0].death_data.queue_duration_max); | |
| 538 EXPECT_EQ(4, | |
| 539 process_data_post_reset.tasks[0].death_data.queue_duration_sample); | |
| 540 EXPECT_EQ(kWorkerThreadName, | |
| 541 process_data_post_reset.tasks[0].death_thread_name); | |
| 542 EXPECT_EQ(0u, process_data_post_reset.descendants.size()); | |
| 543 EXPECT_EQ(base::GetCurrentProcId(), process_data_post_reset.process_id); | |
| 544 } | |
| 545 | |
| 546 TEST_F(TrackedObjectsTest, TwoLives) { | 482 TEST_F(TrackedObjectsTest, TwoLives) { |
| 547 if (!ThreadData::InitializeAndSetTrackingStatus( | 483 if (!ThreadData::InitializeAndSetTrackingStatus( |
| 548 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | 484 ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
| 549 return; | 485 return; |
| 550 } | 486 } |
| 551 | 487 |
| 552 const char kFunction[] = "TwoLives"; | 488 const char kFunction[] = "TwoLives"; |
| 553 Location location(kFunction, kFile, kLineNumber, NULL); | 489 Location location(kFunction, kFile, kLineNumber, NULL); |
| 554 TallyABirth(location, kMainThreadName); | 490 TallyABirth(location, kMainThreadName); |
| 555 | 491 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 574 pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). | 510 pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). |
| 575 SetTestTime(kStartOfRun); | 511 SetTestTime(kStartOfRun); |
| 576 TaskStopwatch stopwatch2; | 512 TaskStopwatch stopwatch2; |
| 577 stopwatch2.Start(); | 513 stopwatch2.Start(); |
| 578 SetTestTime(kEndOfRun); | 514 SetTestTime(kEndOfRun); |
| 579 stopwatch2.Stop(); | 515 stopwatch2.Stop(); |
| 580 | 516 |
| 581 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2, stopwatch2); | 517 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2, stopwatch2); |
| 582 | 518 |
| 583 ProcessDataSnapshot process_data; | 519 ProcessDataSnapshot process_data; |
| 584 ThreadData::Snapshot(false, &process_data); | 520 ThreadData::Snapshot(&process_data); |
| 585 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, | 521 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
| 586 kMainThreadName, 2, 2, 4); | 522 kMainThreadName, 2, 2, 4); |
| 587 } | 523 } |
| 588 | 524 |
| 589 TEST_F(TrackedObjectsTest, DifferentLives) { | 525 TEST_F(TrackedObjectsTest, DifferentLives) { |
| 590 if (!ThreadData::InitializeAndSetTrackingStatus( | 526 if (!ThreadData::InitializeAndSetTrackingStatus( |
| 591 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | 527 ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
| 592 return; | 528 return; |
| 593 } | 529 } |
| 594 | 530 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 614 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); | 550 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, stopwatch); |
| 615 | 551 |
| 616 const int kSecondFakeLineNumber = 999; | 552 const int kSecondFakeLineNumber = 999; |
| 617 Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL); | 553 Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL); |
| 618 | 554 |
| 619 // TrackingInfo will call TallyABirth() during construction. | 555 // TrackingInfo will call TallyABirth() during construction. |
| 620 base::TrackingInfo pending_task2(second_location, kDelayedStartTime); | 556 base::TrackingInfo pending_task2(second_location, kDelayedStartTime); |
| 621 pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). | 557 pending_task2.time_posted = kTimePosted; // Overwrite implied Now(). |
| 622 | 558 |
| 623 ProcessDataSnapshot process_data; | 559 ProcessDataSnapshot process_data; |
| 624 ThreadData::Snapshot(false, &process_data); | 560 ThreadData::Snapshot(&process_data); |
| 625 ASSERT_EQ(2u, process_data.tasks.size()); | 561 ASSERT_EQ(2u, process_data.tasks.size()); |
| 626 | 562 |
| 627 EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); | 563 EXPECT_EQ(kFile, process_data.tasks[0].birth.location.file_name); |
| 628 EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); | 564 EXPECT_EQ(kFunction, process_data.tasks[0].birth.location.function_name); |
| 629 EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); | 565 EXPECT_EQ(kLineNumber, process_data.tasks[0].birth.location.line_number); |
| 630 EXPECT_EQ(kMainThreadName, process_data.tasks[0].birth.thread_name); | 566 EXPECT_EQ(kMainThreadName, process_data.tasks[0].birth.thread_name); |
| 631 EXPECT_EQ(1, process_data.tasks[0].death_data.count); | 567 EXPECT_EQ(1, process_data.tasks[0].death_data.count); |
| 632 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sum); | 568 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sum); |
| 633 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_max); | 569 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_max); |
| 634 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sample); | 570 EXPECT_EQ(2, process_data.tasks[0].death_data.run_duration_sample); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 678 exclusion_stopwatch.Start(); | 614 exclusion_stopwatch.Start(); |
| 679 SetTestTime(12); | 615 SetTestTime(12); |
| 680 exclusion_stopwatch.Stop(); | 616 exclusion_stopwatch.Stop(); |
| 681 } | 617 } |
| 682 SetTestTime(15); | 618 SetTestTime(15); |
| 683 task_stopwatch.Stop(); | 619 task_stopwatch.Stop(); |
| 684 | 620 |
| 685 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); | 621 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); |
| 686 | 622 |
| 687 ProcessDataSnapshot process_data; | 623 ProcessDataSnapshot process_data; |
| 688 ThreadData::Snapshot(false, &process_data); | 624 ThreadData::Snapshot(&process_data); |
| 689 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, | 625 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
| 690 kMainThreadName, 1, 6, 4); | 626 kMainThreadName, 1, 6, 4); |
| 691 } | 627 } |
| 692 | 628 |
| 693 TEST_F(TrackedObjectsTest, TaskWith2NestedExclusions) { | 629 TEST_F(TrackedObjectsTest, TaskWith2NestedExclusions) { |
| 694 if (!ThreadData::InitializeAndSetTrackingStatus( | 630 if (!ThreadData::InitializeAndSetTrackingStatus( |
| 695 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | 631 ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
| 696 return; | 632 return; |
| 697 } | 633 } |
| 698 | 634 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 721 exclusion_stopwatch2.Start(); | 657 exclusion_stopwatch2.Start(); |
| 722 SetTestTime(18); | 658 SetTestTime(18); |
| 723 exclusion_stopwatch2.Stop(); | 659 exclusion_stopwatch2.Stop(); |
| 724 } | 660 } |
| 725 SetTestTime(25); | 661 SetTestTime(25); |
| 726 task_stopwatch.Stop(); | 662 task_stopwatch.Stop(); |
| 727 | 663 |
| 728 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); | 664 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); |
| 729 | 665 |
| 730 ProcessDataSnapshot process_data; | 666 ProcessDataSnapshot process_data; |
| 731 ThreadData::Snapshot(false, &process_data); | 667 ThreadData::Snapshot(&process_data); |
| 732 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, | 668 ExpectSimpleProcessData(process_data, kFunction, kMainThreadName, |
| 733 kMainThreadName, 1, 13, 4); | 669 kMainThreadName, 1, 13, 4); |
| 734 } | 670 } |
| 735 | 671 |
| 736 TEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) { | 672 TEST_F(TrackedObjectsTest, TaskWithNestedExclusionWithNestedTask) { |
| 737 if (!ThreadData::InitializeAndSetTrackingStatus( | 673 if (!ThreadData::InitializeAndSetTrackingStatus( |
| 738 ThreadData::PROFILING_CHILDREN_ACTIVE)) { | 674 ThreadData::PROFILING_CHILDREN_ACTIVE)) { |
| 739 return; | 675 return; |
| 740 } | 676 } |
| 741 | 677 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 774 } | 710 } |
| 775 SetTestTime(12); | 711 SetTestTime(12); |
| 776 exclusion_stopwatch.Stop(); | 712 exclusion_stopwatch.Stop(); |
| 777 } | 713 } |
| 778 SetTestTime(15); | 714 SetTestTime(15); |
| 779 task_stopwatch.Stop(); | 715 task_stopwatch.Stop(); |
| 780 | 716 |
| 781 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); | 717 ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, task_stopwatch); |
| 782 | 718 |
| 783 ProcessDataSnapshot process_data; | 719 ProcessDataSnapshot process_data; |
| 784 ThreadData::Snapshot(false, &process_data); | 720 ThreadData::Snapshot(&process_data); |
| 785 | 721 |
| 786 // The order in which the two task follow is platform-dependent. | 722 // The order in which the two task follow is platform-dependent. |
| 787 int t0 = (process_data.tasks[0].birth.location.line_number == kLineNumber) ? | 723 int t0 = (process_data.tasks[0].birth.location.line_number == kLineNumber) ? |
| 788 0 : 1; | 724 0 : 1; |
| 789 int t1 = 1 - t0; | 725 int t1 = 1 - t0; |
| 790 | 726 |
| 791 ASSERT_EQ(2u, process_data.tasks.size()); | 727 ASSERT_EQ(2u, process_data.tasks.size()); |
| 792 EXPECT_EQ(kFile, process_data.tasks[t0].birth.location.file_name); | 728 EXPECT_EQ(kFile, process_data.tasks[t0].birth.location.file_name); |
| 793 EXPECT_EQ(kFunction, process_data.tasks[t0].birth.location.function_name); | 729 EXPECT_EQ(kFunction, process_data.tasks[t0].birth.location.function_name); |
| 794 EXPECT_EQ(kLineNumber, process_data.tasks[t0].birth.location.line_number); | 730 EXPECT_EQ(kLineNumber, process_data.tasks[t0].birth.location.line_number); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 812 EXPECT_EQ(2, process_data.tasks[t1].death_data.run_duration_sample); | 748 EXPECT_EQ(2, process_data.tasks[t1].death_data.run_duration_sample); |
| 813 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_sum); | 749 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_sum); |
| 814 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_max); | 750 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_max); |
| 815 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_sample); | 751 EXPECT_EQ(1, process_data.tasks[t1].death_data.queue_duration_sample); |
| 816 EXPECT_EQ(kMainThreadName, process_data.tasks[t1].death_thread_name); | 752 EXPECT_EQ(kMainThreadName, process_data.tasks[t1].death_thread_name); |
| 817 EXPECT_EQ(0u, process_data.descendants.size()); | 753 EXPECT_EQ(0u, process_data.descendants.size()); |
| 818 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); | 754 EXPECT_EQ(base::GetCurrentProcId(), process_data.process_id); |
| 819 } | 755 } |
| 820 | 756 |
| 821 } // namespace tracked_objects | 757 } // namespace tracked_objects |
| OLD | NEW |