OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 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 #include "base/debug/activity_tracker.h" | 5 #include "base/debug/activity_tracker.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/files/file.h" | 10 #include "base/files/file.h" |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 return GlobalActivityTracker::Get()->user_data_allocator_.cache_used(); | 84 return GlobalActivityTracker::Get()->user_data_allocator_.cache_used(); |
85 } | 85 } |
86 | 86 |
87 static void DoNothing() {} | 87 static void DoNothing() {} |
88 }; | 88 }; |
89 | 89 |
90 TEST_F(ActivityTrackerTest, UserDataTest) { | 90 TEST_F(ActivityTrackerTest, UserDataTest) { |
91 char buffer[256]; | 91 char buffer[256]; |
92 memset(buffer, 0, sizeof(buffer)); | 92 memset(buffer, 0, sizeof(buffer)); |
93 ActivityUserData data(buffer, sizeof(buffer)); | 93 ActivityUserData data(buffer, sizeof(buffer)); |
94 ASSERT_EQ(sizeof(buffer), data.available_); | 94 ASSERT_EQ(sizeof(buffer) - 8, data.available_); |
95 | 95 |
96 data.SetInt("foo", 1); | 96 data.SetInt("foo", 1); |
97 ASSERT_EQ(sizeof(buffer) - 24, data.available_); | 97 ASSERT_EQ(sizeof(buffer) - 8 - 24, data.available_); |
98 | 98 |
99 data.SetUint("b", 1U); // Small names fit beside header in a word. | 99 data.SetUint("b", 1U); // Small names fit beside header in a word. |
100 ASSERT_EQ(sizeof(buffer) - 24 - 16, data.available_); | 100 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16, data.available_); |
101 | 101 |
102 data.Set("c", buffer, 10); | 102 data.Set("c", buffer, 10); |
103 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24, data.available_); | 103 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24, data.available_); |
104 | 104 |
105 data.SetString("dear john", "it's been fun"); | 105 data.SetString("dear john", "it's been fun"); |
106 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32, data.available_); | 106 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32, data.available_); |
107 | 107 |
108 data.Set("c", buffer, 20); | 108 data.Set("c", buffer, 20); |
109 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32, data.available_); | 109 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32, data.available_); |
110 | 110 |
111 data.SetString("dear john", "but we're done together"); | 111 data.SetString("dear john", "but we're done together"); |
112 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32, data.available_); | 112 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32, data.available_); |
113 | 113 |
114 data.SetString("dear john", "bye"); | 114 data.SetString("dear john", "bye"); |
115 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32, data.available_); | 115 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32, data.available_); |
116 | 116 |
117 data.SetChar("d", 'x'); | 117 data.SetChar("d", 'x'); |
118 ASSERT_EQ(sizeof(buffer) - 24 - 16 - 24 - 32 - 16, data.available_); | 118 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32 - 8, data.available_); |
| 119 |
| 120 data.SetBool("ee", true); |
| 121 ASSERT_EQ(sizeof(buffer) - 8 - 24 - 16 - 24 - 32 - 8 - 16, data.available_); |
119 } | 122 } |
120 | 123 |
121 TEST_F(ActivityTrackerTest, PushPopTest) { | 124 TEST_F(ActivityTrackerTest, PushPopTest) { |
122 std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker(); | 125 std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker(); |
123 ActivitySnapshot snapshot; | 126 ThreadActivityTracker::Snapshot snapshot; |
124 | 127 |
125 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 128 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
126 ASSERT_EQ(0U, snapshot.activity_stack_depth); | 129 ASSERT_EQ(0U, snapshot.activity_stack_depth); |
127 ASSERT_EQ(0U, snapshot.activity_stack.size()); | 130 ASSERT_EQ(0U, snapshot.activity_stack.size()); |
128 | 131 |
129 char origin1; | 132 char origin1; |
130 ActivityId id1 = tracker->PushActivity(&origin1, Activity::ACT_TASK, | 133 ActivityId id1 = tracker->PushActivity(&origin1, Activity::ACT_TASK, |
131 ActivityData::ForTask(11)); | 134 ActivityData::ForTask(11)); |
132 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 135 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
133 ASSERT_EQ(1U, snapshot.activity_stack_depth); | 136 ASSERT_EQ(1U, snapshot.activity_stack_depth); |
134 ASSERT_EQ(1U, snapshot.activity_stack.size()); | 137 ASSERT_EQ(1U, snapshot.activity_stack.size()); |
135 EXPECT_NE(0, snapshot.activity_stack[0].time_internal); | 138 EXPECT_NE(0, snapshot.activity_stack[0].time_internal); |
136 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); | 139 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); |
137 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1), | 140 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1), |
138 snapshot.activity_stack[0].origin_address); | 141 snapshot.activity_stack[0].origin_address); |
139 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); | 142 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); |
140 | 143 |
141 char origin2; | 144 char origin2; |
142 char lock2; | 145 char lock2; |
143 ActivityId id2 = tracker->PushActivity(&origin2, Activity::ACT_LOCK, | 146 ActivityId id2 = tracker->PushActivity(&origin2, Activity::ACT_LOCK, |
144 ActivityData::ForLock(&lock2)); | 147 ActivityData::ForLock(&lock2)); |
145 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 148 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
146 ASSERT_EQ(2U, snapshot.activity_stack_depth); | 149 ASSERT_EQ(2U, snapshot.activity_stack_depth); |
147 ASSERT_EQ(2U, snapshot.activity_stack.size()); | 150 ASSERT_EQ(2U, snapshot.activity_stack.size()); |
148 EXPECT_LE(snapshot.activity_stack[0].time_internal, | 151 EXPECT_LE(snapshot.activity_stack[0].time_internal, |
149 snapshot.activity_stack[1].time_internal); | 152 snapshot.activity_stack[1].time_internal); |
150 EXPECT_EQ(Activity::ACT_LOCK, snapshot.activity_stack[1].activity_type); | 153 EXPECT_EQ(Activity::ACT_LOCK, snapshot.activity_stack[1].activity_type); |
151 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin2), | 154 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin2), |
152 snapshot.activity_stack[1].origin_address); | 155 snapshot.activity_stack[1].origin_address); |
153 EXPECT_EQ(reinterpret_cast<uintptr_t>(&lock2), | 156 EXPECT_EQ(reinterpret_cast<uintptr_t>(&lock2), |
154 snapshot.activity_stack[1].data.lock.lock_address); | 157 snapshot.activity_stack[1].data.lock.lock_address); |
155 | 158 |
156 tracker->PopActivity(id2); | 159 tracker->PopActivity(id2); |
157 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 160 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
158 ASSERT_EQ(1U, snapshot.activity_stack_depth); | 161 ASSERT_EQ(1U, snapshot.activity_stack_depth); |
159 ASSERT_EQ(1U, snapshot.activity_stack.size()); | 162 ASSERT_EQ(1U, snapshot.activity_stack.size()); |
160 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); | 163 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); |
161 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1), | 164 EXPECT_EQ(reinterpret_cast<uintptr_t>(&origin1), |
162 snapshot.activity_stack[0].origin_address); | 165 snapshot.activity_stack[0].origin_address); |
163 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); | 166 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); |
164 | 167 |
165 tracker->PopActivity(id1); | 168 tracker->PopActivity(id1); |
166 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 169 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
167 ASSERT_EQ(0U, snapshot.activity_stack_depth); | 170 ASSERT_EQ(0U, snapshot.activity_stack_depth); |
168 ASSERT_EQ(0U, snapshot.activity_stack.size()); | 171 ASSERT_EQ(0U, snapshot.activity_stack.size()); |
169 } | 172 } |
170 | 173 |
171 TEST_F(ActivityTrackerTest, ScopedTaskTest) { | 174 TEST_F(ActivityTrackerTest, ScopedTaskTest) { |
172 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 175 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); |
173 | 176 |
174 ThreadActivityTracker* tracker = | 177 ThreadActivityTracker* tracker = |
175 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); | 178 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); |
176 ActivitySnapshot snapshot; | 179 ThreadActivityTracker::Snapshot snapshot; |
177 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); | 180 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); |
178 | 181 |
179 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 182 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
180 ASSERT_EQ(0U, snapshot.activity_stack_depth); | 183 ASSERT_EQ(0U, snapshot.activity_stack_depth); |
181 ASSERT_EQ(0U, snapshot.activity_stack.size()); | 184 ASSERT_EQ(0U, snapshot.activity_stack.size()); |
182 | 185 |
183 { | 186 { |
184 PendingTask task1(FROM_HERE, base::Bind(&DoNothing)); | 187 PendingTask task1(FROM_HERE, base::Bind(&DoNothing)); |
185 ScopedTaskRunActivity activity1(task1); | 188 ScopedTaskRunActivity activity1(task1); |
186 ActivityUserData& user_data1 = activity1.user_data(); | 189 ActivityUserData& user_data1 = activity1.user_data(); |
187 (void)user_data1; // Tell compiler it's been used. | 190 (void)user_data1; // Tell compiler it's been used. |
188 | 191 |
189 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 192 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
190 ASSERT_EQ(1U, snapshot.activity_stack_depth); | 193 ASSERT_EQ(1U, snapshot.activity_stack_depth); |
191 ASSERT_EQ(1U, snapshot.activity_stack.size()); | 194 ASSERT_EQ(1U, snapshot.activity_stack.size()); |
192 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); | 195 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); |
193 | 196 |
194 { | 197 { |
195 PendingTask task2(FROM_HERE, base::Bind(&DoNothing)); | 198 PendingTask task2(FROM_HERE, base::Bind(&DoNothing)); |
196 ScopedTaskRunActivity activity2(task2); | 199 ScopedTaskRunActivity activity2(task2); |
197 ActivityUserData& user_data2 = activity2.user_data(); | 200 ActivityUserData& user_data2 = activity2.user_data(); |
198 (void)user_data2; // Tell compiler it's been used. | 201 (void)user_data2; // Tell compiler it's been used. |
199 | 202 |
200 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 203 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
201 ASSERT_EQ(2U, snapshot.activity_stack_depth); | 204 ASSERT_EQ(2U, snapshot.activity_stack_depth); |
202 ASSERT_EQ(2U, snapshot.activity_stack.size()); | 205 ASSERT_EQ(2U, snapshot.activity_stack.size()); |
203 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[1].activity_type); | 206 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[1].activity_type); |
204 } | 207 } |
205 | 208 |
206 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 209 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
207 ASSERT_EQ(1U, snapshot.activity_stack_depth); | 210 ASSERT_EQ(1U, snapshot.activity_stack_depth); |
208 ASSERT_EQ(1U, snapshot.activity_stack.size()); | 211 ASSERT_EQ(1U, snapshot.activity_stack.size()); |
209 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); | 212 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); |
210 } | 213 } |
211 | 214 |
212 ASSERT_TRUE(tracker->Snapshot(&snapshot)); | 215 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); |
213 ASSERT_EQ(0U, snapshot.activity_stack_depth); | 216 ASSERT_EQ(0U, snapshot.activity_stack_depth); |
214 ASSERT_EQ(0U, snapshot.activity_stack.size()); | 217 ASSERT_EQ(0U, snapshot.activity_stack.size()); |
215 ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed()); | 218 ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed()); |
216 } | 219 } |
217 | 220 |
218 TEST_F(ActivityTrackerTest, CreateWithFileTest) { | 221 TEST_F(ActivityTrackerTest, CreateWithFileTest) { |
219 const char temp_name[] = "CreateWithFileTest"; | 222 const char temp_name[] = "CreateWithFileTest"; |
220 ScopedTempDir temp_dir; | 223 ScopedTempDir temp_dir; |
221 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 224 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
222 FilePath temp_file = temp_dir.GetPath().AppendASCII(temp_name); | 225 FilePath temp_file = temp_dir.GetPath().AppendASCII(temp_name); |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
324 EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount()); | 327 EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount()); |
325 | 328 |
326 t2.Exit(); | 329 t2.Exit(); |
327 t2.Join(); | 330 t2.Join(); |
328 EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount()); | 331 EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount()); |
329 EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount()); | 332 EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount()); |
330 } | 333 } |
331 | 334 |
332 } // namespace debug | 335 } // namespace debug |
333 } // namespace base | 336 } // namespace base |
OLD | NEW |