| Index: base/tracked_objects_unittest.cc
|
| ===================================================================
|
| --- base/tracked_objects_unittest.cc (revision 107970)
|
| +++ base/tracked_objects_unittest.cc (working copy)
|
| @@ -15,15 +15,22 @@
|
|
|
| class TrackedObjectsTest : public testing::Test {
|
| public:
|
| - ~TrackedObjectsTest() {
|
| - ThreadData::ShutdownSingleThreadedCleanup();
|
| - }
|
| + TrackedObjectsTest() {
|
| + // On entry, leak any database structures in case they are still in use by
|
| + // prior threads.
|
| + ThreadData::ShutdownSingleThreadedCleanup(true);
|
| + }
|
|
|
| + ~TrackedObjectsTest() {
|
| + // We should not need to leak any structures we create, since we are
|
| + // single threaded, and carefully accounting for items.
|
| + ThreadData::ShutdownSingleThreadedCleanup(false);
|
| + }
|
| };
|
|
|
| TEST_F(TrackedObjectsTest, MinimalStartupShutdown) {
|
| // Minimal test doesn't even create any tasks.
|
| - if (!ThreadData::StartTracking(true))
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| return;
|
|
|
| EXPECT_FALSE(ThreadData::first()); // No activity even on this thread.
|
| @@ -38,10 +45,11 @@
|
| ThreadData::DeathMap death_map;
|
| data->SnapshotDeathMap(&death_map);
|
| EXPECT_EQ(0u, death_map.size());
|
| - ThreadData::ShutdownSingleThreadedCleanup();
|
| + // Cleanup with no leaking.
|
| + ThreadData::ShutdownSingleThreadedCleanup(false);
|
|
|
| // Do it again, just to be sure we reset state completely.
|
| - ThreadData::StartTracking(true);
|
| + ThreadData::InitializeAndSetTrackingStatus(true);
|
| EXPECT_FALSE(ThreadData::first()); // No activity even on this thread.
|
| data = ThreadData::Get();
|
| EXPECT_TRUE(ThreadData::first()); // Now class was constructed.
|
| @@ -57,7 +65,7 @@
|
| }
|
|
|
| TEST_F(TrackedObjectsTest, TinyStartupShutdown) {
|
| - if (!ThreadData::StartTracking(true))
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| return;
|
|
|
| // Instigate tracking on a single tracked object, on our thread.
|
| @@ -77,14 +85,14 @@
|
| EXPECT_EQ(0u, death_map.size()); // No deaths.
|
|
|
|
|
| - // Now instigate a birth, and a death.
|
| - const Births* second_birth = ThreadData::TallyABirthIfActive(location);
|
| - ThreadData::TallyADeathIfActive(
|
| - second_birth,
|
| - base::TimeTicks(), /* Bogus post_time. */
|
| - base::TimeTicks(), /* Bogus delayed_start_time. */
|
| - base::TimeTicks(), /* Bogus start_run_time. */
|
| - base::TimeTicks() /* Bogus end_run_time */ );
|
| + // Now instigate another birth, and a first death at the same location.
|
| + // TrackingInfo will call TallyABirth() during construction.
|
| + base::TimeTicks kBogusStartTime;
|
| + base::TrackingInfo pending_task(location, kBogusStartTime);
|
| + TrackedTime kBogusStartRunTime;
|
| + TrackedTime kBogusEndRunTime;
|
| + ThreadData::TallyRunOnNamedThreadIfTracking(pending_task, kBogusStartRunTime,
|
| + kBogusEndRunTime);
|
|
|
| birth_map.clear();
|
| data->SnapshotBirthMap(&birth_map);
|
| @@ -100,13 +108,13 @@
|
| }
|
|
|
| TEST_F(TrackedObjectsTest, DeathDataTest) {
|
| - if (!ThreadData::StartTracking(true))
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| return;
|
|
|
| scoped_ptr<DeathData> data(new DeathData());
|
| ASSERT_NE(data, reinterpret_cast<DeathData*>(NULL));
|
| - EXPECT_EQ(data->run_duration(), base::TimeDelta());
|
| - EXPECT_EQ(data->queue_duration(), base::TimeDelta());
|
| + EXPECT_EQ(data->run_duration(), Duration());
|
| + EXPECT_EQ(data->queue_duration(), Duration());
|
| EXPECT_EQ(data->AverageMsRunDuration(), 0);
|
| EXPECT_EQ(data->AverageMsQueueDuration(), 0);
|
| EXPECT_EQ(data->count(), 0);
|
| @@ -114,8 +122,8 @@
|
| int run_ms = 42;
|
| int queue_ms = 8;
|
|
|
| - base::TimeDelta run_duration = base::TimeDelta().FromMilliseconds(run_ms);
|
| - base::TimeDelta queue_duration = base::TimeDelta().FromMilliseconds(queue_ms);
|
| + Duration run_duration = Duration().FromMilliseconds(run_ms);
|
| + Duration queue_duration = Duration().FromMilliseconds(queue_ms);
|
| data->RecordDeath(queue_duration, run_duration);
|
| EXPECT_EQ(data->run_duration(), run_duration);
|
| EXPECT_EQ(data->queue_duration(), queue_duration);
|
| @@ -135,7 +143,7 @@
|
| EXPECT_TRUE(dictionary->GetInteger("run_ms", &integer));
|
| EXPECT_EQ(integer, 2 * run_ms);
|
| EXPECT_TRUE(dictionary->GetInteger("queue_ms", &integer));
|
| - EXPECT_EQ(integer, 2* queue_ms);
|
| + EXPECT_EQ(integer, 2 * queue_ms);
|
| EXPECT_TRUE(dictionary->GetInteger("count", &integer));
|
| EXPECT_EQ(integer, 2);
|
|
|
| @@ -151,20 +159,69 @@
|
| EXPECT_EQ(json, birth_only_result);
|
| }
|
|
|
| +TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueWorkerThread) {
|
| + // Transition to Deactivated state before doing anything.
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(false))
|
| + return;
|
| + // We don't initialize system with a thread name, so we're viewed as a worker
|
| + // thread.
|
| + const int kFakeLineNumber = 173;
|
| + const char* kFile = "FixedFileName";
|
| + const char* kFunction = "BirthOnlyToValueWorkerThread";
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| + Births* birth = ThreadData::TallyABirthIfActive(location);
|
| + // We should now see a NULL birth record.
|
| + EXPECT_EQ(birth, reinterpret_cast<Births*>(NULL));
|
| +
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| + std::string json;
|
| + base::JSONWriter::Write(value.get(), false, &json);
|
| + std::string birth_only_result = "{"
|
| + "\"list\":["
|
| + "]"
|
| + "}";
|
| + EXPECT_EQ(json, birth_only_result);
|
| +}
|
| +
|
| +TEST_F(TrackedObjectsTest, DeactivatedBirthOnlyToValueMainThread) {
|
| + // Start in the deactivated state.
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(false))
|
| + return;
|
| +
|
| + // Use a well named thread.
|
| + ThreadData::InitializeThreadContext("SomeMainThreadName");
|
| + const int kFakeLineNumber = 173;
|
| + const char* kFile = "FixedFileName";
|
| + const char* kFunction = "BirthOnlyToValueMainThread";
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| + // Do not delete birth. We don't own it.
|
| + Births* birth = ThreadData::TallyABirthIfActive(location);
|
| + // We expect to not get a birth record.
|
| + EXPECT_EQ(birth, reinterpret_cast<Births*>(NULL));
|
| +
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| + std::string json;
|
| + base::JSONWriter::Write(value.get(), false, &json);
|
| + std::string birth_only_result = "{"
|
| + "\"list\":["
|
| + "]"
|
| + "}";
|
| + EXPECT_EQ(json, birth_only_result);
|
| +}
|
| +
|
| TEST_F(TrackedObjectsTest, BirthOnlyToValueWorkerThread) {
|
| - if (!ThreadData::StartTracking(true))
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| return;
|
| // We don't initialize system with a thread name, so we're viewed as a worker
|
| // thread.
|
| - int fake_line_number = 173;
|
| + const int kFakeLineNumber = 173;
|
| const char* kFile = "FixedFileName";
|
| const char* kFunction = "BirthOnlyToValueWorkerThread";
|
| - Location location(kFunction, kFile, fake_line_number, NULL);
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| Births* birth = ThreadData::TallyABirthIfActive(location);
|
| EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
|
|
|
| - int process_type = 3;
|
| - scoped_ptr<base::Value> value(ThreadData::ToValue(process_type));
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| std::string json;
|
| base::JSONWriter::Write(value.get(), false, &json);
|
| std::string birth_only_result = "{"
|
| @@ -183,28 +240,26 @@
|
| "\"line_number\":173"
|
| "}"
|
| "}"
|
| - "],"
|
| - "\"process\":3"
|
| + "]"
|
| "}";
|
| EXPECT_EQ(json, birth_only_result);
|
| }
|
|
|
| TEST_F(TrackedObjectsTest, BirthOnlyToValueMainThread) {
|
| - if (!ThreadData::StartTracking(true))
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| return;
|
|
|
| // Use a well named thread.
|
| ThreadData::InitializeThreadContext("SomeMainThreadName");
|
| - int fake_line_number = 173;
|
| + const int kFakeLineNumber = 173;
|
| const char* kFile = "FixedFileName";
|
| const char* kFunction = "BirthOnlyToValueMainThread";
|
| - Location location(kFunction, kFile, fake_line_number, NULL);
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| // Do not delete birth. We don't own it.
|
| Births* birth = ThreadData::TallyABirthIfActive(location);
|
| EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
|
|
|
| - int process_type = 34;
|
| - scoped_ptr<base::Value> value(ThreadData::ToValue(process_type));
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| std::string json;
|
| base::JSONWriter::Write(value.get(), false, &json);
|
| std::string birth_only_result = "{"
|
| @@ -223,40 +278,39 @@
|
| "\"line_number\":173"
|
| "}"
|
| "}"
|
| - "],"
|
| - "\"process\":34"
|
| + "]"
|
| "}";
|
| EXPECT_EQ(json, birth_only_result);
|
| }
|
|
|
| TEST_F(TrackedObjectsTest, LifeCycleToValueMainThread) {
|
| - if (!ThreadData::StartTracking(true))
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| return;
|
|
|
| // Use a well named thread.
|
| ThreadData::InitializeThreadContext("SomeMainThreadName");
|
| - int fake_line_number = 236;
|
| + const int kFakeLineNumber = 236;
|
| const char* kFile = "FixedFileName";
|
| const char* kFunction = "LifeCycleToValueMainThread";
|
| - Location location(kFunction, kFile, fake_line_number, NULL);
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| // Do not delete birth. We don't own it.
|
| Births* birth = ThreadData::TallyABirthIfActive(location);
|
| EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
|
|
|
| - // TimeTicks initializers ar ein microseconds. Durations are calculated in
|
| - // milliseconds, so we need to use 1000x.
|
| - const base::TimeTicks time_posted = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(1);
|
| - const base::TimeTicks delayed_start_time = base::TimeTicks();
|
| - const base::TimeTicks start_of_run = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(5);
|
| - const base::TimeTicks end_of_run = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(7);
|
| - ThreadData::TallyADeathIfActive(birth, time_posted, delayed_start_time,
|
| - start_of_run, end_of_run);
|
| + const base::TimeTicks kTimePosted = base::TimeTicks()
|
| + + base::TimeDelta::FromMilliseconds(1);
|
| + const base::TimeTicks kDelayedStartTime = base::TimeTicks();
|
| + // TrackingInfo will call TallyABirth() during construction.
|
| + base::TrackingInfo pending_task(location, kDelayedStartTime);
|
| + pending_task.time_posted = kTimePosted; // Overwrite implied Now().
|
|
|
| - int process_type = 7;
|
| - scoped_ptr<base::Value> value(ThreadData::ToValue(process_type));
|
| + const TrackedTime kStartOfRun = TrackedTime() +
|
| + Duration::FromMilliseconds(5);
|
| + const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7);
|
| + ThreadData::TallyRunOnNamedThreadIfTracking(pending_task,
|
| + kStartOfRun, kEndOfRun);
|
| +
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| std::string json;
|
| base::JSONWriter::Write(value.get(), false, &json);
|
| std::string one_line_result = "{"
|
| @@ -275,44 +329,190 @@
|
| "\"line_number\":236"
|
| "}"
|
| "}"
|
| - "],"
|
| - "\"process\":7"
|
| + "]"
|
| "}";
|
| - EXPECT_EQ(json, one_line_result);
|
| + EXPECT_EQ(one_line_result, json);
|
| }
|
|
|
| +// We will deactivate tracking after the birth, and before the death, and
|
| +// demonstrate that the lifecycle is completely tallied. This ensures that
|
| +// our tallied births are matched by tallied deaths (except for when the
|
| +// task is still running, or is queued).
|
| +TEST_F(TrackedObjectsTest, LifeCycleMidDeactivatedToValueMainThread) {
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| + return;
|
| +
|
| + // Use a well named thread.
|
| + ThreadData::InitializeThreadContext("SomeMainThreadName");
|
| + const int kFakeLineNumber = 236;
|
| + const char* kFile = "FixedFileName";
|
| + const char* kFunction = "LifeCycleToValueMainThread";
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| + // Do not delete birth. We don't own it.
|
| + Births* birth = ThreadData::TallyABirthIfActive(location);
|
| + EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
|
| +
|
| + const base::TimeTicks kTimePosted = base::TimeTicks()
|
| + + base::TimeDelta::FromMilliseconds(1);
|
| + const base::TimeTicks kDelayedStartTime = base::TimeTicks();
|
| + // TrackingInfo will call TallyABirth() during construction.
|
| + base::TrackingInfo pending_task(location, kDelayedStartTime);
|
| + pending_task.time_posted = kTimePosted; // Overwrite implied Now().
|
| +
|
| + // Turn off tracking now that we have births.
|
| + EXPECT_TRUE(ThreadData::InitializeAndSetTrackingStatus(false));
|
| +
|
| + const TrackedTime kStartOfRun = TrackedTime() +
|
| + Duration::FromMilliseconds(5);
|
| + const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7);
|
| + ThreadData::TallyRunOnNamedThreadIfTracking(pending_task,
|
| + kStartOfRun, kEndOfRun);
|
| +
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| + std::string json;
|
| + base::JSONWriter::Write(value.get(), false, &json);
|
| + std::string one_line_result = "{"
|
| + "\"list\":["
|
| + "{"
|
| + "\"birth_thread\":\"SomeMainThreadName\","
|
| + "\"death_data\":{"
|
| + "\"count\":1,"
|
| + "\"queue_ms\":4,"
|
| + "\"run_ms\":2"
|
| + "},"
|
| + "\"death_thread\":\"SomeMainThreadName\","
|
| + "\"location\":{"
|
| + "\"file_name\":\"FixedFileName\","
|
| + "\"function_name\":\"LifeCycleToValueMainThread\","
|
| + "\"line_number\":236"
|
| + "}"
|
| + "}"
|
| + "]"
|
| + "}";
|
| + EXPECT_EQ(one_line_result, json);
|
| +}
|
| +
|
| +// We will deactivate tracking before starting a life cycle, and neither
|
| +// the birth nor the death will be recorded.
|
| +TEST_F(TrackedObjectsTest, LifeCyclePreDeactivatedToValueMainThread) {
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(false))
|
| + return;
|
| +
|
| + // Use a well named thread.
|
| + ThreadData::InitializeThreadContext("SomeMainThreadName");
|
| + const int kFakeLineNumber = 236;
|
| + const char* kFile = "FixedFileName";
|
| + const char* kFunction = "LifeCycleToValueMainThread";
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| + // Do not delete birth. We don't own it.
|
| + Births* birth = ThreadData::TallyABirthIfActive(location);
|
| + EXPECT_EQ(birth, reinterpret_cast<Births*>(NULL));
|
| +
|
| + const base::TimeTicks kTimePosted = base::TimeTicks()
|
| + + base::TimeDelta::FromMilliseconds(1);
|
| + const base::TimeTicks kDelayedStartTime = base::TimeTicks();
|
| + // TrackingInfo will call TallyABirth() during construction.
|
| + base::TrackingInfo pending_task(location, kDelayedStartTime);
|
| + pending_task.time_posted = kTimePosted; // Overwrite implied Now().
|
| +
|
| + const TrackedTime kStartOfRun = TrackedTime() +
|
| + Duration::FromMilliseconds(5);
|
| + const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7);
|
| + ThreadData::TallyRunOnNamedThreadIfTracking(pending_task,
|
| + kStartOfRun, kEndOfRun);
|
| +
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| + std::string json;
|
| + base::JSONWriter::Write(value.get(), false, &json);
|
| + std::string one_line_result = "{"
|
| + "\"list\":["
|
| + "]"
|
| + "}";
|
| + EXPECT_EQ(one_line_result, json);
|
| +}
|
| +
|
| +TEST_F(TrackedObjectsTest, LifeCycleToValueWorkerThread) {
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| + return;
|
| +
|
| + // Don't initialize thread, so that we appear as a worker thread.
|
| + // ThreadData::InitializeThreadContext("SomeMainThreadName");
|
| +
|
| + const int kFakeLineNumber = 236;
|
| + const char* kFile = "FixedFileName";
|
| + const char* kFunction = "LifeCycleToValueWorkerThread";
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| + // Do not delete birth. We don't own it.
|
| + Births* birth = ThreadData::TallyABirthIfActive(location);
|
| + EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
|
| +
|
| + const TrackedTime kTimePosted = TrackedTime() + Duration::FromMilliseconds(1);
|
| + const TrackedTime kStartOfRun = TrackedTime() +
|
| + Duration::FromMilliseconds(5);
|
| + const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7);
|
| + ThreadData::TallyRunOnWorkerThreadIfTracking(birth, kTimePosted,
|
| + kStartOfRun, kEndOfRun);
|
| +
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| + std::string json;
|
| + base::JSONWriter::Write(value.get(), false, &json);
|
| + std::string one_line_result = "{"
|
| + "\"list\":["
|
| + "{"
|
| + "\"birth_thread\":\"WorkerThread-1\","
|
| + "\"death_data\":{"
|
| + "\"count\":1,"
|
| + "\"queue_ms\":4,"
|
| + "\"run_ms\":2"
|
| + "},"
|
| + "\"death_thread\":\"WorkerThread-1\","
|
| + "\"location\":{"
|
| + "\"file_name\":\"FixedFileName\","
|
| + "\"function_name\":\"LifeCycleToValueWorkerThread\","
|
| + "\"line_number\":236"
|
| + "}"
|
| + "}"
|
| + "]"
|
| + "}";
|
| + EXPECT_EQ(one_line_result, json);
|
| +}
|
| +
|
| TEST_F(TrackedObjectsTest, TwoLives) {
|
| - if (!ThreadData::StartTracking(true))
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| return;
|
|
|
| // Use a well named thread.
|
| ThreadData::InitializeThreadContext("SomeFileThreadName");
|
| - int fake_line_number = 222;
|
| + const int kFakeLineNumber = 222;
|
| const char* kFile = "AnotherFileName";
|
| const char* kFunction = "TwoLives";
|
| - Location location(kFunction, kFile, fake_line_number, NULL);
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
| // Do not delete birth. We don't own it.
|
| Births* birth = ThreadData::TallyABirthIfActive(location);
|
| EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
|
|
|
| - // TimeTicks initializers ar ein microseconds. Durations are calculated in
|
| - // milliseconds, so we need to use 1000x.
|
| - const base::TimeTicks time_posted = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(1);
|
| - const base::TimeTicks delayed_start_time = base::TimeTicks();
|
| - const base::TimeTicks start_of_run = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(5);
|
| - const base::TimeTicks end_of_run = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(7);
|
| - ThreadData::TallyADeathIfActive(birth, time_posted, delayed_start_time,
|
| - start_of_run, end_of_run);
|
|
|
| - birth = ThreadData::TallyABirthIfActive(location);
|
| - ThreadData::TallyADeathIfActive(birth, time_posted, delayed_start_time,
|
| - start_of_run, end_of_run);
|
| + const base::TimeTicks kTimePosted = base::TimeTicks()
|
| + + base::TimeDelta::FromMilliseconds(1);
|
| + const base::TimeTicks kDelayedStartTime = base::TimeTicks();
|
| + // TrackingInfo will call TallyABirth() during construction.
|
| + base::TrackingInfo pending_task(location, kDelayedStartTime);
|
| + pending_task.time_posted = kTimePosted; // Overwrite implied Now().
|
|
|
| - int process_type = 7;
|
| - scoped_ptr<base::Value> value(ThreadData::ToValue(process_type));
|
| + const TrackedTime kStartOfRun = TrackedTime() +
|
| + Duration::FromMilliseconds(5);
|
| + const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7);
|
| + ThreadData::TallyRunOnNamedThreadIfTracking(pending_task,
|
| + kStartOfRun, kEndOfRun);
|
| +
|
| + // TrackingInfo will call TallyABirth() during construction.
|
| + base::TrackingInfo pending_task2(location, kDelayedStartTime);
|
| + pending_task2.time_posted = kTimePosted; // Overwrite implied Now().
|
| +
|
| + ThreadData::TallyRunOnNamedThreadIfTracking(pending_task2,
|
| + kStartOfRun, kEndOfRun);
|
| +
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| std::string json;
|
| base::JSONWriter::Write(value.get(), false, &json);
|
| std::string one_line_result = "{"
|
| @@ -331,44 +531,43 @@
|
| "\"line_number\":222"
|
| "}"
|
| "}"
|
| - "],"
|
| - "\"process\":7"
|
| + "]"
|
| "}";
|
| - EXPECT_EQ(json, one_line_result);
|
| + EXPECT_EQ(one_line_result, json);
|
| }
|
|
|
| TEST_F(TrackedObjectsTest, DifferentLives) {
|
| - if (!ThreadData::StartTracking(true))
|
| + if (!ThreadData::InitializeAndSetTrackingStatus(true))
|
| return;
|
|
|
| // Use a well named thread.
|
| ThreadData::InitializeThreadContext("SomeFileThreadName");
|
| - int fake_line_number = 567;
|
| + const int kFakeLineNumber = 567;
|
| const char* kFile = "AnotherFileName";
|
| const char* kFunction = "DifferentLives";
|
| - Location location(kFunction, kFile, fake_line_number, NULL);
|
| - // Do not delete birth. We don't own it.
|
| - Births* birth = ThreadData::TallyABirthIfActive(location);
|
| - EXPECT_NE(birth, reinterpret_cast<Births*>(NULL));
|
| + Location location(kFunction, kFile, kFakeLineNumber, NULL);
|
|
|
| - // TimeTicks initializers ar ein microseconds. Durations are calculated in
|
| - // milliseconds, so we need to use 1000x.
|
| - const base::TimeTicks time_posted = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(1);
|
| - const base::TimeTicks delayed_start_time = base::TimeTicks();
|
| - const base::TimeTicks start_of_run = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(5);
|
| - const base::TimeTicks end_of_run = base::TimeTicks() +
|
| - base::TimeDelta::FromMilliseconds(7);
|
| - ThreadData::TallyADeathIfActive(birth, time_posted, delayed_start_time,
|
| - start_of_run, end_of_run);
|
| + const base::TimeTicks kTimePosted = base::TimeTicks()
|
| + + base::TimeDelta::FromMilliseconds(1);
|
| + const base::TimeTicks kDelayedStartTime = base::TimeTicks();
|
| + // TrackingInfo will call TallyABirth() during construction.
|
| + base::TrackingInfo pending_task(location, kDelayedStartTime);
|
| + pending_task.time_posted = kTimePosted; // Overwrite implied Now().
|
|
|
| - int second_fake_line_number = 999;
|
| - Location second_location(kFunction, kFile, second_fake_line_number, NULL);
|
| - birth = ThreadData::TallyABirthIfActive(second_location);
|
| + const TrackedTime kStartOfRun = TrackedTime() +
|
| + Duration::FromMilliseconds(5);
|
| + const TrackedTime kEndOfRun = TrackedTime() + Duration::FromMilliseconds(7);
|
| + ThreadData::TallyRunOnNamedThreadIfTracking(pending_task,
|
| + kStartOfRun, kEndOfRun);
|
|
|
| - int process_type = 2;
|
| - scoped_ptr<base::Value> value(ThreadData::ToValue(process_type));
|
| + const int kSecondFakeLineNumber = 999;
|
| + Location second_location(kFunction, kFile, kSecondFakeLineNumber, NULL);
|
| +
|
| + // TrackingInfo will call TallyABirth() during construction.
|
| + base::TrackingInfo pending_task2(second_location, kDelayedStartTime);
|
| + pending_task2.time_posted = kTimePosted; // Overwrite implied Now().
|
| +
|
| + scoped_ptr<base::Value> value(ThreadData::ToValue());
|
| std::string json;
|
| base::JSONWriter::Write(value.get(), false, &json);
|
| std::string one_line_result = "{"
|
| @@ -401,10 +600,9 @@
|
| "\"line_number\":999"
|
| "}"
|
| "}"
|
| - "],"
|
| - "\"process\":2"
|
| + "]"
|
| "}";
|
| - EXPECT_EQ(json, one_line_result);
|
| + EXPECT_EQ(one_line_result, json);
|
| }
|
|
|
| } // namespace tracked_objects
|
|
|