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

Side by Side Diff: base/debug/activity_tracker_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_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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 snapshot.activity_stack[0].origin_address); 197 snapshot.activity_stack[0].origin_address);
198 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id); 198 EXPECT_EQ(11U, snapshot.activity_stack[0].data.task.sequence_id);
199 199
200 tracker->PopActivity(id1); 200 tracker->PopActivity(id1);
201 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); 201 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
202 ASSERT_EQ(0U, snapshot.activity_stack_depth); 202 ASSERT_EQ(0U, snapshot.activity_stack_depth);
203 ASSERT_EQ(0U, snapshot.activity_stack.size()); 203 ASSERT_EQ(0U, snapshot.activity_stack.size());
204 } 204 }
205 205
206 TEST_F(ActivityTrackerTest, ScopedTaskTest) { 206 TEST_F(ActivityTrackerTest, ScopedTaskTest) {
207 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); 207 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
208 208
209 ThreadActivityTracker* tracker = 209 ThreadActivityTracker* tracker =
210 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); 210 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
211 ThreadActivityTracker::Snapshot snapshot; 211 ThreadActivityTracker::Snapshot snapshot;
212 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); 212 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed());
213 213
214 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); 214 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
215 ASSERT_EQ(0U, snapshot.activity_stack_depth); 215 ASSERT_EQ(0U, snapshot.activity_stack_depth);
216 ASSERT_EQ(0U, snapshot.activity_stack.size()); 216 ASSERT_EQ(0U, snapshot.activity_stack.size());
217 217
(...skipping 26 matching lines...) Expand all
244 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type); 244 EXPECT_EQ(Activity::ACT_TASK, snapshot.activity_stack[0].activity_type);
245 } 245 }
246 246
247 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); 247 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
248 ASSERT_EQ(0U, snapshot.activity_stack_depth); 248 ASSERT_EQ(0U, snapshot.activity_stack_depth);
249 ASSERT_EQ(0U, snapshot.activity_stack.size()); 249 ASSERT_EQ(0U, snapshot.activity_stack.size());
250 ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed()); 250 ASSERT_EQ(2U, GetGlobalUserDataMemoryCacheUsed());
251 } 251 }
252 252
253 TEST_F(ActivityTrackerTest, ExceptionTest) { 253 TEST_F(ActivityTrackerTest, ExceptionTest) {
254 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); 254 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
255 GlobalActivityTracker* global = GlobalActivityTracker::Get(); 255 GlobalActivityTracker* global = GlobalActivityTracker::Get();
256 256
257 ThreadActivityTracker* tracker = 257 ThreadActivityTracker* tracker =
258 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); 258 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
259 ThreadActivityTracker::Snapshot snapshot; 259 ThreadActivityTracker::Snapshot snapshot;
260 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed()); 260 ASSERT_EQ(0U, GetGlobalUserDataMemoryCacheUsed());
261 261
262 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot)); 262 ASSERT_TRUE(tracker->CreateSnapshot(&snapshot));
263 ASSERT_EQ(0U, snapshot.last_exception.activity_type); 263 ASSERT_EQ(0U, snapshot.last_exception.activity_type);
264 264
(...skipping 29 matching lines...) Expand all
294 global = GlobalActivityTracker::Get(); 294 global = GlobalActivityTracker::Get();
295 EXPECT_EQ(std::string("bar"), global->allocator()->Name()); 295 EXPECT_EQ(std::string("bar"), global->allocator()->Name());
296 global->ReleaseTrackerForCurrentThreadForTesting(); 296 global->ReleaseTrackerForCurrentThreadForTesting();
297 delete global; 297 delete global;
298 } 298 }
299 299
300 300
301 // GlobalActivityTracker tests below. 301 // GlobalActivityTracker tests below.
302 302
303 TEST_F(ActivityTrackerTest, BasicTest) { 303 TEST_F(ActivityTrackerTest, BasicTest) {
304 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); 304 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
305 GlobalActivityTracker* global = GlobalActivityTracker::Get(); 305 GlobalActivityTracker* global = GlobalActivityTracker::Get();
306 306
307 // Ensure the data repositories have backing store, indicated by non-zero ID. 307 // Ensure the data repositories have backing store, indicated by non-zero ID.
308 EXPECT_NE(0U, global->process_data().id()); 308 EXPECT_NE(0U, global->process_data().id());
309 EXPECT_NE(0U, global->global_data().id()); 309 EXPECT_NE(0U, global->global_data().id());
310 EXPECT_NE(global->process_data().id(), global->global_data().id()); 310 EXPECT_NE(global->process_data().id(), global->global_data().id());
311 } 311 }
312 312
313 class SimpleActivityThread : public SimpleThread { 313 class SimpleActivityThread : public SimpleThread {
314 public: 314 public:
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
357 357
358 bool ready_ = false; 358 bool ready_ = false;
359 bool exit_ = false; 359 bool exit_ = false;
360 Lock lock_; 360 Lock lock_;
361 ConditionVariable exit_condition_; 361 ConditionVariable exit_condition_;
362 362
363 DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread); 363 DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread);
364 }; 364 };
365 365
366 TEST_F(ActivityTrackerTest, ThreadDeathTest) { 366 TEST_F(ActivityTrackerTest, ThreadDeathTest) {
367 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); 367 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
368 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread(); 368 GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
369 const size_t starting_active = GetGlobalActiveTrackerCount(); 369 const size_t starting_active = GetGlobalActiveTrackerCount();
370 const size_t starting_inactive = GetGlobalInactiveTrackerCount(); 370 const size_t starting_inactive = GetGlobalInactiveTrackerCount();
371 371
372 SimpleActivityThread t1("t1", nullptr, Activity::ACT_TASK, 372 SimpleActivityThread t1("t1", nullptr, Activity::ACT_TASK,
373 ActivityData::ForTask(11)); 373 ActivityData::ForTask(11));
374 t1.Start(); 374 t1.Start();
375 t1.WaitReady(); 375 t1.WaitReady();
376 EXPECT_EQ(starting_active + 1, GetGlobalActiveTrackerCount()); 376 EXPECT_EQ(starting_active + 1, GetGlobalActiveTrackerCount());
377 EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount()); 377 EXPECT_EQ(starting_inactive, GetGlobalInactiveTrackerCount());
(...skipping 16 matching lines...) Expand all
394 t2.Join(); 394 t2.Join();
395 EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount()); 395 EXPECT_EQ(starting_active, GetGlobalActiveTrackerCount());
396 EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount()); 396 EXPECT_EQ(starting_inactive + 1, GetGlobalInactiveTrackerCount());
397 } 397 }
398 398
399 TEST_F(ActivityTrackerTest, ProcessDeathTest) { 399 TEST_F(ActivityTrackerTest, ProcessDeathTest) {
400 // This doesn't actually create and destroy a process. Instead, it uses for- 400 // This doesn't actually create and destroy a process. Instead, it uses for-
401 // testing interfaces to simulate data created by other processes. 401 // testing interfaces to simulate data created by other processes.
402 const ProcessId other_process_id = GetCurrentProcId() + 1; 402 const ProcessId other_process_id = GetCurrentProcId() + 1;
403 403
404 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3); 404 GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
405 GlobalActivityTracker* global = GlobalActivityTracker::Get(); 405 GlobalActivityTracker* global = GlobalActivityTracker::Get();
406 ThreadActivityTracker* thread = global->GetOrCreateTrackerForCurrentThread(); 406 ThreadActivityTracker* thread = global->GetOrCreateTrackerForCurrentThread();
407 407
408 // Get callbacks for process exit. 408 // Get callbacks for process exit.
409 global->SetProcessExitCallback( 409 global->SetProcessExitCallback(
410 Bind(&ActivityTrackerTest::HandleProcessExit, Unretained(this))); 410 Bind(&ActivityTrackerTest::HandleProcessExit, Unretained(this)));
411 411
412 // Pretend than another process has started. 412 // Pretend than another process has started.
413 global->RecordProcessLaunch(other_process_id, FILE_PATH_LITERAL("foo --bar")); 413 global->RecordProcessLaunch(other_process_id, FILE_PATH_LITERAL("foo --bar"));
414 414
(...skipping 19 matching lines...) Expand all
434 user_data.GetBaseAddress(), 434 user_data.GetBaseAddress(),
435 GlobalActivityTracker::kTypeIdUserDataRecord); 435 GlobalActivityTracker::kTypeIdUserDataRecord);
436 ASSERT_TRUE(user_data_ref); 436 ASSERT_TRUE(user_data_ref);
437 437
438 // Make a copy of the thread-tracker state so it can be restored later. 438 // Make a copy of the thread-tracker state so it can be restored later.
439 const size_t tracker_size = global->allocator()->GetAllocSize(tracker_ref); 439 const size_t tracker_size = global->allocator()->GetAllocSize(tracker_ref);
440 std::unique_ptr<char[]> tracker_copy(new char[tracker_size]); 440 std::unique_ptr<char[]> tracker_copy(new char[tracker_size]);
441 memcpy(tracker_copy.get(), thread->GetBaseAddress(), tracker_size); 441 memcpy(tracker_copy.get(), thread->GetBaseAddress(), tracker_size);
442 442
443 // Change the objects to appear to be owned by another process. 443 // Change the objects to appear to be owned by another process.
444 ProcessId owning_id; 444 int64_t owning_id;
445 int64_t stamp; 445 int64_t stamp;
446 ASSERT_TRUE(ActivityUserData::GetOwningProcessId( 446 ASSERT_TRUE(ActivityUserData::GetOwningProcessId(
447 global->process_data().GetBaseAddress(), &owning_id, &stamp)); 447 global->process_data().GetBaseAddress(), &owning_id, &stamp));
448 EXPECT_NE(other_process_id, owning_id); 448 EXPECT_NE(other_process_id, owning_id);
449 ASSERT_TRUE(ThreadActivityTracker::GetOwningProcessId( 449 ASSERT_TRUE(ThreadActivityTracker::GetOwningProcessId(
450 thread->GetBaseAddress(), &owning_id, &stamp)); 450 thread->GetBaseAddress(), &owning_id, &stamp));
451 EXPECT_NE(other_process_id, owning_id); 451 EXPECT_NE(other_process_id, owning_id);
452 ASSERT_TRUE(ActivityUserData::GetOwningProcessId(user_data.GetBaseAddress(), 452 ASSERT_TRUE(ActivityUserData::GetOwningProcessId(user_data.GetBaseAddress(),
453 &owning_id, &stamp)); 453 &owning_id, &stamp));
454 EXPECT_NE(other_process_id, owning_id); 454 EXPECT_NE(other_process_id, owning_id);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 global->allocator()->ChangeType( 493 global->allocator()->ChangeType(
494 tracker_ref, GlobalActivityTracker::kTypeIdActivityTracker, 494 tracker_ref, GlobalActivityTracker::kTypeIdActivityTracker,
495 GlobalActivityTracker::kTypeIdActivityTrackerFree, false); 495 GlobalActivityTracker::kTypeIdActivityTrackerFree, false);
496 global->allocator()->ChangeType( 496 global->allocator()->ChangeType(
497 user_data_ref, GlobalActivityTracker::kTypeIdUserDataRecord, 497 user_data_ref, GlobalActivityTracker::kTypeIdUserDataRecord,
498 GlobalActivityTracker::kTypeIdUserDataRecordFree, false); 498 GlobalActivityTracker::kTypeIdUserDataRecordFree, false);
499 } 499 }
500 500
501 } // namespace debug 501 } // namespace debug
502 } // namespace base 502 } // namespace base
OLDNEW
« no previous file with comments | « base/debug/activity_tracker.cc ('k') | components/browser_watcher/postmortem_report_extractor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698