xref: /aosp_15_r20/external/libchrome/base/debug/activity_analyzer_unittest.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/debug/activity_analyzer.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include <atomic>
8*635a8641SAndroid Build Coastguard Worker #include <memory>
9*635a8641SAndroid Build Coastguard Worker 
10*635a8641SAndroid Build Coastguard Worker #include "base/auto_reset.h"
11*635a8641SAndroid Build Coastguard Worker #include "base/bind.h"
12*635a8641SAndroid Build Coastguard Worker #include "base/debug/activity_tracker.h"
13*635a8641SAndroid Build Coastguard Worker #include "base/files/file.h"
14*635a8641SAndroid Build Coastguard Worker #include "base/files/file_util.h"
15*635a8641SAndroid Build Coastguard Worker #include "base/files/memory_mapped_file.h"
16*635a8641SAndroid Build Coastguard Worker #include "base/files/scoped_temp_dir.h"
17*635a8641SAndroid Build Coastguard Worker #include "base/memory/ptr_util.h"
18*635a8641SAndroid Build Coastguard Worker #include "base/pending_task.h"
19*635a8641SAndroid Build Coastguard Worker #include "base/process/process.h"
20*635a8641SAndroid Build Coastguard Worker #include "base/stl_util.h"
21*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/condition_variable.h"
22*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/lock.h"
23*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/spin_wait.h"
24*635a8641SAndroid Build Coastguard Worker #include "base/threading/platform_thread.h"
25*635a8641SAndroid Build Coastguard Worker #include "base/threading/simple_thread.h"
26*635a8641SAndroid Build Coastguard Worker #include "base/time/time.h"
27*635a8641SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
28*635a8641SAndroid Build Coastguard Worker 
29*635a8641SAndroid Build Coastguard Worker namespace base {
30*635a8641SAndroid Build Coastguard Worker namespace debug {
31*635a8641SAndroid Build Coastguard Worker 
32*635a8641SAndroid Build Coastguard Worker namespace {
33*635a8641SAndroid Build Coastguard Worker 
34*635a8641SAndroid Build Coastguard Worker class TestActivityTracker : public ThreadActivityTracker {
35*635a8641SAndroid Build Coastguard Worker  public:
TestActivityTracker(std::unique_ptr<char[]> memory,size_t mem_size)36*635a8641SAndroid Build Coastguard Worker   TestActivityTracker(std::unique_ptr<char[]> memory, size_t mem_size)
37*635a8641SAndroid Build Coastguard Worker       : ThreadActivityTracker(memset(memory.get(), 0, mem_size), mem_size),
38*635a8641SAndroid Build Coastguard Worker         mem_segment_(std::move(memory)) {}
39*635a8641SAndroid Build Coastguard Worker 
40*635a8641SAndroid Build Coastguard Worker   ~TestActivityTracker() override = default;
41*635a8641SAndroid Build Coastguard Worker 
42*635a8641SAndroid Build Coastguard Worker  private:
43*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<char[]> mem_segment_;
44*635a8641SAndroid Build Coastguard Worker };
45*635a8641SAndroid Build Coastguard Worker 
46*635a8641SAndroid Build Coastguard Worker }  // namespace
47*635a8641SAndroid Build Coastguard Worker 
48*635a8641SAndroid Build Coastguard Worker 
49*635a8641SAndroid Build Coastguard Worker class ActivityAnalyzerTest : public testing::Test {
50*635a8641SAndroid Build Coastguard Worker  public:
51*635a8641SAndroid Build Coastguard Worker   const int kMemorySize = 1 << 20;  // 1MiB
52*635a8641SAndroid Build Coastguard Worker   const int kStackSize  = 1 << 10;  // 1KiB
53*635a8641SAndroid Build Coastguard Worker 
54*635a8641SAndroid Build Coastguard Worker   ActivityAnalyzerTest() = default;
55*635a8641SAndroid Build Coastguard Worker 
~ActivityAnalyzerTest()56*635a8641SAndroid Build Coastguard Worker   ~ActivityAnalyzerTest() override {
57*635a8641SAndroid Build Coastguard Worker     GlobalActivityTracker* global_tracker = GlobalActivityTracker::Get();
58*635a8641SAndroid Build Coastguard Worker     if (global_tracker) {
59*635a8641SAndroid Build Coastguard Worker       global_tracker->ReleaseTrackerForCurrentThreadForTesting();
60*635a8641SAndroid Build Coastguard Worker       delete global_tracker;
61*635a8641SAndroid Build Coastguard Worker     }
62*635a8641SAndroid Build Coastguard Worker   }
63*635a8641SAndroid Build Coastguard Worker 
CreateActivityTracker()64*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ThreadActivityTracker> CreateActivityTracker() {
65*635a8641SAndroid Build Coastguard Worker     std::unique_ptr<char[]> memory(new char[kStackSize]);
66*635a8641SAndroid Build Coastguard Worker     return std::make_unique<TestActivityTracker>(std::move(memory), kStackSize);
67*635a8641SAndroid Build Coastguard Worker   }
68*635a8641SAndroid Build Coastguard Worker 
69*635a8641SAndroid Build Coastguard Worker   template <typename Function>
AsOtherProcess(int64_t pid,Function function)70*635a8641SAndroid Build Coastguard Worker   void AsOtherProcess(int64_t pid, Function function) {
71*635a8641SAndroid Build Coastguard Worker     std::unique_ptr<GlobalActivityTracker> old_global =
72*635a8641SAndroid Build Coastguard Worker         GlobalActivityTracker::ReleaseForTesting();
73*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(old_global);
74*635a8641SAndroid Build Coastguard Worker 
75*635a8641SAndroid Build Coastguard Worker     PersistentMemoryAllocator* old_allocator = old_global->allocator();
76*635a8641SAndroid Build Coastguard Worker     std::unique_ptr<PersistentMemoryAllocator> new_allocator(
77*635a8641SAndroid Build Coastguard Worker         std::make_unique<PersistentMemoryAllocator>(
78*635a8641SAndroid Build Coastguard Worker             const_cast<void*>(old_allocator->data()), old_allocator->size(), 0,
79*635a8641SAndroid Build Coastguard Worker             0, "", false));
80*635a8641SAndroid Build Coastguard Worker     GlobalActivityTracker::CreateWithAllocator(std::move(new_allocator), 3,
81*635a8641SAndroid Build Coastguard Worker                                                pid);
82*635a8641SAndroid Build Coastguard Worker 
83*635a8641SAndroid Build Coastguard Worker     function();
84*635a8641SAndroid Build Coastguard Worker 
85*635a8641SAndroid Build Coastguard Worker     GlobalActivityTracker::ReleaseForTesting();
86*635a8641SAndroid Build Coastguard Worker     GlobalActivityTracker::SetForTesting(std::move(old_global));
87*635a8641SAndroid Build Coastguard Worker   }
88*635a8641SAndroid Build Coastguard Worker 
DoNothing()89*635a8641SAndroid Build Coastguard Worker   static void DoNothing() {}
90*635a8641SAndroid Build Coastguard Worker };
91*635a8641SAndroid Build Coastguard Worker 
TEST_F(ActivityAnalyzerTest,ThreadAnalyzerConstruction)92*635a8641SAndroid Build Coastguard Worker TEST_F(ActivityAnalyzerTest, ThreadAnalyzerConstruction) {
93*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<ThreadActivityTracker> tracker = CreateActivityTracker();
94*635a8641SAndroid Build Coastguard Worker   {
95*635a8641SAndroid Build Coastguard Worker     ThreadActivityAnalyzer analyzer(*tracker);
96*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(analyzer.IsValid());
97*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(PlatformThread::GetName(), analyzer.GetThreadName());
98*635a8641SAndroid Build Coastguard Worker   }
99*635a8641SAndroid Build Coastguard Worker 
100*635a8641SAndroid Build Coastguard Worker   // TODO(bcwhite): More tests once Analyzer does more.
101*635a8641SAndroid Build Coastguard Worker }
102*635a8641SAndroid Build Coastguard Worker 
103*635a8641SAndroid Build Coastguard Worker 
104*635a8641SAndroid Build Coastguard Worker // GlobalActivityAnalyzer tests below.
105*635a8641SAndroid Build Coastguard Worker 
106*635a8641SAndroid Build Coastguard Worker namespace {
107*635a8641SAndroid Build Coastguard Worker 
108*635a8641SAndroid Build Coastguard Worker class SimpleActivityThread : public SimpleThread {
109*635a8641SAndroid Build Coastguard Worker  public:
SimpleActivityThread(const std::string & name,const void * source,Activity::Type activity,const ActivityData & data)110*635a8641SAndroid Build Coastguard Worker   SimpleActivityThread(const std::string& name,
111*635a8641SAndroid Build Coastguard Worker                        const void* source,
112*635a8641SAndroid Build Coastguard Worker                        Activity::Type activity,
113*635a8641SAndroid Build Coastguard Worker                        const ActivityData& data)
114*635a8641SAndroid Build Coastguard Worker       : SimpleThread(name, Options()),
115*635a8641SAndroid Build Coastguard Worker         source_(source),
116*635a8641SAndroid Build Coastguard Worker         activity_(activity),
117*635a8641SAndroid Build Coastguard Worker         data_(data),
118*635a8641SAndroid Build Coastguard Worker         ready_(false),
119*635a8641SAndroid Build Coastguard Worker         exit_(false),
120*635a8641SAndroid Build Coastguard Worker         exit_condition_(&lock_) {}
121*635a8641SAndroid Build Coastguard Worker 
122*635a8641SAndroid Build Coastguard Worker   ~SimpleActivityThread() override = default;
123*635a8641SAndroid Build Coastguard Worker 
Run()124*635a8641SAndroid Build Coastguard Worker   void Run() override {
125*635a8641SAndroid Build Coastguard Worker     ThreadActivityTracker::ActivityId id =
126*635a8641SAndroid Build Coastguard Worker         GlobalActivityTracker::Get()
127*635a8641SAndroid Build Coastguard Worker             ->GetOrCreateTrackerForCurrentThread()
128*635a8641SAndroid Build Coastguard Worker             ->PushActivity(source_, activity_, data_);
129*635a8641SAndroid Build Coastguard Worker 
130*635a8641SAndroid Build Coastguard Worker     {
131*635a8641SAndroid Build Coastguard Worker       AutoLock auto_lock(lock_);
132*635a8641SAndroid Build Coastguard Worker       ready_.store(true, std::memory_order_release);
133*635a8641SAndroid Build Coastguard Worker       while (!exit_.load(std::memory_order_relaxed))
134*635a8641SAndroid Build Coastguard Worker         exit_condition_.Wait();
135*635a8641SAndroid Build Coastguard Worker     }
136*635a8641SAndroid Build Coastguard Worker 
137*635a8641SAndroid Build Coastguard Worker     GlobalActivityTracker::Get()->GetTrackerForCurrentThread()->PopActivity(id);
138*635a8641SAndroid Build Coastguard Worker   }
139*635a8641SAndroid Build Coastguard Worker 
Exit()140*635a8641SAndroid Build Coastguard Worker   void Exit() {
141*635a8641SAndroid Build Coastguard Worker     AutoLock auto_lock(lock_);
142*635a8641SAndroid Build Coastguard Worker     exit_.store(true, std::memory_order_relaxed);
143*635a8641SAndroid Build Coastguard Worker     exit_condition_.Signal();
144*635a8641SAndroid Build Coastguard Worker   }
145*635a8641SAndroid Build Coastguard Worker 
WaitReady()146*635a8641SAndroid Build Coastguard Worker   void WaitReady() {
147*635a8641SAndroid Build Coastguard Worker     SPIN_FOR_1_SECOND_OR_UNTIL_TRUE(ready_.load(std::memory_order_acquire));
148*635a8641SAndroid Build Coastguard Worker   }
149*635a8641SAndroid Build Coastguard Worker 
150*635a8641SAndroid Build Coastguard Worker  private:
151*635a8641SAndroid Build Coastguard Worker   const void* source_;
152*635a8641SAndroid Build Coastguard Worker   Activity::Type activity_;
153*635a8641SAndroid Build Coastguard Worker   ActivityData data_;
154*635a8641SAndroid Build Coastguard Worker 
155*635a8641SAndroid Build Coastguard Worker   std::atomic<bool> ready_;
156*635a8641SAndroid Build Coastguard Worker   std::atomic<bool> exit_;
157*635a8641SAndroid Build Coastguard Worker   Lock lock_;
158*635a8641SAndroid Build Coastguard Worker   ConditionVariable exit_condition_;
159*635a8641SAndroid Build Coastguard Worker 
160*635a8641SAndroid Build Coastguard Worker   DISALLOW_COPY_AND_ASSIGN(SimpleActivityThread);
161*635a8641SAndroid Build Coastguard Worker };
162*635a8641SAndroid Build Coastguard Worker 
163*635a8641SAndroid Build Coastguard Worker }  // namespace
164*635a8641SAndroid Build Coastguard Worker 
TEST_F(ActivityAnalyzerTest,GlobalAnalyzerConstruction)165*635a8641SAndroid Build Coastguard Worker TEST_F(ActivityAnalyzerTest, GlobalAnalyzerConstruction) {
166*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
167*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::Get()->process_data().SetString("foo", "bar");
168*635a8641SAndroid Build Coastguard Worker 
169*635a8641SAndroid Build Coastguard Worker   PersistentMemoryAllocator* allocator =
170*635a8641SAndroid Build Coastguard Worker       GlobalActivityTracker::Get()->allocator();
171*635a8641SAndroid Build Coastguard Worker   GlobalActivityAnalyzer analyzer(std::make_unique<PersistentMemoryAllocator>(
172*635a8641SAndroid Build Coastguard Worker       const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true));
173*635a8641SAndroid Build Coastguard Worker 
174*635a8641SAndroid Build Coastguard Worker   // The only thread at this point is the test thread of this process.
175*635a8641SAndroid Build Coastguard Worker   const int64_t pid = analyzer.GetFirstProcess();
176*635a8641SAndroid Build Coastguard Worker   ASSERT_NE(0, pid);
177*635a8641SAndroid Build Coastguard Worker   ThreadActivityAnalyzer* ta1 = analyzer.GetFirstAnalyzer(pid);
178*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ta1);
179*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(analyzer.GetNextAnalyzer());
180*635a8641SAndroid Build Coastguard Worker   ThreadActivityAnalyzer::ThreadKey tk1 = ta1->GetThreadKey();
181*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(ta1, analyzer.GetAnalyzerForThread(tk1));
182*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, analyzer.GetNextProcess());
183*635a8641SAndroid Build Coastguard Worker 
184*635a8641SAndroid Build Coastguard Worker   // Create a second thread that will do something.
185*635a8641SAndroid Build Coastguard Worker   SimpleActivityThread t2("t2", nullptr, Activity::ACT_TASK,
186*635a8641SAndroid Build Coastguard Worker                           ActivityData::ForTask(11));
187*635a8641SAndroid Build Coastguard Worker   t2.Start();
188*635a8641SAndroid Build Coastguard Worker   t2.WaitReady();
189*635a8641SAndroid Build Coastguard Worker 
190*635a8641SAndroid Build Coastguard Worker   // Now there should be two. Calling GetFirstProcess invalidates any
191*635a8641SAndroid Build Coastguard Worker   // previously returned analyzer pointers.
192*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(pid, analyzer.GetFirstProcess());
193*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(analyzer.GetFirstAnalyzer(pid));
194*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(analyzer.GetNextAnalyzer());
195*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(analyzer.GetNextAnalyzer());
196*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, analyzer.GetNextProcess());
197*635a8641SAndroid Build Coastguard Worker 
198*635a8641SAndroid Build Coastguard Worker   // Let thread exit.
199*635a8641SAndroid Build Coastguard Worker   t2.Exit();
200*635a8641SAndroid Build Coastguard Worker   t2.Join();
201*635a8641SAndroid Build Coastguard Worker 
202*635a8641SAndroid Build Coastguard Worker   // Now there should be only one again.
203*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(pid, analyzer.GetFirstProcess());
204*635a8641SAndroid Build Coastguard Worker   ThreadActivityAnalyzer* ta2 = analyzer.GetFirstAnalyzer(pid);
205*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ta2);
206*635a8641SAndroid Build Coastguard Worker   EXPECT_FALSE(analyzer.GetNextAnalyzer());
207*635a8641SAndroid Build Coastguard Worker   ThreadActivityAnalyzer::ThreadKey tk2 = ta2->GetThreadKey();
208*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(ta2, analyzer.GetAnalyzerForThread(tk2));
209*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(tk1, tk2);
210*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, analyzer.GetNextProcess());
211*635a8641SAndroid Build Coastguard Worker 
212*635a8641SAndroid Build Coastguard Worker   // Verify that there is process data.
213*635a8641SAndroid Build Coastguard Worker   const ActivityUserData::Snapshot& data_snapshot =
214*635a8641SAndroid Build Coastguard Worker       analyzer.GetProcessDataSnapshot(pid);
215*635a8641SAndroid Build Coastguard Worker   ASSERT_LE(1U, data_snapshot.size());
216*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("bar", data_snapshot.at("foo").GetString());
217*635a8641SAndroid Build Coastguard Worker }
218*635a8641SAndroid Build Coastguard Worker 
TEST_F(ActivityAnalyzerTest,GlobalAnalyzerFromSharedMemory)219*635a8641SAndroid Build Coastguard Worker TEST_F(ActivityAnalyzerTest, GlobalAnalyzerFromSharedMemory) {
220*635a8641SAndroid Build Coastguard Worker   SharedMemoryHandle handle1;
221*635a8641SAndroid Build Coastguard Worker   SharedMemoryHandle handle2;
222*635a8641SAndroid Build Coastguard Worker 
223*635a8641SAndroid Build Coastguard Worker   {
224*635a8641SAndroid Build Coastguard Worker     std::unique_ptr<SharedMemory> shmem(new SharedMemory());
225*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(shmem->CreateAndMapAnonymous(kMemorySize));
226*635a8641SAndroid Build Coastguard Worker     handle1 = shmem->handle().Duplicate();
227*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(handle1.IsValid());
228*635a8641SAndroid Build Coastguard Worker     handle2 = shmem->handle().Duplicate();
229*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(handle2.IsValid());
230*635a8641SAndroid Build Coastguard Worker   }
231*635a8641SAndroid Build Coastguard Worker 
232*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::CreateWithSharedMemoryHandle(handle1, kMemorySize, 0,
233*635a8641SAndroid Build Coastguard Worker                                                       "", 3);
234*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::Get()->process_data().SetString("foo", "bar");
235*635a8641SAndroid Build Coastguard Worker 
236*635a8641SAndroid Build Coastguard Worker   std::unique_ptr<GlobalActivityAnalyzer> analyzer =
237*635a8641SAndroid Build Coastguard Worker       GlobalActivityAnalyzer::CreateWithSharedMemoryHandle(handle2,
238*635a8641SAndroid Build Coastguard Worker                                                            kMemorySize);
239*635a8641SAndroid Build Coastguard Worker 
240*635a8641SAndroid Build Coastguard Worker   const int64_t pid = analyzer->GetFirstProcess();
241*635a8641SAndroid Build Coastguard Worker   ASSERT_NE(0, pid);
242*635a8641SAndroid Build Coastguard Worker   const ActivityUserData::Snapshot& data_snapshot =
243*635a8641SAndroid Build Coastguard Worker       analyzer->GetProcessDataSnapshot(pid);
244*635a8641SAndroid Build Coastguard Worker   ASSERT_LE(1U, data_snapshot.size());
245*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("bar", data_snapshot.at("foo").GetString());
246*635a8641SAndroid Build Coastguard Worker }
247*635a8641SAndroid Build Coastguard Worker 
TEST_F(ActivityAnalyzerTest,UserDataSnapshotTest)248*635a8641SAndroid Build Coastguard Worker TEST_F(ActivityAnalyzerTest, UserDataSnapshotTest) {
249*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
250*635a8641SAndroid Build Coastguard Worker   ThreadActivityAnalyzer::Snapshot tracker_snapshot;
251*635a8641SAndroid Build Coastguard Worker 
252*635a8641SAndroid Build Coastguard Worker   const char string1a[] = "string1a";
253*635a8641SAndroid Build Coastguard Worker   const char string1b[] = "string1b";
254*635a8641SAndroid Build Coastguard Worker   const char string2a[] = "string2a";
255*635a8641SAndroid Build Coastguard Worker   const char string2b[] = "string2b";
256*635a8641SAndroid Build Coastguard Worker 
257*635a8641SAndroid Build Coastguard Worker   PersistentMemoryAllocator* allocator =
258*635a8641SAndroid Build Coastguard Worker       GlobalActivityTracker::Get()->allocator();
259*635a8641SAndroid Build Coastguard Worker   GlobalActivityAnalyzer global_analyzer(
260*635a8641SAndroid Build Coastguard Worker       std::make_unique<PersistentMemoryAllocator>(
261*635a8641SAndroid Build Coastguard Worker           const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "",
262*635a8641SAndroid Build Coastguard Worker           true));
263*635a8641SAndroid Build Coastguard Worker 
264*635a8641SAndroid Build Coastguard Worker   ThreadActivityTracker* tracker =
265*635a8641SAndroid Build Coastguard Worker       GlobalActivityTracker::Get()->GetOrCreateTrackerForCurrentThread();
266*635a8641SAndroid Build Coastguard Worker 
267*635a8641SAndroid Build Coastguard Worker   {
268*635a8641SAndroid Build Coastguard Worker     ScopedActivity activity1(1, 11, 111);
269*635a8641SAndroid Build Coastguard Worker     ActivityUserData& user_data1 = activity1.user_data();
270*635a8641SAndroid Build Coastguard Worker     user_data1.Set("raw1", "foo1", 4);
271*635a8641SAndroid Build Coastguard Worker     user_data1.SetString("string1", "bar1");
272*635a8641SAndroid Build Coastguard Worker     user_data1.SetChar("char1", '1');
273*635a8641SAndroid Build Coastguard Worker     user_data1.SetInt("int1", -1111);
274*635a8641SAndroid Build Coastguard Worker     user_data1.SetUint("uint1", 1111);
275*635a8641SAndroid Build Coastguard Worker     user_data1.SetBool("bool1", true);
276*635a8641SAndroid Build Coastguard Worker     user_data1.SetReference("ref1", string1a, sizeof(string1a));
277*635a8641SAndroid Build Coastguard Worker     user_data1.SetStringReference("sref1", string1b);
278*635a8641SAndroid Build Coastguard Worker 
279*635a8641SAndroid Build Coastguard Worker     {
280*635a8641SAndroid Build Coastguard Worker       ScopedActivity activity2(2, 22, 222);
281*635a8641SAndroid Build Coastguard Worker       ActivityUserData& user_data2 = activity2.user_data();
282*635a8641SAndroid Build Coastguard Worker       user_data2.Set("raw2", "foo2", 4);
283*635a8641SAndroid Build Coastguard Worker       user_data2.SetString("string2", "bar2");
284*635a8641SAndroid Build Coastguard Worker       user_data2.SetChar("char2", '2');
285*635a8641SAndroid Build Coastguard Worker       user_data2.SetInt("int2", -2222);
286*635a8641SAndroid Build Coastguard Worker       user_data2.SetUint("uint2", 2222);
287*635a8641SAndroid Build Coastguard Worker       user_data2.SetBool("bool2", false);
288*635a8641SAndroid Build Coastguard Worker       user_data2.SetReference("ref2", string2a, sizeof(string2a));
289*635a8641SAndroid Build Coastguard Worker       user_data2.SetStringReference("sref2", string2b);
290*635a8641SAndroid Build Coastguard Worker 
291*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot));
292*635a8641SAndroid Build Coastguard Worker       ASSERT_EQ(2U, tracker_snapshot.activity_stack.size());
293*635a8641SAndroid Build Coastguard Worker 
294*635a8641SAndroid Build Coastguard Worker       ThreadActivityAnalyzer analyzer(*tracker);
295*635a8641SAndroid Build Coastguard Worker       analyzer.AddGlobalInformation(&global_analyzer);
296*635a8641SAndroid Build Coastguard Worker       const ThreadActivityAnalyzer::Snapshot& analyzer_snapshot =
297*635a8641SAndroid Build Coastguard Worker           analyzer.activity_snapshot();
298*635a8641SAndroid Build Coastguard Worker       ASSERT_EQ(2U, analyzer_snapshot.user_data_stack.size());
299*635a8641SAndroid Build Coastguard Worker       const ActivityUserData::Snapshot& user_data =
300*635a8641SAndroid Build Coastguard Worker           analyzer_snapshot.user_data_stack.at(1);
301*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(8U, user_data.size());
302*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(ContainsKey(user_data, "raw2"));
303*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ("foo2", user_data.at("raw2").Get().as_string());
304*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(ContainsKey(user_data, "string2"));
305*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ("bar2", user_data.at("string2").GetString().as_string());
306*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(ContainsKey(user_data, "char2"));
307*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ('2', user_data.at("char2").GetChar());
308*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(ContainsKey(user_data, "int2"));
309*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(-2222, user_data.at("int2").GetInt());
310*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(ContainsKey(user_data, "uint2"));
311*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(2222U, user_data.at("uint2").GetUint());
312*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(ContainsKey(user_data, "bool2"));
313*635a8641SAndroid Build Coastguard Worker       EXPECT_FALSE(user_data.at("bool2").GetBool());
314*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(ContainsKey(user_data, "ref2"));
315*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(string2a, user_data.at("ref2").GetReference().data());
316*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(sizeof(string2a), user_data.at("ref2").GetReference().size());
317*635a8641SAndroid Build Coastguard Worker       ASSERT_TRUE(ContainsKey(user_data, "sref2"));
318*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(string2b, user_data.at("sref2").GetStringReference().data());
319*635a8641SAndroid Build Coastguard Worker       EXPECT_EQ(strlen(string2b),
320*635a8641SAndroid Build Coastguard Worker                 user_data.at("sref2").GetStringReference().size());
321*635a8641SAndroid Build Coastguard Worker     }
322*635a8641SAndroid Build Coastguard Worker 
323*635a8641SAndroid Build Coastguard Worker     ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot));
324*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(1U, tracker_snapshot.activity_stack.size());
325*635a8641SAndroid Build Coastguard Worker 
326*635a8641SAndroid Build Coastguard Worker     ThreadActivityAnalyzer analyzer(*tracker);
327*635a8641SAndroid Build Coastguard Worker     analyzer.AddGlobalInformation(&global_analyzer);
328*635a8641SAndroid Build Coastguard Worker     const ThreadActivityAnalyzer::Snapshot& analyzer_snapshot =
329*635a8641SAndroid Build Coastguard Worker         analyzer.activity_snapshot();
330*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(1U, analyzer_snapshot.user_data_stack.size());
331*635a8641SAndroid Build Coastguard Worker     const ActivityUserData::Snapshot& user_data =
332*635a8641SAndroid Build Coastguard Worker         analyzer_snapshot.user_data_stack.at(0);
333*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(8U, user_data.size());
334*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ("foo1", user_data.at("raw1").Get().as_string());
335*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ("bar1", user_data.at("string1").GetString().as_string());
336*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ('1', user_data.at("char1").GetChar());
337*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(-1111, user_data.at("int1").GetInt());
338*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(1111U, user_data.at("uint1").GetUint());
339*635a8641SAndroid Build Coastguard Worker     EXPECT_TRUE(user_data.at("bool1").GetBool());
340*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(string1a, user_data.at("ref1").GetReference().data());
341*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(sizeof(string1a), user_data.at("ref1").GetReference().size());
342*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(string1b, user_data.at("sref1").GetStringReference().data());
343*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(strlen(string1b),
344*635a8641SAndroid Build Coastguard Worker               user_data.at("sref1").GetStringReference().size());
345*635a8641SAndroid Build Coastguard Worker   }
346*635a8641SAndroid Build Coastguard Worker 
347*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(tracker->CreateSnapshot(&tracker_snapshot));
348*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(0U, tracker_snapshot.activity_stack.size());
349*635a8641SAndroid Build Coastguard Worker }
350*635a8641SAndroid Build Coastguard Worker 
TEST_F(ActivityAnalyzerTest,GlobalUserDataTest)351*635a8641SAndroid Build Coastguard Worker TEST_F(ActivityAnalyzerTest, GlobalUserDataTest) {
352*635a8641SAndroid Build Coastguard Worker   const int64_t pid = GetCurrentProcId();
353*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
354*635a8641SAndroid Build Coastguard Worker 
355*635a8641SAndroid Build Coastguard Worker   const char string1[] = "foo";
356*635a8641SAndroid Build Coastguard Worker   const char string2[] = "bar";
357*635a8641SAndroid Build Coastguard Worker 
358*635a8641SAndroid Build Coastguard Worker   PersistentMemoryAllocator* allocator =
359*635a8641SAndroid Build Coastguard Worker       GlobalActivityTracker::Get()->allocator();
360*635a8641SAndroid Build Coastguard Worker   GlobalActivityAnalyzer global_analyzer(
361*635a8641SAndroid Build Coastguard Worker       std::make_unique<PersistentMemoryAllocator>(
362*635a8641SAndroid Build Coastguard Worker           const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "",
363*635a8641SAndroid Build Coastguard Worker           true));
364*635a8641SAndroid Build Coastguard Worker 
365*635a8641SAndroid Build Coastguard Worker   ActivityUserData& process_data = GlobalActivityTracker::Get()->process_data();
366*635a8641SAndroid Build Coastguard Worker   ASSERT_NE(0U, process_data.id());
367*635a8641SAndroid Build Coastguard Worker   process_data.Set("raw", "foo", 3);
368*635a8641SAndroid Build Coastguard Worker   process_data.SetString("string", "bar");
369*635a8641SAndroid Build Coastguard Worker   process_data.SetChar("char", '9');
370*635a8641SAndroid Build Coastguard Worker   process_data.SetInt("int", -9999);
371*635a8641SAndroid Build Coastguard Worker   process_data.SetUint("uint", 9999);
372*635a8641SAndroid Build Coastguard Worker   process_data.SetBool("bool", true);
373*635a8641SAndroid Build Coastguard Worker   process_data.SetReference("ref", string1, sizeof(string1));
374*635a8641SAndroid Build Coastguard Worker   process_data.SetStringReference("sref", string2);
375*635a8641SAndroid Build Coastguard Worker 
376*635a8641SAndroid Build Coastguard Worker   int64_t first_pid = global_analyzer.GetFirstProcess();
377*635a8641SAndroid Build Coastguard Worker   DCHECK_EQ(pid, first_pid);
378*635a8641SAndroid Build Coastguard Worker   const ActivityUserData::Snapshot& snapshot =
379*635a8641SAndroid Build Coastguard Worker       global_analyzer.GetProcessDataSnapshot(pid);
380*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ContainsKey(snapshot, "raw"));
381*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("foo", snapshot.at("raw").Get().as_string());
382*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ContainsKey(snapshot, "string"));
383*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("bar", snapshot.at("string").GetString().as_string());
384*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ContainsKey(snapshot, "char"));
385*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ('9', snapshot.at("char").GetChar());
386*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ContainsKey(snapshot, "int"));
387*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(-9999, snapshot.at("int").GetInt());
388*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ContainsKey(snapshot, "uint"));
389*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(9999U, snapshot.at("uint").GetUint());
390*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ContainsKey(snapshot, "bool"));
391*635a8641SAndroid Build Coastguard Worker   EXPECT_TRUE(snapshot.at("bool").GetBool());
392*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ContainsKey(snapshot, "ref"));
393*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(string1, snapshot.at("ref").GetReference().data());
394*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(sizeof(string1), snapshot.at("ref").GetReference().size());
395*635a8641SAndroid Build Coastguard Worker   ASSERT_TRUE(ContainsKey(snapshot, "sref"));
396*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(string2, snapshot.at("sref").GetStringReference().data());
397*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(strlen(string2), snapshot.at("sref").GetStringReference().size());
398*635a8641SAndroid Build Coastguard Worker }
399*635a8641SAndroid Build Coastguard Worker 
TEST_F(ActivityAnalyzerTest,GlobalModulesTest)400*635a8641SAndroid Build Coastguard Worker TEST_F(ActivityAnalyzerTest, GlobalModulesTest) {
401*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
402*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker* global = GlobalActivityTracker::Get();
403*635a8641SAndroid Build Coastguard Worker 
404*635a8641SAndroid Build Coastguard Worker   PersistentMemoryAllocator* allocator = global->allocator();
405*635a8641SAndroid Build Coastguard Worker   GlobalActivityAnalyzer global_analyzer(
406*635a8641SAndroid Build Coastguard Worker       std::make_unique<PersistentMemoryAllocator>(
407*635a8641SAndroid Build Coastguard Worker           const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "",
408*635a8641SAndroid Build Coastguard Worker           true));
409*635a8641SAndroid Build Coastguard Worker 
410*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::ModuleInfo info1;
411*635a8641SAndroid Build Coastguard Worker   info1.is_loaded = true;
412*635a8641SAndroid Build Coastguard Worker   info1.address = 0x12345678;
413*635a8641SAndroid Build Coastguard Worker   info1.load_time = 1111;
414*635a8641SAndroid Build Coastguard Worker   info1.size = 0xABCDEF;
415*635a8641SAndroid Build Coastguard Worker   info1.timestamp = 111;
416*635a8641SAndroid Build Coastguard Worker   info1.age = 11;
417*635a8641SAndroid Build Coastguard Worker   info1.identifier[0] = 1;
418*635a8641SAndroid Build Coastguard Worker   info1.file = "anything";
419*635a8641SAndroid Build Coastguard Worker   info1.debug_file = "elsewhere";
420*635a8641SAndroid Build Coastguard Worker 
421*635a8641SAndroid Build Coastguard Worker   global->RecordModuleInfo(info1);
422*635a8641SAndroid Build Coastguard Worker   std::vector<GlobalActivityTracker::ModuleInfo> modules1;
423*635a8641SAndroid Build Coastguard Worker   modules1 = global_analyzer.GetModules(global_analyzer.GetFirstProcess());
424*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(1U, modules1.size());
425*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::ModuleInfo& stored1a = modules1[0];
426*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.is_loaded, stored1a.is_loaded);
427*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.address, stored1a.address);
428*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(info1.load_time, stored1a.load_time);
429*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.size, stored1a.size);
430*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.timestamp, stored1a.timestamp);
431*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.age, stored1a.age);
432*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.identifier[0], stored1a.identifier[0]);
433*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.file, stored1a.file);
434*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.debug_file, stored1a.debug_file);
435*635a8641SAndroid Build Coastguard Worker 
436*635a8641SAndroid Build Coastguard Worker   info1.is_loaded = false;
437*635a8641SAndroid Build Coastguard Worker   global->RecordModuleInfo(info1);
438*635a8641SAndroid Build Coastguard Worker   modules1 = global_analyzer.GetModules(global_analyzer.GetFirstProcess());
439*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(1U, modules1.size());
440*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::ModuleInfo& stored1b = modules1[0];
441*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.is_loaded, stored1b.is_loaded);
442*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.address, stored1b.address);
443*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(info1.load_time, stored1b.load_time);
444*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.size, stored1b.size);
445*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.timestamp, stored1b.timestamp);
446*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.age, stored1b.age);
447*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.identifier[0], stored1b.identifier[0]);
448*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.file, stored1b.file);
449*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info1.debug_file, stored1b.debug_file);
450*635a8641SAndroid Build Coastguard Worker 
451*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::ModuleInfo info2;
452*635a8641SAndroid Build Coastguard Worker   info2.is_loaded = true;
453*635a8641SAndroid Build Coastguard Worker   info2.address = 0x87654321;
454*635a8641SAndroid Build Coastguard Worker   info2.load_time = 2222;
455*635a8641SAndroid Build Coastguard Worker   info2.size = 0xFEDCBA;
456*635a8641SAndroid Build Coastguard Worker   info2.timestamp = 222;
457*635a8641SAndroid Build Coastguard Worker   info2.age = 22;
458*635a8641SAndroid Build Coastguard Worker   info2.identifier[0] = 2;
459*635a8641SAndroid Build Coastguard Worker   info2.file = "nothing";
460*635a8641SAndroid Build Coastguard Worker   info2.debug_file = "farewell";
461*635a8641SAndroid Build Coastguard Worker 
462*635a8641SAndroid Build Coastguard Worker   global->RecordModuleInfo(info2);
463*635a8641SAndroid Build Coastguard Worker   std::vector<GlobalActivityTracker::ModuleInfo> modules2;
464*635a8641SAndroid Build Coastguard Worker   modules2 = global_analyzer.GetModules(global_analyzer.GetFirstProcess());
465*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(2U, modules2.size());
466*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::ModuleInfo& stored2 = modules2[1];
467*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info2.is_loaded, stored2.is_loaded);
468*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info2.address, stored2.address);
469*635a8641SAndroid Build Coastguard Worker   EXPECT_NE(info2.load_time, stored2.load_time);
470*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info2.size, stored2.size);
471*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info2.timestamp, stored2.timestamp);
472*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info2.age, stored2.age);
473*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info2.identifier[0], stored2.identifier[0]);
474*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info2.file, stored2.file);
475*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(info2.debug_file, stored2.debug_file);
476*635a8641SAndroid Build Coastguard Worker }
477*635a8641SAndroid Build Coastguard Worker 
TEST_F(ActivityAnalyzerTest,GlobalLogMessages)478*635a8641SAndroid Build Coastguard Worker TEST_F(ActivityAnalyzerTest, GlobalLogMessages) {
479*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 0);
480*635a8641SAndroid Build Coastguard Worker 
481*635a8641SAndroid Build Coastguard Worker   PersistentMemoryAllocator* allocator =
482*635a8641SAndroid Build Coastguard Worker       GlobalActivityTracker::Get()->allocator();
483*635a8641SAndroid Build Coastguard Worker   GlobalActivityAnalyzer analyzer(std::make_unique<PersistentMemoryAllocator>(
484*635a8641SAndroid Build Coastguard Worker       const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true));
485*635a8641SAndroid Build Coastguard Worker 
486*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::Get()->RecordLogMessage("hello world");
487*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::Get()->RecordLogMessage("foo bar");
488*635a8641SAndroid Build Coastguard Worker 
489*635a8641SAndroid Build Coastguard Worker   std::vector<std::string> messages = analyzer.GetLogMessages();
490*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(2U, messages.size());
491*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("hello world", messages[0]);
492*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ("foo bar", messages[1]);
493*635a8641SAndroid Build Coastguard Worker }
494*635a8641SAndroid Build Coastguard Worker 
TEST_F(ActivityAnalyzerTest,GlobalMultiProcess)495*635a8641SAndroid Build Coastguard Worker TEST_F(ActivityAnalyzerTest, GlobalMultiProcess) {
496*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::CreateWithLocalMemory(kMemorySize, 0, "", 3, 1001);
497*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker* global = GlobalActivityTracker::Get();
498*635a8641SAndroid Build Coastguard Worker   PersistentMemoryAllocator* allocator = global->allocator();
499*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1001, global->process_id());
500*635a8641SAndroid Build Coastguard Worker 
501*635a8641SAndroid Build Coastguard Worker   int64_t process_id;
502*635a8641SAndroid Build Coastguard Worker   int64_t create_stamp;
503*635a8641SAndroid Build Coastguard Worker   ActivityUserData::GetOwningProcessId(
504*635a8641SAndroid Build Coastguard Worker       GlobalActivityTracker::Get()->process_data().GetBaseAddress(),
505*635a8641SAndroid Build Coastguard Worker       &process_id, &create_stamp);
506*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(1001, process_id);
507*635a8641SAndroid Build Coastguard Worker 
508*635a8641SAndroid Build Coastguard Worker   GlobalActivityTracker::Get()->process_data().SetInt("pid",
509*635a8641SAndroid Build Coastguard Worker                                                       global->process_id());
510*635a8641SAndroid Build Coastguard Worker 
511*635a8641SAndroid Build Coastguard Worker   GlobalActivityAnalyzer analyzer(std::make_unique<PersistentMemoryAllocator>(
512*635a8641SAndroid Build Coastguard Worker       const_cast<void*>(allocator->data()), allocator->size(), 0, 0, "", true));
513*635a8641SAndroid Build Coastguard Worker 
514*635a8641SAndroid Build Coastguard Worker   AsOtherProcess(2002, [&global]() {
515*635a8641SAndroid Build Coastguard Worker     ASSERT_NE(global, GlobalActivityTracker::Get());
516*635a8641SAndroid Build Coastguard Worker     EXPECT_EQ(2002, GlobalActivityTracker::Get()->process_id());
517*635a8641SAndroid Build Coastguard Worker 
518*635a8641SAndroid Build Coastguard Worker     int64_t process_id;
519*635a8641SAndroid Build Coastguard Worker     int64_t create_stamp;
520*635a8641SAndroid Build Coastguard Worker     ActivityUserData::GetOwningProcessId(
521*635a8641SAndroid Build Coastguard Worker         GlobalActivityTracker::Get()->process_data().GetBaseAddress(),
522*635a8641SAndroid Build Coastguard Worker         &process_id, &create_stamp);
523*635a8641SAndroid Build Coastguard Worker     ASSERT_EQ(2002, process_id);
524*635a8641SAndroid Build Coastguard Worker 
525*635a8641SAndroid Build Coastguard Worker     GlobalActivityTracker::Get()->process_data().SetInt(
526*635a8641SAndroid Build Coastguard Worker         "pid", GlobalActivityTracker::Get()->process_id());
527*635a8641SAndroid Build Coastguard Worker   });
528*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(global, GlobalActivityTracker::Get());
529*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1001, GlobalActivityTracker::Get()->process_id());
530*635a8641SAndroid Build Coastguard Worker 
531*635a8641SAndroid Build Coastguard Worker   const int64_t pid1 = analyzer.GetFirstProcess();
532*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(1001, pid1);
533*635a8641SAndroid Build Coastguard Worker   const int64_t pid2 = analyzer.GetNextProcess();
534*635a8641SAndroid Build Coastguard Worker   ASSERT_EQ(2002, pid2);
535*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(0, analyzer.GetNextProcess());
536*635a8641SAndroid Build Coastguard Worker 
537*635a8641SAndroid Build Coastguard Worker   const ActivityUserData::Snapshot& pdata1 =
538*635a8641SAndroid Build Coastguard Worker       analyzer.GetProcessDataSnapshot(pid1);
539*635a8641SAndroid Build Coastguard Worker   const ActivityUserData::Snapshot& pdata2 =
540*635a8641SAndroid Build Coastguard Worker       analyzer.GetProcessDataSnapshot(pid2);
541*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(1001, pdata1.at("pid").GetInt());
542*635a8641SAndroid Build Coastguard Worker   EXPECT_EQ(2002, pdata2.at("pid").GetInt());
543*635a8641SAndroid Build Coastguard Worker }
544*635a8641SAndroid Build Coastguard Worker 
545*635a8641SAndroid Build Coastguard Worker }  // namespace debug
546*635a8641SAndroid Build Coastguard Worker }  // namespace base
547