xref: /aosp_15_r20/external/perfetto/test/test_helper.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1*6dbdd20aSAndroid Build Coastguard Worker /*
2*6dbdd20aSAndroid Build Coastguard Worker  * Copyright (C) 2018 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 "test/test_helper.h"
18*6dbdd20aSAndroid Build Coastguard Worker #include <string>
19*6dbdd20aSAndroid Build Coastguard Worker 
20*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/base/compiler.h"
21*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/base/string_utils.h"
22*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/trace_packet.h"
23*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/core/tracing_service_state.h"
24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/default_socket.h"
25*6dbdd20aSAndroid Build Coastguard Worker 
26*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/trace_packet.pbzero.h"
27*6dbdd20aSAndroid Build Coastguard Worker 
28*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
29*6dbdd20aSAndroid Build Coastguard Worker 
30*6dbdd20aSAndroid Build Coastguard Worker namespace {
ProducerSocketForMode(TestHelper::Mode mode)31*6dbdd20aSAndroid Build Coastguard Worker const char* ProducerSocketForMode(TestHelper::Mode mode) {
32*6dbdd20aSAndroid Build Coastguard Worker #if !PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
33*6dbdd20aSAndroid Build Coastguard Worker   base::ignore_result(mode);
34*6dbdd20aSAndroid Build Coastguard Worker   return ::perfetto::GetProducerSocket();
35*6dbdd20aSAndroid Build Coastguard Worker #else
36*6dbdd20aSAndroid Build Coastguard Worker   switch (mode) {
37*6dbdd20aSAndroid Build Coastguard Worker     case TestHelper::Mode::kStartDaemons:
38*6dbdd20aSAndroid Build Coastguard Worker       return "/data/local/tmp/traced_producer";
39*6dbdd20aSAndroid Build Coastguard Worker     case TestHelper::Mode::kUseSystemService:
40*6dbdd20aSAndroid Build Coastguard Worker       return ::perfetto::GetProducerSocket();
41*6dbdd20aSAndroid Build Coastguard Worker   }
42*6dbdd20aSAndroid Build Coastguard Worker #endif
43*6dbdd20aSAndroid Build Coastguard Worker }
44*6dbdd20aSAndroid Build Coastguard Worker 
ConsumerSocketForMode(TestHelper::Mode mode)45*6dbdd20aSAndroid Build Coastguard Worker const char* ConsumerSocketForMode(TestHelper::Mode mode) {
46*6dbdd20aSAndroid Build Coastguard Worker #if !PERFETTO_BUILDFLAG(PERFETTO_OS_ANDROID)
47*6dbdd20aSAndroid Build Coastguard Worker   base::ignore_result(mode);
48*6dbdd20aSAndroid Build Coastguard Worker   return ::perfetto::GetConsumerSocket();
49*6dbdd20aSAndroid Build Coastguard Worker #else
50*6dbdd20aSAndroid Build Coastguard Worker   switch (mode) {
51*6dbdd20aSAndroid Build Coastguard Worker     case TestHelper::Mode::kStartDaemons:
52*6dbdd20aSAndroid Build Coastguard Worker       return "/data/local/tmp/traced_consumer";
53*6dbdd20aSAndroid Build Coastguard Worker     case TestHelper::Mode::kUseSystemService:
54*6dbdd20aSAndroid Build Coastguard Worker       return ::perfetto::GetConsumerSocket();
55*6dbdd20aSAndroid Build Coastguard Worker   }
56*6dbdd20aSAndroid Build Coastguard Worker #endif
57*6dbdd20aSAndroid Build Coastguard Worker }
58*6dbdd20aSAndroid Build Coastguard Worker }  // namespace
59*6dbdd20aSAndroid Build Coastguard Worker 
60*6dbdd20aSAndroid Build Coastguard Worker uint64_t TestHelper::next_instance_num_ = 0;
61*6dbdd20aSAndroid Build Coastguard Worker #if PERFETTO_BUILDFLAG(PERFETTO_START_DAEMONS)
62*6dbdd20aSAndroid Build Coastguard Worker TestHelper::Mode TestHelper::kDefaultMode = Mode::kStartDaemons;
63*6dbdd20aSAndroid Build Coastguard Worker #else
64*6dbdd20aSAndroid Build Coastguard Worker TestHelper::Mode TestHelper::kDefaultMode = Mode::kUseSystemService;
65*6dbdd20aSAndroid Build Coastguard Worker #endif
66*6dbdd20aSAndroid Build Coastguard Worker 
TestHelper(base::TestTaskRunner * task_runner,Mode mode)67*6dbdd20aSAndroid Build Coastguard Worker TestHelper::TestHelper(base::TestTaskRunner* task_runner, Mode mode)
68*6dbdd20aSAndroid Build Coastguard Worker     : TestHelper(task_runner, mode, ProducerSocketForMode(mode)) {}
69*6dbdd20aSAndroid Build Coastguard Worker 
TestHelper(base::TestTaskRunner * task_runner,Mode mode,const char * producer_socket,bool enable_relay_endpoint)70*6dbdd20aSAndroid Build Coastguard Worker TestHelper::TestHelper(base::TestTaskRunner* task_runner,
71*6dbdd20aSAndroid Build Coastguard Worker                        Mode mode,
72*6dbdd20aSAndroid Build Coastguard Worker                        const char* producer_socket,
73*6dbdd20aSAndroid Build Coastguard Worker                        bool enable_relay_endpoint)
74*6dbdd20aSAndroid Build Coastguard Worker     : instance_num_(next_instance_num_++),
75*6dbdd20aSAndroid Build Coastguard Worker       task_runner_(task_runner),
76*6dbdd20aSAndroid Build Coastguard Worker       mode_(mode),
77*6dbdd20aSAndroid Build Coastguard Worker       producer_socket_(producer_socket),
78*6dbdd20aSAndroid Build Coastguard Worker       consumer_socket_(ConsumerSocketForMode(mode)),
79*6dbdd20aSAndroid Build Coastguard Worker       service_thread_(producer_socket_,
80*6dbdd20aSAndroid Build Coastguard Worker                       consumer_socket_,
81*6dbdd20aSAndroid Build Coastguard Worker                       enable_relay_endpoint) {
82*6dbdd20aSAndroid Build Coastguard Worker   auto producer_sockets = TokenizeProducerSockets(producer_socket_);
83*6dbdd20aSAndroid Build Coastguard Worker   static constexpr const char* kDefaultFakeProducerName =
84*6dbdd20aSAndroid Build Coastguard Worker       "android.perfetto.FakeProducer";
85*6dbdd20aSAndroid Build Coastguard Worker   for (size_t i = 0; i < producer_sockets.size(); i++) {
86*6dbdd20aSAndroid Build Coastguard Worker     auto cp_connect = "producer." + std::to_string(i) + ".connect";
87*6dbdd20aSAndroid Build Coastguard Worker     auto cp_setup = "producer." + std::to_string(i) + ".setup";
88*6dbdd20aSAndroid Build Coastguard Worker     auto cp_enabled = "producer." + std::to_string(i) + ".enabled";
89*6dbdd20aSAndroid Build Coastguard Worker     std::string producer_name =
90*6dbdd20aSAndroid Build Coastguard Worker         (!!i) ? +kDefaultFakeProducerName + std::string(".") + std::to_string(i)
91*6dbdd20aSAndroid Build Coastguard Worker               : kDefaultFakeProducerName;
92*6dbdd20aSAndroid Build Coastguard Worker     fake_producer_threads_.emplace_back(std::make_unique<FakeProducerThread>(
93*6dbdd20aSAndroid Build Coastguard Worker         producer_sockets[i], WrapTask(CreateCheckpoint(cp_connect)),
94*6dbdd20aSAndroid Build Coastguard Worker         WrapTask(CreateCheckpoint(cp_setup)),
95*6dbdd20aSAndroid Build Coastguard Worker         WrapTask(CreateCheckpoint(cp_enabled)), producer_name));
96*6dbdd20aSAndroid Build Coastguard Worker   }
97*6dbdd20aSAndroid Build Coastguard Worker }
98*6dbdd20aSAndroid Build Coastguard Worker 
OnConnect()99*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnConnect() {
100*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->ObserveEvents(ObservableEvents::TYPE_ALL_DATA_SOURCES_STARTED);
101*6dbdd20aSAndroid Build Coastguard Worker   std::move(on_connect_callback_)();
102*6dbdd20aSAndroid Build Coastguard Worker }
103*6dbdd20aSAndroid Build Coastguard Worker 
OnDisconnect()104*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnDisconnect() {
105*6dbdd20aSAndroid Build Coastguard Worker   PERFETTO_FATAL("Consumer unexpectedly disconnected from the service");
106*6dbdd20aSAndroid Build Coastguard Worker }
107*6dbdd20aSAndroid Build Coastguard Worker 
OnTracingDisabled(const std::string &)108*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnTracingDisabled(const std::string& /*error*/) {
109*6dbdd20aSAndroid Build Coastguard Worker   std::move(on_stop_tracing_callback_)();
110*6dbdd20aSAndroid Build Coastguard Worker   on_stop_tracing_callback_ = nullptr;
111*6dbdd20aSAndroid Build Coastguard Worker }
112*6dbdd20aSAndroid Build Coastguard Worker 
ReadTraceData(std::vector<TracePacket> packets)113*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::ReadTraceData(std::vector<TracePacket> packets) {
114*6dbdd20aSAndroid Build Coastguard Worker   for (auto& encoded_packet : packets) {
115*6dbdd20aSAndroid Build Coastguard Worker     protos::gen::TracePacket packet;
116*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_CHECK(
117*6dbdd20aSAndroid Build Coastguard Worker         packet.ParseFromString(encoded_packet.GetRawBytesForTesting()));
118*6dbdd20aSAndroid Build Coastguard Worker     full_trace_.push_back(packet);
119*6dbdd20aSAndroid Build Coastguard Worker     if (packet.has_clock_snapshot() || packet.has_trace_uuid() ||
120*6dbdd20aSAndroid Build Coastguard Worker         packet.has_trace_config() || packet.has_trace_stats() ||
121*6dbdd20aSAndroid Build Coastguard Worker         !packet.synchronization_marker().empty() || packet.has_system_info() ||
122*6dbdd20aSAndroid Build Coastguard Worker         packet.has_service_event()) {
123*6dbdd20aSAndroid Build Coastguard Worker       continue;
124*6dbdd20aSAndroid Build Coastguard Worker     }
125*6dbdd20aSAndroid Build Coastguard Worker     PERFETTO_CHECK(packet.has_trusted_uid());
126*6dbdd20aSAndroid Build Coastguard Worker     trace_.push_back(std::move(packet));
127*6dbdd20aSAndroid Build Coastguard Worker   }
128*6dbdd20aSAndroid Build Coastguard Worker }
129*6dbdd20aSAndroid Build Coastguard Worker 
OnTraceData(std::vector<TracePacket> packets,bool has_more)130*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnTraceData(std::vector<TracePacket> packets, bool has_more) {
131*6dbdd20aSAndroid Build Coastguard Worker   ReadTraceData(std::move(packets));
132*6dbdd20aSAndroid Build Coastguard Worker   if (!has_more) {
133*6dbdd20aSAndroid Build Coastguard Worker     std::move(on_packets_finished_callback_)();
134*6dbdd20aSAndroid Build Coastguard Worker   }
135*6dbdd20aSAndroid Build Coastguard Worker }
136*6dbdd20aSAndroid Build Coastguard Worker 
StartServiceIfRequired()137*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::StartServiceIfRequired() {
138*6dbdd20aSAndroid Build Coastguard Worker   if (mode_ == Mode::kStartDaemons)
139*6dbdd20aSAndroid Build Coastguard Worker     env_cleaner_ = service_thread_.Start();
140*6dbdd20aSAndroid Build Coastguard Worker }
141*6dbdd20aSAndroid Build Coastguard Worker 
RestartService()142*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::RestartService() {
143*6dbdd20aSAndroid Build Coastguard Worker   PERFETTO_CHECK(mode_ == Mode::kStartDaemons);
144*6dbdd20aSAndroid Build Coastguard Worker   service_thread_.Stop();
145*6dbdd20aSAndroid Build Coastguard Worker   service_thread_.Start();
146*6dbdd20aSAndroid Build Coastguard Worker }
147*6dbdd20aSAndroid Build Coastguard Worker 
ConnectFakeProducer(size_t idx)148*6dbdd20aSAndroid Build Coastguard Worker FakeProducer* TestHelper::ConnectFakeProducer(size_t idx) {
149*6dbdd20aSAndroid Build Coastguard Worker   fake_producer_threads_[idx]->Connect();
150*6dbdd20aSAndroid Build Coastguard Worker   // This will wait until the service has seen the RegisterDataSource() call
151*6dbdd20aSAndroid Build Coastguard Worker   // (because of the Sync() in FakeProducer::OnConnect()).
152*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("producer." + std::to_string(idx) + ".connect");
153*6dbdd20aSAndroid Build Coastguard Worker   return fake_producer_threads_[idx]->producer();
154*6dbdd20aSAndroid Build Coastguard Worker }
155*6dbdd20aSAndroid Build Coastguard Worker 
ConnectConsumer()156*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::ConnectConsumer() {
157*6dbdd20aSAndroid Build Coastguard Worker   cur_consumer_num_++;
158*6dbdd20aSAndroid Build Coastguard Worker   on_connect_callback_ = CreateCheckpoint("consumer.connected." +
159*6dbdd20aSAndroid Build Coastguard Worker                                           std::to_string(cur_consumer_num_));
160*6dbdd20aSAndroid Build Coastguard Worker   endpoint_ = ConsumerIPCClient::Connect(consumer_socket_, this, task_runner_);
161*6dbdd20aSAndroid Build Coastguard Worker }
162*6dbdd20aSAndroid Build Coastguard Worker 
DetachConsumer(const std::string & key)163*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::DetachConsumer(const std::string& key) {
164*6dbdd20aSAndroid Build Coastguard Worker   on_detach_callback_ = CreateCheckpoint("detach." + key);
165*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->Detach(key);
166*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("detach." + key);
167*6dbdd20aSAndroid Build Coastguard Worker   endpoint_.reset();
168*6dbdd20aSAndroid Build Coastguard Worker }
169*6dbdd20aSAndroid Build Coastguard Worker 
AttachConsumer(const std::string & key)170*6dbdd20aSAndroid Build Coastguard Worker bool TestHelper::AttachConsumer(const std::string& key) {
171*6dbdd20aSAndroid Build Coastguard Worker   bool success = false;
172*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint = CreateCheckpoint("attach." + key);
173*6dbdd20aSAndroid Build Coastguard Worker   on_attach_callback_ = [&success, checkpoint](bool s) {
174*6dbdd20aSAndroid Build Coastguard Worker     success = s;
175*6dbdd20aSAndroid Build Coastguard Worker     checkpoint();
176*6dbdd20aSAndroid Build Coastguard Worker   };
177*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->Attach(key);
178*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("attach." + key);
179*6dbdd20aSAndroid Build Coastguard Worker   return success;
180*6dbdd20aSAndroid Build Coastguard Worker }
181*6dbdd20aSAndroid Build Coastguard Worker 
CreateProducerProvidedSmb()182*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::CreateProducerProvidedSmb() {
183*6dbdd20aSAndroid Build Coastguard Worker   for (auto& thread : fake_producer_threads_)
184*6dbdd20aSAndroid Build Coastguard Worker     thread->CreateProducerProvidedSmb();
185*6dbdd20aSAndroid Build Coastguard Worker }
186*6dbdd20aSAndroid Build Coastguard Worker 
IsShmemProvidedByProducer(size_t i)187*6dbdd20aSAndroid Build Coastguard Worker bool TestHelper::IsShmemProvidedByProducer(size_t i) {
188*6dbdd20aSAndroid Build Coastguard Worker   return fake_producer_threads_[i]->producer()->IsShmemProvidedByProducer();
189*6dbdd20aSAndroid Build Coastguard Worker }
190*6dbdd20aSAndroid Build Coastguard Worker 
ProduceStartupEventBatch(const protos::gen::TestConfig & config)191*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::ProduceStartupEventBatch(
192*6dbdd20aSAndroid Build Coastguard Worker     const protos::gen::TestConfig& config) {
193*6dbdd20aSAndroid Build Coastguard Worker   for (size_t i = 0; i < fake_producer_threads_.size(); i++) {
194*6dbdd20aSAndroid Build Coastguard Worker     auto checkpoint_name =
195*6dbdd20aSAndroid Build Coastguard Worker         base::StackString<32>("startup_data_written.%zu", i).ToStdString();
196*6dbdd20aSAndroid Build Coastguard Worker     auto on_data_written = CreateCheckpoint(checkpoint_name);
197*6dbdd20aSAndroid Build Coastguard Worker     fake_producer_threads_[i]->ProduceStartupEventBatch(
198*6dbdd20aSAndroid Build Coastguard Worker         config, WrapTask(on_data_written));
199*6dbdd20aSAndroid Build Coastguard Worker     RunUntilCheckpoint(checkpoint_name);
200*6dbdd20aSAndroid Build Coastguard Worker   }
201*6dbdd20aSAndroid Build Coastguard Worker }
202*6dbdd20aSAndroid Build Coastguard Worker 
StartTracing(const TraceConfig & config,base::ScopedFile file)203*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::StartTracing(const TraceConfig& config,
204*6dbdd20aSAndroid Build Coastguard Worker                               base::ScopedFile file) {
205*6dbdd20aSAndroid Build Coastguard Worker   PERFETTO_CHECK(!on_stop_tracing_callback_);
206*6dbdd20aSAndroid Build Coastguard Worker   trace_.clear();
207*6dbdd20aSAndroid Build Coastguard Worker   on_stop_tracing_callback_ =
208*6dbdd20aSAndroid Build Coastguard Worker       CreateCheckpoint("stop.tracing" + std::to_string(++trace_count_));
209*6dbdd20aSAndroid Build Coastguard Worker   on_all_ds_started_callback_ = CreateCheckpoint("all.datasources.started" +
210*6dbdd20aSAndroid Build Coastguard Worker                                                  std::to_string(trace_count_));
211*6dbdd20aSAndroid Build Coastguard Worker 
212*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->EnableTracing(config, std::move(file));
213*6dbdd20aSAndroid Build Coastguard Worker }
214*6dbdd20aSAndroid Build Coastguard Worker 
DisableTracing()215*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::DisableTracing() {
216*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->DisableTracing();
217*6dbdd20aSAndroid Build Coastguard Worker }
218*6dbdd20aSAndroid Build Coastguard Worker 
FlushAndWait(uint32_t timeout_ms,FlushFlags flush_flags)219*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::FlushAndWait(uint32_t timeout_ms, FlushFlags flush_flags) {
220*6dbdd20aSAndroid Build Coastguard Worker   static int flush_num = 0;
221*6dbdd20aSAndroid Build Coastguard Worker   std::string checkpoint_name = "flush." + std::to_string(flush_num++);
222*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint = CreateCheckpoint(checkpoint_name);
223*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->Flush(
224*6dbdd20aSAndroid Build Coastguard Worker       timeout_ms, [checkpoint](bool) { checkpoint(); }, flush_flags);
225*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint(checkpoint_name, timeout_ms + 1000);
226*6dbdd20aSAndroid Build Coastguard Worker }
227*6dbdd20aSAndroid Build Coastguard Worker 
ReadData(uint32_t read_count)228*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::ReadData(uint32_t read_count) {
229*6dbdd20aSAndroid Build Coastguard Worker   on_packets_finished_callback_ =
230*6dbdd20aSAndroid Build Coastguard Worker       CreateCheckpoint("readback.complete." + std::to_string(read_count));
231*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->ReadBuffers();
232*6dbdd20aSAndroid Build Coastguard Worker }
233*6dbdd20aSAndroid Build Coastguard Worker 
FreeBuffers()234*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::FreeBuffers() {
235*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->FreeBuffers();
236*6dbdd20aSAndroid Build Coastguard Worker }
237*6dbdd20aSAndroid Build Coastguard Worker 
WaitForConsumerConnect()238*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::WaitForConsumerConnect() {
239*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("consumer.connected." + std::to_string(cur_consumer_num_));
240*6dbdd20aSAndroid Build Coastguard Worker }
241*6dbdd20aSAndroid Build Coastguard Worker 
WaitForProducerSetup(size_t idx)242*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::WaitForProducerSetup(size_t idx) {
243*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("producer." + std::to_string(idx) + ".setup");
244*6dbdd20aSAndroid Build Coastguard Worker }
245*6dbdd20aSAndroid Build Coastguard Worker 
WaitForProducerEnabled(size_t idx)246*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::WaitForProducerEnabled(size_t idx) {
247*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("producer." + std::to_string(idx) + ".enabled");
248*6dbdd20aSAndroid Build Coastguard Worker }
249*6dbdd20aSAndroid Build Coastguard Worker 
WaitForTracingDisabled(uint32_t timeout_ms)250*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::WaitForTracingDisabled(uint32_t timeout_ms) {
251*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("stop.tracing" + std::to_string(trace_count_), timeout_ms);
252*6dbdd20aSAndroid Build Coastguard Worker }
253*6dbdd20aSAndroid Build Coastguard Worker 
WaitForAllDataSourceStarted(uint32_t timeout_ms)254*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::WaitForAllDataSourceStarted(uint32_t timeout_ms) {
255*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("all.datasources.started" + std::to_string(trace_count_),
256*6dbdd20aSAndroid Build Coastguard Worker                      timeout_ms);
257*6dbdd20aSAndroid Build Coastguard Worker }
258*6dbdd20aSAndroid Build Coastguard Worker 
WaitForReadData(uint32_t read_count,uint32_t timeout_ms)259*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::WaitForReadData(uint32_t read_count, uint32_t timeout_ms) {
260*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint("readback.complete." + std::to_string(read_count),
261*6dbdd20aSAndroid Build Coastguard Worker                      timeout_ms);
262*6dbdd20aSAndroid Build Coastguard Worker }
263*6dbdd20aSAndroid Build Coastguard Worker 
WaitFor(std::function<bool ()> predicate,const std::string & error_msg,uint32_t timeout_ms)264*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::WaitFor(std::function<bool()> predicate,
265*6dbdd20aSAndroid Build Coastguard Worker                          const std::string& error_msg,
266*6dbdd20aSAndroid Build Coastguard Worker                          uint32_t timeout_ms) {
267*6dbdd20aSAndroid Build Coastguard Worker   int64_t deadline_ms = base::GetWallTimeMs().count() + timeout_ms;
268*6dbdd20aSAndroid Build Coastguard Worker   while (base::GetWallTimeMs().count() < deadline_ms) {
269*6dbdd20aSAndroid Build Coastguard Worker     if (predicate())
270*6dbdd20aSAndroid Build Coastguard Worker       return;
271*6dbdd20aSAndroid Build Coastguard Worker     base::SleepMicroseconds(500 * 1000);  // 0.5 s.
272*6dbdd20aSAndroid Build Coastguard Worker   }
273*6dbdd20aSAndroid Build Coastguard Worker   PERFETTO_FATAL("Test timed out waiting for: %s", error_msg.c_str());
274*6dbdd20aSAndroid Build Coastguard Worker }
275*6dbdd20aSAndroid Build Coastguard Worker 
WaitForDataSourceConnected(const std::string & ds_name)276*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::WaitForDataSourceConnected(const std::string& ds_name) {
277*6dbdd20aSAndroid Build Coastguard Worker   auto predicate = [&] {
278*6dbdd20aSAndroid Build Coastguard Worker     auto dss = QueryServiceStateAndWait().data_sources();
279*6dbdd20aSAndroid Build Coastguard Worker     return std::any_of(dss.begin(), dss.end(),
280*6dbdd20aSAndroid Build Coastguard Worker                        [&](const TracingServiceState::DataSource& ds) {
281*6dbdd20aSAndroid Build Coastguard Worker                          return ds.ds_descriptor().name() == ds_name;
282*6dbdd20aSAndroid Build Coastguard Worker                        });
283*6dbdd20aSAndroid Build Coastguard Worker   };
284*6dbdd20aSAndroid Build Coastguard Worker   WaitFor(predicate, "connection of data source " + ds_name);
285*6dbdd20aSAndroid Build Coastguard Worker }
286*6dbdd20aSAndroid Build Coastguard Worker 
SyncAndWaitProducer(size_t idx)287*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::SyncAndWaitProducer(size_t idx) {
288*6dbdd20aSAndroid Build Coastguard Worker   static int sync_id = 0;
289*6dbdd20aSAndroid Build Coastguard Worker   std::string checkpoint_name =
290*6dbdd20aSAndroid Build Coastguard Worker       "producer_sync_" + std::to_string(idx) + "_" + std::to_string(++sync_id);
291*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint = CreateCheckpoint(checkpoint_name);
292*6dbdd20aSAndroid Build Coastguard Worker   fake_producer_threads_[idx]->producer()->Sync(
293*6dbdd20aSAndroid Build Coastguard Worker       [this, &checkpoint] { task_runner_->PostTask(checkpoint); });
294*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint(checkpoint_name);
295*6dbdd20aSAndroid Build Coastguard Worker }
296*6dbdd20aSAndroid Build Coastguard Worker 
QueryServiceStateAndWait()297*6dbdd20aSAndroid Build Coastguard Worker TracingServiceState TestHelper::QueryServiceStateAndWait() {
298*6dbdd20aSAndroid Build Coastguard Worker   TracingServiceState res;
299*6dbdd20aSAndroid Build Coastguard Worker   static int n = 0;
300*6dbdd20aSAndroid Build Coastguard Worker   std::string checkpoint_name = "query_svc_state_" + std::to_string(n++);
301*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint = CreateCheckpoint(checkpoint_name);
302*6dbdd20aSAndroid Build Coastguard Worker   auto callback = [&checkpoint, &res](bool, const TracingServiceState& tss) {
303*6dbdd20aSAndroid Build Coastguard Worker     res = tss;
304*6dbdd20aSAndroid Build Coastguard Worker     checkpoint();
305*6dbdd20aSAndroid Build Coastguard Worker   };
306*6dbdd20aSAndroid Build Coastguard Worker   endpoint_->QueryServiceState({}, callback);
307*6dbdd20aSAndroid Build Coastguard Worker   RunUntilCheckpoint(checkpoint_name);
308*6dbdd20aSAndroid Build Coastguard Worker   return res;
309*6dbdd20aSAndroid Build Coastguard Worker }
310*6dbdd20aSAndroid Build Coastguard Worker 
WrapTask(const std::function<void ()> & function)311*6dbdd20aSAndroid Build Coastguard Worker std::function<void()> TestHelper::WrapTask(
312*6dbdd20aSAndroid Build Coastguard Worker     const std::function<void()>& function) {
313*6dbdd20aSAndroid Build Coastguard Worker   return [this, function] { task_runner_->PostTask(function); };
314*6dbdd20aSAndroid Build Coastguard Worker }
315*6dbdd20aSAndroid Build Coastguard Worker 
OnDetach(bool)316*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnDetach(bool) {
317*6dbdd20aSAndroid Build Coastguard Worker   if (on_detach_callback_)
318*6dbdd20aSAndroid Build Coastguard Worker     std::move(on_detach_callback_)();
319*6dbdd20aSAndroid Build Coastguard Worker }
320*6dbdd20aSAndroid Build Coastguard Worker 
OnAttach(bool success,const TraceConfig &)321*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnAttach(bool success, const TraceConfig&) {
322*6dbdd20aSAndroid Build Coastguard Worker   if (on_attach_callback_)
323*6dbdd20aSAndroid Build Coastguard Worker     std::move(on_attach_callback_)(success);
324*6dbdd20aSAndroid Build Coastguard Worker }
325*6dbdd20aSAndroid Build Coastguard Worker 
OnTraceStats(bool,const TraceStats &)326*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnTraceStats(bool, const TraceStats&) {}
327*6dbdd20aSAndroid Build Coastguard Worker 
OnObservableEvents(const ObservableEvents & events)328*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnObservableEvents(const ObservableEvents& events) {
329*6dbdd20aSAndroid Build Coastguard Worker   if (events.all_data_sources_started())
330*6dbdd20aSAndroid Build Coastguard Worker     std::move(on_all_ds_started_callback_)();
331*6dbdd20aSAndroid Build Coastguard Worker }
332*6dbdd20aSAndroid Build Coastguard Worker 
OnSessionCloned(const OnSessionClonedArgs &)333*6dbdd20aSAndroid Build Coastguard Worker void TestHelper::OnSessionCloned(const OnSessionClonedArgs&) {}
334*6dbdd20aSAndroid Build Coastguard Worker 
335*6dbdd20aSAndroid Build Coastguard Worker // static
GetDefaultModeConsumerSocketName()336*6dbdd20aSAndroid Build Coastguard Worker const char* TestHelper::GetDefaultModeConsumerSocketName() {
337*6dbdd20aSAndroid Build Coastguard Worker   return ConsumerSocketForMode(TestHelper::kDefaultMode);
338*6dbdd20aSAndroid Build Coastguard Worker }
339*6dbdd20aSAndroid Build Coastguard Worker 
340*6dbdd20aSAndroid Build Coastguard Worker // static
GetDefaultModeProducerSocketName()341*6dbdd20aSAndroid Build Coastguard Worker const char* TestHelper::GetDefaultModeProducerSocketName() {
342*6dbdd20aSAndroid Build Coastguard Worker   return ProducerSocketForMode(TestHelper::kDefaultMode);
343*6dbdd20aSAndroid Build Coastguard Worker }
344*6dbdd20aSAndroid Build Coastguard Worker 
345*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
346