OLD | NEW |
(Empty) | |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "base/metrics/activity_tracker.h" |
| 6 |
| 7 #include <memory> |
| 8 |
| 9 #include "base/bind.h" |
| 10 #include "base/files/file.h" |
| 11 #include "base/files/file_util.h" |
| 12 #include "base/files/memory_mapped_file.h" |
| 13 #include "base/files/scoped_temp_dir.h" |
| 14 #include "base/memory/ptr_util.h" |
| 15 #include "base/pending_task.h" |
| 16 #include "testing/gtest/include/gtest/gtest.h" |
| 17 |
| 18 namespace base { |
| 19 |
| 20 namespace { |
| 21 |
| 22 class TestActivityTracker : public ThreadActivityTracker { |
| 23 public: |
| 24 TestActivityTracker(std::unique_ptr<char[]> memory, size_t mem_size) |
| 25 : ThreadActivityTracker(memset(memory.get(), 0, mem_size), mem_size), |
| 26 mem_segment_(std::move(memory)) {} |
| 27 |
| 28 ~TestActivityTracker() override { |
| 29 delete GlobalActivityTracker::Get(); |
| 30 } |
| 31 |
| 32 private: |
| 33 std::unique_ptr<char[]> mem_segment_; |
| 34 }; |
| 35 |
| 36 } // namespace |
| 37 |
| 38 |
| 39 class ActivityTrackerTest : public testing::Test { |
| 40 public: |
| 41 const int kMemorySize = 1 << 10; // 1KiB |
| 42 const int kStackSize = 256; |
| 43 |
| 44 ActivityTrackerTest() {} |
| 45 |
| 46 ~ActivityTrackerTest() {} |
| 47 |
| 48 std::unique_ptr<ThreadActivityTracker> CreateActivityTracker() { |
| 49 std::unique_ptr<char[]> memory(new char[kStackSize]); |
| 50 return WrapUnique(new TestActivityTracker(std::move(memory), kStackSize)); |
| 51 } |
| 52 |
| 53 static void DoNothing() {} |
| 54 }; |
| 55 |
| 56 TEST_F(ActivityTrackerTest, PushPopTest) { |
| 57 std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker(); |
| 58 std::vector<ThreadActivityTracker::StackEntry> stack; |
| 59 |
| 60 ASSERT_EQ(0U, tracker->CopyStack(&stack)); |
| 61 ASSERT_EQ(0U, stack.size()); |
| 62 |
| 63 char source1; |
| 64 tracker->RecordStart(&source1, ThreadActivityTracker::ACT_TASK, 2, 3); |
| 65 ASSERT_EQ(1U, tracker->CopyStack(&stack)); |
| 66 ASSERT_EQ(1U, stack.size()); |
| 67 EXPECT_NE(0, stack[0].time_ticks); |
| 68 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[0].activity_type); |
| 69 EXPECT_EQ(reinterpret_cast<intptr_t>(&source1), stack[0].source_address); |
| 70 EXPECT_EQ(2, stack[0].method_address); |
| 71 EXPECT_EQ(3U, stack[0].sequence_id); |
| 72 |
| 73 char source2; |
| 74 tracker->RecordStart(&source2, ThreadActivityTracker::ACT_LOCK, 3, 4); |
| 75 ASSERT_EQ(2U, tracker->CopyStack(&stack)); |
| 76 ASSERT_EQ(2U, stack.size()); |
| 77 EXPECT_LE(stack[0].time_ticks, stack[1].time_ticks); |
| 78 EXPECT_EQ(ThreadActivityTracker::ACT_LOCK, stack[1].activity_type); |
| 79 EXPECT_EQ(reinterpret_cast<intptr_t>(&source2), stack[1].source_address); |
| 80 EXPECT_EQ(3, stack[1].method_address); |
| 81 EXPECT_EQ(4U, stack[1].sequence_id); |
| 82 |
| 83 tracker->RecordFinish(&source2); |
| 84 ASSERT_EQ(1U, tracker->CopyStack(&stack)); |
| 85 ASSERT_EQ(1U, stack.size()); |
| 86 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[0].activity_type); |
| 87 EXPECT_EQ(reinterpret_cast<intptr_t>(&source1), stack[0].source_address); |
| 88 EXPECT_EQ(2, stack[0].method_address); |
| 89 EXPECT_EQ(3U, stack[0].sequence_id); |
| 90 |
| 91 tracker->RecordFinish(&source1); |
| 92 ASSERT_EQ(0U, tracker->CopyStack(&stack)); |
| 93 ASSERT_EQ(0U, stack.size()); |
| 94 } |
| 95 |
| 96 TEST_F(ActivityTrackerTest, ScopedTaskTest) { |
| 97 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", kStackSize); |
| 98 |
| 99 ThreadActivityTracker* tracker = |
| 100 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); |
| 101 std::vector<ThreadActivityTracker::StackEntry> stack; |
| 102 |
| 103 ASSERT_EQ(0U, tracker->CopyStack(&stack)); |
| 104 ASSERT_EQ(0U, stack.size()); |
| 105 |
| 106 { |
| 107 PendingTask task1(FROM_HERE, base::Bind(&DoNothing)); |
| 108 ScopedTaskActivity activity1(task1); |
| 109 |
| 110 ASSERT_EQ(1U, tracker->CopyStack(&stack)); |
| 111 ASSERT_EQ(1U, stack.size()); |
| 112 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[0].activity_type); |
| 113 |
| 114 { |
| 115 PendingTask task2(FROM_HERE, base::Bind(&DoNothing)); |
| 116 ScopedTaskActivity activity2(task2); |
| 117 |
| 118 ASSERT_EQ(2U, tracker->CopyStack(&stack)); |
| 119 ASSERT_EQ(2U, stack.size()); |
| 120 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[1].activity_type); |
| 121 } |
| 122 |
| 123 ASSERT_EQ(1U, tracker->CopyStack(&stack)); |
| 124 ASSERT_EQ(1U, stack.size()); |
| 125 EXPECT_EQ(ThreadActivityTracker::ACT_TASK, stack[0].activity_type); |
| 126 } |
| 127 |
| 128 ASSERT_EQ(0U, tracker->CopyStack(&stack)); |
| 129 ASSERT_EQ(0U, stack.size()); |
| 130 } |
| 131 |
| 132 } // namespace base |
OLD | NEW |