xref: /aosp_15_r20/external/perfetto/test/android_integrationtest.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2022 The Android Open Source Project
3*6dbdd20aSAndroid Build Coastguard Worker  *
4*6dbdd20aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*6dbdd20aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*6dbdd20aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*6dbdd20aSAndroid Build Coastguard Worker  *
8*6dbdd20aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*6dbdd20aSAndroid Build Coastguard Worker  *
10*6dbdd20aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*6dbdd20aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*6dbdd20aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*6dbdd20aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*6dbdd20aSAndroid Build Coastguard Worker  * limitations under the License.
15*6dbdd20aSAndroid Build Coastguard Worker  */
16*6dbdd20aSAndroid Build Coastguard Worker 
17*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/build_config.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
20*6dbdd20aSAndroid Build Coastguard Worker 
21*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/logging.h"
22*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/file_utils.h"
23*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/pipe.h"
24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/scoped_file.h"
25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/string_utils.h"
26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/utils.h"
27*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/commit_data_request.h"
28*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/trace_packet.h"
29*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/tracing_service.h"
30*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/protozero/scattered_heap_buffer.h"
31*6dbdd20aSAndroid Build Coastguard Worker #include "src/base/test/test_task_runner.h"
32*6dbdd20aSAndroid Build Coastguard Worker #include "src/base/test/utils.h"
33*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
34*6dbdd20aSAndroid Build Coastguard Worker #include "test/test_helper.h"
35*6dbdd20aSAndroid Build Coastguard Worker 
36*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/config/power/android_power_config.pbzero.h"
37*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/config/test_config.gen.h"
38*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/config/trace_config.gen.h"
39*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/ftrace/ftrace.gen.h"
40*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/ftrace/ftrace_event.gen.h"
41*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/ftrace/ftrace_event_bundle.gen.h"
42*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/ftrace/ftrace_stats.gen.h"
43*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/perfetto/tracing_service_event.gen.h"
44*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/power/battery_counters.gen.h"
45*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/test_event.gen.h"
46*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/trace.gen.h"
47*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/trace_packet.gen.h"
48*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/trace_packet.pbzero.h"
49*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/trigger.gen.h"
50*6dbdd20aSAndroid Build Coastguard Worker 
51*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/common/sys_stats_counters.gen.h"
52*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/config/sys_stats/sys_stats_config.gen.h"
53*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/sys_stats/sys_stats.gen.h"
54*6dbdd20aSAndroid Build Coastguard Worker 
55*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
56*6dbdd20aSAndroid Build Coastguard Worker 
57*6dbdd20aSAndroid Build Coastguard Worker namespace {
58*6dbdd20aSAndroid Build Coastguard Worker 
59*6dbdd20aSAndroid Build Coastguard Worker using ::testing::ContainsRegex;
60*6dbdd20aSAndroid Build Coastguard Worker using ::testing::Each;
61*6dbdd20aSAndroid Build Coastguard Worker using ::testing::ElementsAreArray;
62*6dbdd20aSAndroid Build Coastguard Worker using ::testing::HasSubstr;
63*6dbdd20aSAndroid Build Coastguard Worker using ::testing::Property;
64*6dbdd20aSAndroid Build Coastguard Worker using ::testing::SizeIs;
65*6dbdd20aSAndroid Build Coastguard Worker 
66*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
67*6dbdd20aSAndroid Build Coastguard Worker 
TEST(PerfettoAndroidIntegrationTest,TestKmemActivity)68*6dbdd20aSAndroid Build Coastguard Worker TEST(PerfettoAndroidIntegrationTest, TestKmemActivity) {
69*6dbdd20aSAndroid Build Coastguard Worker   using C = protos::gen::VmstatCounters;
70*6dbdd20aSAndroid Build Coastguard Worker 
71*6dbdd20aSAndroid Build Coastguard Worker   base::TestTaskRunner task_runner;
72*6dbdd20aSAndroid Build Coastguard Worker 
73*6dbdd20aSAndroid Build Coastguard Worker   TestHelper helper(&task_runner);
74*6dbdd20aSAndroid Build Coastguard Worker 
75*6dbdd20aSAndroid Build Coastguard Worker   helper.StartServiceIfRequired();
76*6dbdd20aSAndroid Build Coastguard Worker 
77*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS)
78*6dbdd20aSAndroid Build Coastguard Worker   ProbesProducerThread probes(GetTestProducerSockName());
79*6dbdd20aSAndroid Build Coastguard Worker   probes.Connect();
80*6dbdd20aSAndroid Build Coastguard Worker #endif
81*6dbdd20aSAndroid Build Coastguard Worker 
82*6dbdd20aSAndroid Build Coastguard Worker   auto* producer = helper.ConnectFakeProducer();
83*6dbdd20aSAndroid Build Coastguard Worker   helper.ConnectConsumer();
84*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForConsumerConnect();
85*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForDataSourceConnected("linux.ftrace");
86*6dbdd20aSAndroid Build Coastguard Worker 
87*6dbdd20aSAndroid Build Coastguard Worker   TraceConfig trace_config;
88*6dbdd20aSAndroid Build Coastguard Worker   trace_config.add_buffers()->set_size_kb(1024);
89*6dbdd20aSAndroid Build Coastguard Worker   trace_config.set_unique_session_name("kmem_activity_test");
90*6dbdd20aSAndroid Build Coastguard Worker 
91*6dbdd20aSAndroid Build Coastguard Worker   auto* ftrace_ds_config = trace_config.add_data_sources()->mutable_config();
92*6dbdd20aSAndroid Build Coastguard Worker   ftrace_ds_config->set_name("linux.ftrace");
93*6dbdd20aSAndroid Build Coastguard Worker   protos::gen::FtraceConfig ftrace_config = CreateFtraceConfig({
94*6dbdd20aSAndroid Build Coastguard Worker       "vmscan/mm_vmscan_kswapd_wake",
95*6dbdd20aSAndroid Build Coastguard Worker       "vmscan/mm_vmscan_kswapd_sleep",
96*6dbdd20aSAndroid Build Coastguard Worker       "vmscan/mm_vmscan_direct_reclaim_begin",
97*6dbdd20aSAndroid Build Coastguard Worker       "vmscan/mm_vmscan_direct_reclaim_end",
98*6dbdd20aSAndroid Build Coastguard Worker       "compaction/mm_compaction_begin",
99*6dbdd20aSAndroid Build Coastguard Worker       "compaction/mm_compaction_end",
100*6dbdd20aSAndroid Build Coastguard Worker   });
101*6dbdd20aSAndroid Build Coastguard Worker   ftrace_ds_config->set_ftrace_config_raw(ftrace_config.SerializeAsString());
102*6dbdd20aSAndroid Build Coastguard Worker 
103*6dbdd20aSAndroid Build Coastguard Worker   auto* sys_stats_ds_config = trace_config.add_data_sources()->mutable_config();
104*6dbdd20aSAndroid Build Coastguard Worker   sys_stats_ds_config->set_name("linux.sys_stats");
105*6dbdd20aSAndroid Build Coastguard Worker   protos::gen::SysStatsConfig sys_stats_config;
106*6dbdd20aSAndroid Build Coastguard Worker   sys_stats_config.set_vmstat_period_ms(50);
107*6dbdd20aSAndroid Build Coastguard Worker   std::vector<C> vmstat_counters = {
108*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_NR_FREE_PAGES,
109*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_NR_SLAB_RECLAIMABLE,
110*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_NR_SLAB_UNRECLAIMABLE,
111*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_NR_ACTIVE_FILE,
112*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_NR_INACTIVE_FILE,
113*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_NR_ACTIVE_ANON,
114*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_NR_INACTIVE_ANON,
115*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_WORKINGSET_REFAULT,
116*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_WORKINGSET_ACTIVATE,
117*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_NR_FILE_PAGES,
118*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGPGIN,
119*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGPGOUT,
120*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PSWPIN,
121*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PSWPOUT,
122*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSTEAL_KSWAPD_DMA,
123*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSTEAL_KSWAPD_NORMAL,
124*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSTEAL_KSWAPD_MOVABLE,
125*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSTEAL_DIRECT_DMA,
126*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSTEAL_DIRECT_NORMAL,
127*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSTEAL_DIRECT_MOVABLE,
128*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSCAN_KSWAPD_DMA,
129*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSCAN_KSWAPD_NORMAL,
130*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSCAN_KSWAPD_MOVABLE,
131*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSCAN_DIRECT_DMA,
132*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSCAN_DIRECT_NORMAL,
133*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_PGSCAN_DIRECT_MOVABLE,
134*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_COMPACT_MIGRATE_SCANNED,
135*6dbdd20aSAndroid Build Coastguard Worker       C::VMSTAT_COMPACT_FREE_SCANNED,
136*6dbdd20aSAndroid Build Coastguard Worker   };
137*6dbdd20aSAndroid Build Coastguard Worker   for (const auto& counter : vmstat_counters) {
138*6dbdd20aSAndroid Build Coastguard Worker     sys_stats_config.add_vmstat_counters(counter);
139*6dbdd20aSAndroid Build Coastguard Worker   }
140*6dbdd20aSAndroid Build Coastguard Worker   sys_stats_ds_config->set_sys_stats_config_raw(
141*6dbdd20aSAndroid Build Coastguard Worker       sys_stats_config.SerializeAsString());
142*6dbdd20aSAndroid Build Coastguard Worker 
143*6dbdd20aSAndroid Build Coastguard Worker   auto* trigger_cfg = trace_config.mutable_trigger_config();
144*6dbdd20aSAndroid Build Coastguard Worker   trigger_cfg->set_trigger_mode(
145*6dbdd20aSAndroid Build Coastguard Worker       protos::gen::TraceConfig::TriggerConfig::START_TRACING);
146*6dbdd20aSAndroid Build Coastguard Worker   trigger_cfg->set_trigger_timeout_ms(15000);
147*6dbdd20aSAndroid Build Coastguard Worker   auto* trigger = trigger_cfg->add_triggers();
148*6dbdd20aSAndroid Build Coastguard Worker   trigger->set_name("kmem_activity");
149*6dbdd20aSAndroid Build Coastguard Worker   // |stop_delay_ms| must be long enough that we can write the packets in
150*6dbdd20aSAndroid Build Coastguard Worker   // before the trace finishes.
151*6dbdd20aSAndroid Build Coastguard Worker   trigger->set_stop_delay_ms(1000);
152*6dbdd20aSAndroid Build Coastguard Worker 
153*6dbdd20aSAndroid Build Coastguard Worker   helper.StartTracing(trace_config);
154*6dbdd20aSAndroid Build Coastguard Worker 
155*6dbdd20aSAndroid Build Coastguard Worker   // Linearize with StartTracing. This ensures that the service has seen the
156*6dbdd20aSAndroid Build Coastguard Worker   // StartTracing IPC and has armed the triggers.
157*6dbdd20aSAndroid Build Coastguard Worker   helper.FlushAndWait(kDefaultTestTimeoutMs);
158*6dbdd20aSAndroid Build Coastguard Worker 
159*6dbdd20aSAndroid Build Coastguard Worker   // Generating synthetic memory pressure to trigger kmem activity is
160*6dbdd20aSAndroid Build Coastguard Worker   // inherently flaky on different devices. The same goes for writing
161*6dbdd20aSAndroid Build Coastguard Worker   // /proc/sys/vm/compact_memory to trigger compaction, since compaction is
162*6dbdd20aSAndroid Build Coastguard Worker   // only started if needed (even if explicitly triggered from proc).
163*6dbdd20aSAndroid Build Coastguard Worker   // Trigger kmem activity using perfetto trigger.
164*6dbdd20aSAndroid Build Coastguard Worker   producer->ActivateTrigger("kmem_activity");
165*6dbdd20aSAndroid Build Coastguard Worker 
166*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForTracingDisabled();
167*6dbdd20aSAndroid Build Coastguard Worker 
168*6dbdd20aSAndroid Build Coastguard Worker   helper.ReadData();
169*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForReadData();
170*6dbdd20aSAndroid Build Coastguard Worker 
171*6dbdd20aSAndroid Build Coastguard Worker   const auto& packets = helper.trace();
172*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_GT(packets.size(), 0u);
173*6dbdd20aSAndroid Build Coastguard Worker 
174*6dbdd20aSAndroid Build Coastguard Worker   bool sys_stats_captured = false;
175*6dbdd20aSAndroid Build Coastguard Worker   for (const auto& packet : packets) {
176*6dbdd20aSAndroid Build Coastguard Worker     for (int ev = 0; ev < packet.ftrace_events().event_size(); ev++) {
177*6dbdd20aSAndroid Build Coastguard Worker       auto ftrace_event =
178*6dbdd20aSAndroid Build Coastguard Worker           packet.ftrace_events().event()[static_cast<size_t>(ev)];
179*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_TRUE(ftrace_event.has_mm_vmscan_kswapd_wake() ||
180*6dbdd20aSAndroid Build Coastguard Worker                   ftrace_event.has_mm_vmscan_kswapd_sleep() ||
181*6dbdd20aSAndroid Build Coastguard Worker                   ftrace_event.has_mm_vmscan_direct_reclaim_begin() ||
182*6dbdd20aSAndroid Build Coastguard Worker                   ftrace_event.has_mm_vmscan_direct_reclaim_end() ||
183*6dbdd20aSAndroid Build Coastguard Worker                   ftrace_event.has_mm_compaction_begin() ||
184*6dbdd20aSAndroid Build Coastguard Worker                   ftrace_event.has_mm_compaction_end());
185*6dbdd20aSAndroid Build Coastguard Worker     }
186*6dbdd20aSAndroid Build Coastguard Worker 
187*6dbdd20aSAndroid Build Coastguard Worker     if (packet.has_sys_stats()) {
188*6dbdd20aSAndroid Build Coastguard Worker       sys_stats_captured = true;
189*6dbdd20aSAndroid Build Coastguard Worker       const auto& sys_stats = packet.sys_stats();
190*6dbdd20aSAndroid Build Coastguard Worker       const auto& vmstat = sys_stats.vmstat();
191*6dbdd20aSAndroid Build Coastguard Worker       ASSERT_GT(vmstat.size(), 0u);
192*6dbdd20aSAndroid Build Coastguard Worker       for (const auto& vmstat_value : vmstat) {
193*6dbdd20aSAndroid Build Coastguard Worker         ASSERT_NE(std::find(vmstat_counters.begin(), vmstat_counters.end(),
194*6dbdd20aSAndroid Build Coastguard Worker                             vmstat_value.key()),
195*6dbdd20aSAndroid Build Coastguard Worker                   vmstat_counters.end());
196*6dbdd20aSAndroid Build Coastguard Worker       }
197*6dbdd20aSAndroid Build Coastguard Worker     }
198*6dbdd20aSAndroid Build Coastguard Worker   }
199*6dbdd20aSAndroid Build Coastguard Worker 
200*6dbdd20aSAndroid Build Coastguard Worker   // Don't explicitly check that ftrace events were captured, since this test
201*6dbdd20aSAndroid Build Coastguard Worker   // doesn't rely on memory pressure.
202*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(sys_stats_captured);
203*6dbdd20aSAndroid Build Coastguard Worker }
204*6dbdd20aSAndroid Build Coastguard Worker 
TEST(PerfettoAndroidIntegrationTest,TestBatteryTracing)205*6dbdd20aSAndroid Build Coastguard Worker TEST(PerfettoAndroidIntegrationTest, TestBatteryTracing) {
206*6dbdd20aSAndroid Build Coastguard Worker   base::TestTaskRunner task_runner;
207*6dbdd20aSAndroid Build Coastguard Worker 
208*6dbdd20aSAndroid Build Coastguard Worker   TestHelper helper(&task_runner);
209*6dbdd20aSAndroid Build Coastguard Worker   helper.StartServiceIfRequired();
210*6dbdd20aSAndroid Build Coastguard Worker 
211*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS)
212*6dbdd20aSAndroid Build Coastguard Worker   ProbesProducerThread probes(GetTestProducerSockName());
213*6dbdd20aSAndroid Build Coastguard Worker   probes.Connect();
214*6dbdd20aSAndroid Build Coastguard Worker #endif
215*6dbdd20aSAndroid Build Coastguard Worker 
216*6dbdd20aSAndroid Build Coastguard Worker   helper.ConnectConsumer();
217*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForConsumerConnect();
218*6dbdd20aSAndroid Build Coastguard Worker 
219*6dbdd20aSAndroid Build Coastguard Worker   TraceConfig trace_config;
220*6dbdd20aSAndroid Build Coastguard Worker   trace_config.add_buffers()->set_size_kb(128);
221*6dbdd20aSAndroid Build Coastguard Worker   trace_config.set_duration_ms(3000);
222*6dbdd20aSAndroid Build Coastguard Worker 
223*6dbdd20aSAndroid Build Coastguard Worker   auto* ds_config = trace_config.add_data_sources()->mutable_config();
224*6dbdd20aSAndroid Build Coastguard Worker   ds_config->set_name("android.power");
225*6dbdd20aSAndroid Build Coastguard Worker   ds_config->set_target_buffer(0);
226*6dbdd20aSAndroid Build Coastguard Worker 
227*6dbdd20aSAndroid Build Coastguard Worker   using protos::pbzero::AndroidPowerConfig;
228*6dbdd20aSAndroid Build Coastguard Worker   protozero::HeapBuffered<AndroidPowerConfig> power_config;
229*6dbdd20aSAndroid Build Coastguard Worker   power_config->set_battery_poll_ms(250);
230*6dbdd20aSAndroid Build Coastguard Worker   power_config->add_battery_counters(
231*6dbdd20aSAndroid Build Coastguard Worker       AndroidPowerConfig::BATTERY_COUNTER_CHARGE);
232*6dbdd20aSAndroid Build Coastguard Worker   power_config->add_battery_counters(
233*6dbdd20aSAndroid Build Coastguard Worker       AndroidPowerConfig::BATTERY_COUNTER_CAPACITY_PERCENT);
234*6dbdd20aSAndroid Build Coastguard Worker   ds_config->set_android_power_config_raw(power_config.SerializeAsString());
235*6dbdd20aSAndroid Build Coastguard Worker 
236*6dbdd20aSAndroid Build Coastguard Worker   helper.StartTracing(trace_config);
237*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForTracingDisabled();
238*6dbdd20aSAndroid Build Coastguard Worker 
239*6dbdd20aSAndroid Build Coastguard Worker   helper.ReadData();
240*6dbdd20aSAndroid Build Coastguard Worker   helper.WaitForReadData();
241*6dbdd20aSAndroid Build Coastguard Worker 
242*6dbdd20aSAndroid Build Coastguard Worker   const auto& packets = helper.trace();
243*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_GT(packets.size(), 0u);
244*6dbdd20aSAndroid Build Coastguard Worker 
245*6dbdd20aSAndroid Build Coastguard Worker   bool has_battery_packet = false;
246*6dbdd20aSAndroid Build Coastguard Worker   for (const auto& packet : packets) {
247*6dbdd20aSAndroid Build Coastguard Worker     if (!packet.has_battery())
248*6dbdd20aSAndroid Build Coastguard Worker       continue;
249*6dbdd20aSAndroid Build Coastguard Worker     has_battery_packet = true;
250*6dbdd20aSAndroid Build Coastguard Worker     // Unfortunately we cannot make any assertions on the charge counter.
251*6dbdd20aSAndroid Build Coastguard Worker     // On some devices it can reach negative values (b/64685329).
252*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_GE(packet.battery().capacity_percent(), 0.f);
253*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_LE(packet.battery().capacity_percent(), 100.f);
254*6dbdd20aSAndroid Build Coastguard Worker   }
255*6dbdd20aSAndroid Build Coastguard Worker 
256*6dbdd20aSAndroid Build Coastguard Worker   ASSERT_TRUE(has_battery_packet);
257*6dbdd20aSAndroid Build Coastguard Worker }
258*6dbdd20aSAndroid Build Coastguard Worker 
259*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
260*6dbdd20aSAndroid Build Coastguard Worker 
261*6dbdd20aSAndroid Build Coastguard Worker #endif  // PERFETTO_OS_ANDROID
262