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

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
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 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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698