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_analyzer.h" | 5 #include "base/debug/activity_analyzer.h" |
6 | 6 |
7 #include <atomic> | 7 #include <atomic> |
8 #include <memory> | 8 #include <memory> |
9 | 9 |
| 10 #include "base/auto_reset.h" |
10 #include "base/bind.h" | 11 #include "base/bind.h" |
11 #include "base/debug/activity_tracker.h" | 12 #include "base/debug/activity_tracker.h" |
12 #include "base/files/file.h" | 13 #include "base/files/file.h" |
13 #include "base/files/file_util.h" | 14 #include "base/files/file_util.h" |
14 #include "base/files/memory_mapped_file.h" | 15 #include "base/files/memory_mapped_file.h" |
15 #include "base/files/scoped_temp_dir.h" | 16 #include "base/files/scoped_temp_dir.h" |
16 #include "base/memory/ptr_util.h" | 17 #include "base/memory/ptr_util.h" |
17 #include "base/pending_task.h" | 18 #include "base/pending_task.h" |
18 #include "base/process/process.h" | 19 #include "base/process/process.h" |
19 #include "base/stl_util.h" | 20 #include "base/stl_util.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 global_tracker->ReleaseTrackerForCurrentThreadForTesting(); | 59 global_tracker->ReleaseTrackerForCurrentThreadForTesting(); |
59 delete global_tracker; | 60 delete global_tracker; |
60 } | 61 } |
61 } | 62 } |
62 | 63 |
63 std::unique_ptr<ThreadActivityTracker> CreateActivityTracker() { | 64 std::unique_ptr<ThreadActivityTracker> CreateActivityTracker() { |
64 std::unique_ptr<char[]> memory(new char[kStackSize]); | 65 std::unique_ptr<char[]> memory(new char[kStackSize]); |
65 return MakeUnique<TestActivityTracker>(std::move(memory), kStackSize); | 66 return MakeUnique<TestActivityTracker>(std::move(memory), kStackSize); |
66 } | 67 } |
67 | 68 |
| 69 template <typename Function> |
| 70 void AsOtherProcess(int64_t pid, Function function) { |
| 71 GlobalActivityTracker::Get() |
| 72 ->GlobalActivityTracker::ReleaseTrackerForCurrentThreadForTesting(); |
| 73 std::unique_ptr<GlobalActivityTracker> old_global = |
| 74 GlobalActivityTracker::ReleaseForTesting(); |
| 75 ASSERT_TRUE(old_global); |
| 76 |
| 77 PersistentMemoryAllocator* old_allocator = old_global->allocator(); |
| 78 std::unique_ptr<PersistentMemoryAllocator> new_allocator( |
| 79 MakeUnique<PersistentMemoryAllocator>( |
| 80 const_cast<void*>(old_allocator->data()), old_allocator->size(), 0, |
| 81 0, "", false)); |
| 82 GlobalActivityTracker::CreateWithAllocator(std::move(new_allocator), 3, |
| 83 pid); |
| 84 |
| 85 function(); |
| 86 |
| 87 GlobalActivityTracker::Get() |
| 88 ->GlobalActivityTracker::ReleaseTrackerForCurrentThreadForTesting(); |
| 89 GlobalActivityTracker::ReleaseForTesting(); |
| 90 GlobalActivityTracker::SetForTesting(std::move(old_global)); |
| 91 } |
| 92 |
68 static void DoNothing() {} | 93 static void DoNothing() {} |
69 }; | 94 }; |
70 | 95 |
71 TEST_F(ActivityAnalyzerTest, ThreadAnalyzerConstruction) { | 96 TEST_F(ActivityAnalyzerTest, ThreadAnalyzerConstruction) { |
72 std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker(); | 97 std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker(); |
73 { | 98 { |
74 ThreadActivityAnalyzer analyzer(*tracker); | 99 ThreadActivityAnalyzer analyzer(*tracker); |
75 EXPECT_TRUE(analyzer.IsValid()); | 100 EXPECT_TRUE(analyzer.IsValid()); |
76 EXPECT_EQ(PlatformThread::GetName(), analyzer.GetThreadName()); | 101 EXPECT_EQ(PlatformThread::GetName(), analyzer.GetThreadName()); |
77 } | 102 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 | 156 |
132 std::atomic<bool> ready_; | 157 std::atomic<bool> ready_; |
133 std::atomic<bool> exit_; | 158 std::atomic<bool> exit_; |
134 Lock lock_; | 159 Lock lock_; |
135 ConditionVariable exit_condition_; | 160 ConditionVariable exit_condition_; |
136 | 161 |
137 DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread); | 162 DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread); |
138 }; | 163 }; |
139 | 164 |
140 TEST_F(ActivityAnalyzerTest, GlobalAnalyzerConstruction) { | 165 TEST_F(ActivityAnalyzerTest, GlobalAnalyzerConstruction) { |
141 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 166 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
| 167 GlobalActivityTracker::Get()->process_data().SetString("foo", "bar"); |
142 | 168 |
143 PersistentMemoryAllocator* allocator = | 169 PersistentMemoryAllocator* allocator = |
144 GlobalActivityTracker::Get()->allocator(); | 170 GlobalActivityTracker::Get()->allocator(); |
145 GlobalActivityAnalyzer analyzer(MakeUnique<PersistentMemoryAllocator>( | 171 GlobalActivityAnalyzer analyzer(MakeUnique<PersistentMemoryAllocator>( |
146 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); | 172 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); |
147 | 173 |
148 // The only thread at thois point is the test thread. | 174 // The only thread at this point is the test thread of this process. |
149 ThreadActivityAnalyzer* ta1 = analyzer.GetFirstAnalyzer(); | 175 const int64_t pid = analyzer.GetFirstProcess(); |
| 176 ASSERT_NE(0, pid); |
| 177 ThreadActivityAnalyzer* ta1 = analyzer.GetFirstAnalyzer(pid); |
150 ASSERT_TRUE(ta1); | 178 ASSERT_TRUE(ta1); |
151 EXPECT_FALSE(analyzer.GetNextAnalyzer()); | 179 EXPECT_FALSE(analyzer.GetNextAnalyzer()); |
152 ThreadActivityAnalyzer::ThreadKey tk1 = ta1->GetThreadKey(); | 180 ThreadActivityAnalyzer::ThreadKey tk1 = ta1->GetThreadKey(); |
153 EXPECT_EQ(ta1, analyzer.GetAnalyzerForThread(tk1)); | 181 EXPECT_EQ(ta1, analyzer.GetAnalyzerForThread(tk1)); |
| 182 EXPECT_EQ(0, analyzer.GetNextProcess()); |
154 | 183 |
155 // Create a second thread that will do something. | 184 // Create a second thread that will do something. |
156 SimpleActivityThread t2("t2", nullptr, Activity::ACT_TASK, | 185 SimpleActivityThread t2("t2", nullptr, Activity::ACT_TASK, |
157 ActivityData::ForTask(11)); | 186 ActivityData::ForTask(11)); |
158 t2.Start(); | 187 t2.Start(); |
159 t2.WaitReady(); | 188 t2.WaitReady(); |
160 | 189 |
161 // Now there should be two. | 190 // Now there should be two. Calling GetFirstProcess invalidates any |
162 EXPECT_TRUE(analyzer.GetFirstAnalyzer()); | 191 // previously returned analyzer pointers. |
| 192 ASSERT_EQ(pid, analyzer.GetFirstProcess()); |
| 193 EXPECT_TRUE(analyzer.GetFirstAnalyzer(pid)); |
163 EXPECT_TRUE(analyzer.GetNextAnalyzer()); | 194 EXPECT_TRUE(analyzer.GetNextAnalyzer()); |
164 EXPECT_FALSE(analyzer.GetNextAnalyzer()); | 195 EXPECT_FALSE(analyzer.GetNextAnalyzer()); |
| 196 EXPECT_EQ(0, analyzer.GetNextProcess()); |
165 | 197 |
166 // Let thread exit. | 198 // Let thread exit. |
167 t2.Exit(); | 199 t2.Exit(); |
168 t2.Join(); | 200 t2.Join(); |
169 | 201 |
170 // Now there should be only one again. Calling GetFirstAnalyzer invalidates | 202 // Now there should be only one again. |
171 // any previously returned analyzer pointers. | 203 ASSERT_EQ(pid, analyzer.GetFirstProcess()); |
172 ThreadActivityAnalyzer* ta2 = analyzer.GetFirstAnalyzer(); | 204 ThreadActivityAnalyzer* ta2 = analyzer.GetFirstAnalyzer(pid); |
173 ASSERT_TRUE(ta2); | 205 ASSERT_TRUE(ta2); |
174 EXPECT_FALSE(analyzer.GetNextAnalyzer()); | 206 EXPECT_FALSE(analyzer.GetNextAnalyzer()); |
175 ThreadActivityAnalyzer::ThreadKey tk2 = ta2->GetThreadKey(); | 207 ThreadActivityAnalyzer::ThreadKey tk2 = ta2->GetThreadKey(); |
176 EXPECT_EQ(ta2, analyzer.GetAnalyzerForThread(tk2)); | 208 EXPECT_EQ(ta2, analyzer.GetAnalyzerForThread(tk2)); |
177 EXPECT_EQ(tk1, tk2); | 209 EXPECT_EQ(tk1, tk2); |
| 210 EXPECT_EQ(0, analyzer.GetNextProcess()); |
| 211 |
| 212 // Verify that there is process data. |
| 213 const ActivityUserData::Snapshot& data_snapshot = |
| 214 analyzer.GetProcessDataSnapshot(pid); |
| 215 ASSERT_LE(1U, data_snapshot.size()); |
| 216 EXPECT_EQ("bar", data_snapshot.at("foo").GetString()); |
178 } | 217 } |
179 | 218 |
180 TEST_F(ActivityAnalyzerTest, UserDataSnapshotTest) { | 219 TEST_F(ActivityAnalyzerTest, UserDataSnapshotTest) { |
181 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 220 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
182 ThreadActivityAnalyzer::Snapshot snapshot; | 221 ThreadActivityAnalyzer::Snapshot tracker_snapshot; |
183 | 222 |
184 const char string1a[] = "string1a"; | 223 const char string1a[] = "string1a"; |
185 const char string1b[] = "string1b"; | 224 const char string1b[] = "string1b"; |
186 const char string2a[] = "string2a"; | 225 const char string2a[] = "string2a"; |
187 const char string2b[] = "string2b"; | 226 const char string2b[] = "string2b"; |
188 | 227 |
189 PersistentMemoryAllocator* allocator = | 228 PersistentMemoryAllocator* allocator = |
190 GlobalActivityTracker::Get()->allocator(); | 229 GlobalActivityTracker::Get()->allocator(); |
191 GlobalActivityAnalyzer global_analyzer(MakeUnique<PersistentMemoryAllocator>( | 230 GlobalActivityAnalyzer global_analyzer(MakeUnique<PersistentMemoryAllocator>( |
192 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); | 231 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); |
(...skipping 18 matching lines...) Expand all Loading... |
211 ActivityUserData& user_data2 = activity2.user_data(); | 250 ActivityUserData& user_data2 = activity2.user_data(); |
212 user_data2.Set("raw2", "foo2", 4); | 251 user_data2.Set("raw2", "foo2", 4); |
213 user_data2.SetString("string2", "bar2"); | 252 user_data2.SetString("string2", "bar2"); |
214 user_data2.SetChar("char2", '2'); | 253 user_data2.SetChar("char2", '2'); |
215 user_data2.SetInt("int2", -2222); | 254 user_data2.SetInt("int2", -2222); |
216 user_data2.SetUint("uint2", 2222); | 255 user_data2.SetUint("uint2", 2222); |
217 user_data2.SetBool("bool2", false); | 256 user_data2.SetBool("bool2", false); |
218 user_data2.SetReference("ref2", string2a, sizeof(string2a)); | 257 user_data2.SetReference("ref2", string2a, sizeof(string2a)); |
219 user_data2.SetStringReference("sref2", string2b); | 258 user_data2.SetStringReference("sref2", string2b); |
220 | 259 |
221 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); | 260 ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot)); |
222 ASSERT_EQ(2U, snapshot.activity_stack.size()); | 261 ASSERT_EQ(2U, tracker_snapshot.activity_stack.size()); |
223 | 262 |
224 ThreadActivityAnalyzer analyzer(*tracker); | 263 ThreadActivityAnalyzer analyzer(*tracker); |
225 analyzer.AddGlobalInformation(&global_analyzer); | 264 analyzer.AddGlobalInformation(&global_analyzer); |
226 const ThreadActivityAnalyzer::Snapshot& snapshot = | 265 const ThreadActivityAnalyzer::Snapshot& analyzer_snapshot = |
227 analyzer.activity_snapshot(); | 266 analyzer.activity_snapshot(); |
228 ASSERT_EQ(2U, snapshot.user_data_stack.size()); | 267 ASSERT_EQ(2U, analyzer_snapshot.user_data_stack.size()); |
229 const ActivityUserData::Snapshot& user_data = | 268 const ActivityUserData::Snapshot& user_data = |
230 snapshot.user_data_stack.at(1); | 269 analyzer_snapshot.user_data_stack.at(1); |
231 EXPECT_EQ(8U, user_data.size()); | 270 EXPECT_EQ(8U, user_data.size()); |
232 ASSERT_TRUE(ContainsKey(user_data, "raw2")); | 271 ASSERT_TRUE(ContainsKey(user_data, "raw2")); |
233 EXPECT_EQ("foo2", user_data.at("raw2").Get().as_string()); | 272 EXPECT_EQ("foo2", user_data.at("raw2").Get().as_string()); |
234 ASSERT_TRUE(ContainsKey(user_data, "string2")); | 273 ASSERT_TRUE(ContainsKey(user_data, "string2")); |
235 EXPECT_EQ("bar2", user_data.at("string2").GetString().as_string()); | 274 EXPECT_EQ("bar2", user_data.at("string2").GetString().as_string()); |
236 ASSERT_TRUE(ContainsKey(user_data, "char2")); | 275 ASSERT_TRUE(ContainsKey(user_data, "char2")); |
237 EXPECT_EQ('2', user_data.at("char2").GetChar()); | 276 EXPECT_EQ('2', user_data.at("char2").GetChar()); |
238 ASSERT_TRUE(ContainsKey(user_data, "int2")); | 277 ASSERT_TRUE(ContainsKey(user_data, "int2")); |
239 EXPECT_EQ(-2222, user_data.at("int2").GetInt()); | 278 EXPECT_EQ(-2222, user_data.at("int2").GetInt()); |
240 ASSERT_TRUE(ContainsKey(user_data, "uint2")); | 279 ASSERT_TRUE(ContainsKey(user_data, "uint2")); |
241 EXPECT_EQ(2222U, user_data.at("uint2").GetUint()); | 280 EXPECT_EQ(2222U, user_data.at("uint2").GetUint()); |
242 ASSERT_TRUE(ContainsKey(user_data, "bool2")); | 281 ASSERT_TRUE(ContainsKey(user_data, "bool2")); |
243 EXPECT_FALSE(user_data.at("bool2").GetBool()); | 282 EXPECT_FALSE(user_data.at("bool2").GetBool()); |
244 ASSERT_TRUE(ContainsKey(user_data, "ref2")); | 283 ASSERT_TRUE(ContainsKey(user_data, "ref2")); |
245 EXPECT_EQ(string2a, user_data.at("ref2").GetReference().data()); | 284 EXPECT_EQ(string2a, user_data.at("ref2").GetReference().data()); |
246 EXPECT_EQ(sizeof(string2a), user_data.at("ref2").GetReference().size()); | 285 EXPECT_EQ(sizeof(string2a), user_data.at("ref2").GetReference().size()); |
247 ASSERT_TRUE(ContainsKey(user_data, "sref2")); | 286 ASSERT_TRUE(ContainsKey(user_data, "sref2")); |
248 EXPECT_EQ(string2b, user_data.at("sref2").GetStringReference().data()); | 287 EXPECT_EQ(string2b, user_data.at("sref2").GetStringReference().data()); |
249 EXPECT_EQ(strlen(string2b), | 288 EXPECT_EQ(strlen(string2b), |
250 user_data.at("sref2").GetStringReference().size()); | 289 user_data.at("sref2").GetStringReference().size()); |
251 } | 290 } |
252 | 291 |
253 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); | 292 ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot)); |
254 ASSERT_EQ(1U, snapshot.activity_stack.size()); | 293 ASSERT_EQ(1U, tracker_snapshot.activity_stack.size()); |
255 | 294 |
256 ThreadActivityAnalyzer analyzer(*tracker); | 295 ThreadActivityAnalyzer analyzer(*tracker); |
257 analyzer.AddGlobalInformation(&global_analyzer); | 296 analyzer.AddGlobalInformation(&global_analyzer); |
258 const ThreadActivityAnalyzer::Snapshot& snapshot = | 297 const ThreadActivityAnalyzer::Snapshot& analyzer_snapshot = |
259 analyzer.activity_snapshot(); | 298 analyzer.activity_snapshot(); |
260 ASSERT_EQ(1U, snapshot.user_data_stack.size()); | 299 ASSERT_EQ(1U, analyzer_snapshot.user_data_stack.size()); |
261 const ActivityUserData::Snapshot& user_data = | 300 const ActivityUserData::Snapshot& user_data = |
262 snapshot.user_data_stack.at(0); | 301 analyzer_snapshot.user_data_stack.at(0); |
263 EXPECT_EQ(8U, user_data.size()); | 302 EXPECT_EQ(8U, user_data.size()); |
264 EXPECT_EQ("foo1", user_data.at("raw1").Get().as_string()); | 303 EXPECT_EQ("foo1", user_data.at("raw1").Get().as_string()); |
265 EXPECT_EQ("bar1", user_data.at("string1").GetString().as_string()); | 304 EXPECT_EQ("bar1", user_data.at("string1").GetString().as_string()); |
266 EXPECT_EQ('1', user_data.at("char1").GetChar()); | 305 EXPECT_EQ('1', user_data.at("char1").GetChar()); |
267 EXPECT_EQ(-1111, user_data.at("int1").GetInt()); | 306 EXPECT_EQ(-1111, user_data.at("int1").GetInt()); |
268 EXPECT_EQ(1111U, user_data.at("uint1").GetUint()); | 307 EXPECT_EQ(1111U, user_data.at("uint1").GetUint()); |
269 EXPECT_TRUE(user_data.at("bool1").GetBool()); | 308 EXPECT_TRUE(user_data.at("bool1").GetBool()); |
270 EXPECT_EQ(string1a, user_data.at("ref1").GetReference().data()); | 309 EXPECT_EQ(string1a, user_data.at("ref1").GetReference().data()); |
271 EXPECT_EQ(sizeof(string1a), user_data.at("ref1").GetReference().size()); | 310 EXPECT_EQ(sizeof(string1a), user_data.at("ref1").GetReference().size()); |
272 EXPECT_EQ(string1b, user_data.at("sref1").GetStringReference().data()); | 311 EXPECT_EQ(string1b, user_data.at("sref1").GetStringReference().data()); |
273 EXPECT_EQ(strlen(string1b), | 312 EXPECT_EQ(strlen(string1b), |
274 user_data.at("sref1").GetStringReference().size()); | 313 user_data.at("sref1").GetStringReference().size()); |
275 } | 314 } |
276 | 315 |
277 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); | 316 ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot)); |
278 ASSERT_EQ(0U, snapshot.activity_stack.size()); | 317 ASSERT_EQ(0U, tracker_snapshot.activity_stack.size()); |
279 } | 318 } |
280 | 319 |
281 TEST_F(ActivityAnalyzerTest, GlobalUserDataTest) { | 320 TEST_F(ActivityAnalyzerTest, GlobalUserDataTest) { |
282 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 321 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
283 | 322 |
284 const char string1[] = "foo"; | 323 const char string1[] = "foo"; |
285 const char string2[] = "bar"; | 324 const char string2[] = "bar"; |
286 | 325 |
287 PersistentMemoryAllocator* allocator = | 326 PersistentMemoryAllocator* allocator = |
288 GlobalActivityTracker::Get()->allocator(); | 327 GlobalActivityTracker::Get()->allocator(); |
289 GlobalActivityAnalyzer global_analyzer(MakeUnique<PersistentMemoryAllocator>( | 328 GlobalActivityAnalyzer global_analyzer(MakeUnique<PersistentMemoryAllocator>( |
290 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); | 329 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); |
291 | 330 |
292 ActivityUserData& global_data = GlobalActivityTracker::Get()->global_data(); | 331 ActivityUserData& global_data = GlobalActivityTracker::Get()->global_data(); |
293 global_data.Set("raw", "foo", 3); | 332 global_data.Set("raw", "foo", 3); |
294 global_data.SetString("string", "bar"); | 333 global_data.SetString("string", "bar"); |
295 global_data.SetChar("char", '9'); | 334 global_data.SetChar("char", '9'); |
296 global_data.SetInt("int", -9999); | 335 global_data.SetInt("int", -9999); |
297 global_data.SetUint("uint", 9999); | 336 global_data.SetUint("uint", 9999); |
298 global_data.SetBool("bool", true); | 337 global_data.SetBool("bool", true); |
299 global_data.SetReference("ref", string1, sizeof(string1)); | 338 global_data.SetReference("ref", string1, sizeof(string1)); |
300 global_data.SetStringReference("sref", string2); | 339 global_data.SetStringReference("sref", string2); |
301 | 340 |
302 ActivityUserData::Snapshot snapshot = | 341 const ActivityUserData::Snapshot& snapshot = |
303 global_analyzer.GetGlobalUserDataSnapshot(); | 342 global_analyzer.GetGlobalDataSnapshot(); |
304 ASSERT_TRUE(ContainsKey(snapshot, "raw")); | 343 ASSERT_TRUE(ContainsKey(snapshot, "raw")); |
305 EXPECT_EQ("foo", snapshot.at("raw").Get().as_string()); | 344 EXPECT_EQ("foo", snapshot.at("raw").Get().as_string()); |
306 ASSERT_TRUE(ContainsKey(snapshot, "string")); | 345 ASSERT_TRUE(ContainsKey(snapshot, "string")); |
307 EXPECT_EQ("bar", snapshot.at("string").GetString().as_string()); | 346 EXPECT_EQ("bar", snapshot.at("string").GetString().as_string()); |
308 ASSERT_TRUE(ContainsKey(snapshot, "char")); | 347 ASSERT_TRUE(ContainsKey(snapshot, "char")); |
309 EXPECT_EQ('9', snapshot.at("char").GetChar()); | 348 EXPECT_EQ('9', snapshot.at("char").GetChar()); |
310 ASSERT_TRUE(ContainsKey(snapshot, "int")); | 349 ASSERT_TRUE(ContainsKey(snapshot, "int")); |
311 EXPECT_EQ(-9999, snapshot.at("int").GetInt()); | 350 EXPECT_EQ(-9999, snapshot.at("int").GetInt()); |
312 ASSERT_TRUE(ContainsKey(snapshot, "uint")); | 351 ASSERT_TRUE(ContainsKey(snapshot, "uint")); |
313 EXPECT_EQ(9999U, snapshot.at("uint").GetUint()); | 352 EXPECT_EQ(9999U, snapshot.at("uint").GetUint()); |
314 ASSERT_TRUE(ContainsKey(snapshot, "bool")); | 353 ASSERT_TRUE(ContainsKey(snapshot, "bool")); |
315 EXPECT_TRUE(snapshot.at("bool").GetBool()); | 354 EXPECT_TRUE(snapshot.at("bool").GetBool()); |
316 ASSERT_TRUE(ContainsKey(snapshot, "ref")); | 355 ASSERT_TRUE(ContainsKey(snapshot, "ref")); |
317 EXPECT_EQ(string1, snapshot.at("ref").GetReference().data()); | 356 EXPECT_EQ(string1, snapshot.at("ref").GetReference().data()); |
318 EXPECT_EQ(sizeof(string1), snapshot.at("ref").GetReference().size()); | 357 EXPECT_EQ(sizeof(string1), snapshot.at("ref").GetReference().size()); |
319 ASSERT_TRUE(ContainsKey(snapshot, "sref")); | 358 ASSERT_TRUE(ContainsKey(snapshot, "sref")); |
320 EXPECT_EQ(string2, snapshot.at("sref").GetStringReference().data()); | 359 EXPECT_EQ(string2, snapshot.at("sref").GetStringReference().data()); |
321 EXPECT_EQ(strlen(string2), snapshot.at("sref").GetStringReference().size()); | 360 EXPECT_EQ(strlen(string2), snapshot.at("sref").GetStringReference().size()); |
322 } | 361 } |
323 | 362 |
324 TEST_F(ActivityAnalyzerTest, GlobalModulesTest) { | 363 TEST_F(ActivityAnalyzerTest, GlobalModulesTest) { |
325 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 364 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
326 | 365 |
327 PersistentMemoryAllocator* allocator = | 366 PersistentMemoryAllocator* allocator = |
328 GlobalActivityTracker::Get()->allocator(); | 367 GlobalActivityTracker::Get()->allocator(); |
329 GlobalActivityAnalyzer global_analyzer(MakeUnique<PersistentMemoryAllocator>( | 368 GlobalActivityAnalyzer global_analyzer(MakeUnique<PersistentMemoryAllocator>( |
330 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); | 369 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); |
331 | 370 |
332 GlobalActivityTracker::ModuleInfo info1; | 371 GlobalActivityTracker::ModuleInfo info1; |
333 info1.is_loaded = true; | 372 info1.is_loaded = true; |
334 info1.address = 0x12345678; | 373 info1.address = 0x12345678; |
335 info1.load_time = 1111; | 374 info1.load_time = 1111; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
391 EXPECT_NE(info2.load_time, stored2.load_time); | 430 EXPECT_NE(info2.load_time, stored2.load_time); |
392 EXPECT_EQ(info2.size, stored2.size); | 431 EXPECT_EQ(info2.size, stored2.size); |
393 EXPECT_EQ(info2.timestamp, stored2.timestamp); | 432 EXPECT_EQ(info2.timestamp, stored2.timestamp); |
394 EXPECT_EQ(info2.age, stored2.age); | 433 EXPECT_EQ(info2.age, stored2.age); |
395 EXPECT_EQ(info2.identifier[0], stored2.identifier[0]); | 434 EXPECT_EQ(info2.identifier[0], stored2.identifier[0]); |
396 EXPECT_EQ(info2.file, stored2.file); | 435 EXPECT_EQ(info2.file, stored2.file); |
397 EXPECT_EQ(info2.debug_file, stored2.debug_file); | 436 EXPECT_EQ(info2.debug_file, stored2.debug_file); |
398 } | 437 } |
399 | 438 |
400 TEST_F(ActivityAnalyzerTest, GlobalLogMessages) { | 439 TEST_F(ActivityAnalyzerTest, GlobalLogMessages) { |
401 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); | 440 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0); |
402 | 441 |
403 PersistentMemoryAllocator* allocator = | 442 PersistentMemoryAllocator* allocator = |
404 GlobalActivityTracker::Get()->allocator(); | 443 GlobalActivityTracker::Get()->allocator(); |
405 GlobalActivityAnalyzer analyzer(MakeUnique<PersistentMemoryAllocator>( | 444 GlobalActivityAnalyzer analyzer(MakeUnique<PersistentMemoryAllocator>( |
406 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); | 445 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); |
407 | 446 |
408 GlobalActivityTracker::Get()->RecordLogMessage("hello world"); | 447 GlobalActivityTracker::Get()->RecordLogMessage("hello world"); |
409 GlobalActivityTracker::Get()->RecordLogMessage("foo bar"); | 448 GlobalActivityTracker::Get()->RecordLogMessage("foo bar"); |
410 | 449 |
411 std::vector<std::string> messages = analyzer.GetLogMessages(); | 450 std::vector<std::string> messages = analyzer.GetLogMessages(); |
412 ASSERT_EQ(2U, messages.size()); | 451 ASSERT_EQ(2U, messages.size()); |
413 EXPECT_EQ("hello world", messages[0]); | 452 EXPECT_EQ("hello world", messages[0]); |
414 EXPECT_EQ("foo bar", messages[1]); | 453 EXPECT_EQ("foo bar", messages[1]); |
415 } | 454 } |
416 | 455 |
| 456 TEST_F(ActivityAnalyzerTest, GlobalMultiProcess) { |
| 457 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 1001); |
| 458 GlobalActivityTracker* global = GlobalActivityTracker::Get(); |
| 459 PersistentMemoryAllocator* allocator = global->allocator(); |
| 460 EXPECT_EQ(1001, global->process_id()); |
| 461 |
| 462 int64_t process_id; |
| 463 int64_t create_stamp; |
| 464 ActivityUserData::GetOwningProcessId( |
| 465 GlobalActivityTracker::Get()->process_data().GetBaseAddress(), |
| 466 &process_id, &create_stamp); |
| 467 ASSERT_EQ(1001, process_id); |
| 468 |
| 469 GlobalActivityTracker::Get()->process_data().SetInt("pid", |
| 470 global->process_id()); |
| 471 |
| 472 GlobalActivityAnalyzer analyzer(MakeUnique<PersistentMemoryAllocator>( |
| 473 const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true)); |
| 474 |
| 475 AsOtherProcess(2002, [&global]() { |
| 476 ASSERT_NE(global, GlobalActivityTracker::Get()); |
| 477 EXPECT_EQ(2002, GlobalActivityTracker::Get()->process_id()); |
| 478 |
| 479 int64_t process_id; |
| 480 int64_t create_stamp; |
| 481 ActivityUserData::GetOwningProcessId( |
| 482 GlobalActivityTracker::Get()->process_data().GetBaseAddress(), |
| 483 &process_id, &create_stamp); |
| 484 ASSERT_EQ(2002, process_id); |
| 485 |
| 486 GlobalActivityTracker::Get()->process_data().SetInt( |
| 487 "pid", GlobalActivityTracker::Get()->process_id()); |
| 488 }); |
| 489 ASSERT_EQ(global, GlobalActivityTracker::Get()); |
| 490 EXPECT_EQ(1001, GlobalActivityTracker::Get()->process_id()); |
| 491 |
| 492 const int64_t pid1 = analyzer.GetFirstProcess(); |
| 493 ASSERT_EQ(1001, pid1); |
| 494 const int64_t pid2 = analyzer.GetNextProcess(); |
| 495 ASSERT_EQ(2002, pid2); |
| 496 EXPECT_EQ(0, analyzer.GetNextProcess()); |
| 497 |
| 498 const ActivityUserData::Snapshot& pdata1 = |
| 499 analyzer.GetProcessDataSnapshot(pid1); |
| 500 const ActivityUserData::Snapshot& pdata2 = |
| 501 analyzer.GetProcessDataSnapshot(pid2); |
| 502 EXPECT_EQ(1001, pdata1.at("pid").GetInt()); |
| 503 EXPECT_EQ(2002, pdata2.at("pid").GetInt()); |
| 504 } |
| 505 |
417 } // namespace debug | 506 } // namespace debug |
418 } // namespace base | 507 } // namespace base |
OLD | NEW |