Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(371)

Side by Side Diff: base/debug/activity_analyzer_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698