xref: /aosp_15_r20/external/perfetto/src/tracing/test/mock_consumer.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 "src/tracing/test/mock_consumer.h"
18*6dbdd20aSAndroid Build Coastguard Worker 
19*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/trace_stats.h"
20*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/core/trace_config.h"
21*6dbdd20aSAndroid Build Coastguard Worker #include "src/base/test/test_task_runner.h"
22*6dbdd20aSAndroid Build Coastguard Worker 
23*6dbdd20aSAndroid Build Coastguard Worker using ::testing::_;
24*6dbdd20aSAndroid Build Coastguard Worker using ::testing::Invoke;
25*6dbdd20aSAndroid Build Coastguard Worker 
26*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
27*6dbdd20aSAndroid Build Coastguard Worker 
MockConsumer(base::TestTaskRunner * task_runner)28*6dbdd20aSAndroid Build Coastguard Worker MockConsumer::MockConsumer(base::TestTaskRunner* task_runner)
29*6dbdd20aSAndroid Build Coastguard Worker     : task_runner_(task_runner) {}
30*6dbdd20aSAndroid Build Coastguard Worker 
~MockConsumer()31*6dbdd20aSAndroid Build Coastguard Worker MockConsumer::~MockConsumer() {
32*6dbdd20aSAndroid Build Coastguard Worker   if (!service_endpoint_)
33*6dbdd20aSAndroid Build Coastguard Worker     return;
34*6dbdd20aSAndroid Build Coastguard Worker   static int i = 0;
35*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint_name = "on_consumer_disconnect_" + std::to_string(i++);
36*6dbdd20aSAndroid Build Coastguard Worker   auto on_disconnect = task_runner_->CreateCheckpoint(checkpoint_name);
37*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_CALL(*this, OnDisconnect()).WillOnce(Invoke(on_disconnect));
38*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_.reset();
39*6dbdd20aSAndroid Build Coastguard Worker   task_runner_->RunUntilCheckpoint(checkpoint_name);
40*6dbdd20aSAndroid Build Coastguard Worker }
41*6dbdd20aSAndroid Build Coastguard Worker 
Connect(std::unique_ptr<TracingService::ConsumerEndpoint> service_endpoint)42*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::Connect(
43*6dbdd20aSAndroid Build Coastguard Worker     std::unique_ptr<TracingService::ConsumerEndpoint> service_endpoint) {
44*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_ = std::move(service_endpoint);
45*6dbdd20aSAndroid Build Coastguard Worker   static int i = 0;
46*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint_name = "on_consumer_connect_" + std::to_string(i++);
47*6dbdd20aSAndroid Build Coastguard Worker   auto on_connect = task_runner_->CreateCheckpoint(checkpoint_name);
48*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_CALL(*this, OnConnect()).WillOnce(Invoke(on_connect));
49*6dbdd20aSAndroid Build Coastguard Worker   task_runner_->RunUntilCheckpoint(checkpoint_name);
50*6dbdd20aSAndroid Build Coastguard Worker }
51*6dbdd20aSAndroid Build Coastguard Worker 
Connect(TracingService * svc,uid_t uid)52*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::Connect(TracingService* svc, uid_t uid) {
53*6dbdd20aSAndroid Build Coastguard Worker   Connect(svc->ConnectConsumer(this, uid));
54*6dbdd20aSAndroid Build Coastguard Worker }
55*6dbdd20aSAndroid Build Coastguard Worker 
ForceDisconnect()56*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::ForceDisconnect() {
57*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_.reset();
58*6dbdd20aSAndroid Build Coastguard Worker }
59*6dbdd20aSAndroid Build Coastguard Worker 
EnableTracing(const TraceConfig & trace_config,base::ScopedFile write_into_file)60*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::EnableTracing(const TraceConfig& trace_config,
61*6dbdd20aSAndroid Build Coastguard Worker                                  base::ScopedFile write_into_file) {
62*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->EnableTracing(trace_config, std::move(write_into_file));
63*6dbdd20aSAndroid Build Coastguard Worker }
64*6dbdd20aSAndroid Build Coastguard Worker 
StartTracing()65*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::StartTracing() {
66*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->StartTracing();
67*6dbdd20aSAndroid Build Coastguard Worker }
68*6dbdd20aSAndroid Build Coastguard Worker 
ChangeTraceConfig(const TraceConfig & trace_config)69*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::ChangeTraceConfig(const TraceConfig& trace_config) {
70*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->ChangeTraceConfig(trace_config);
71*6dbdd20aSAndroid Build Coastguard Worker }
72*6dbdd20aSAndroid Build Coastguard Worker 
DisableTracing()73*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::DisableTracing() {
74*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->DisableTracing();
75*6dbdd20aSAndroid Build Coastguard Worker }
76*6dbdd20aSAndroid Build Coastguard Worker 
FreeBuffers()77*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::FreeBuffers() {
78*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->FreeBuffers();
79*6dbdd20aSAndroid Build Coastguard Worker }
80*6dbdd20aSAndroid Build Coastguard Worker 
CloneSession(TracingSessionID tsid)81*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::CloneSession(TracingSessionID tsid) {
82*6dbdd20aSAndroid Build Coastguard Worker   ConsumerEndpoint::CloneSessionArgs args;
83*6dbdd20aSAndroid Build Coastguard Worker   args.tsid = tsid;
84*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->CloneSession(args);
85*6dbdd20aSAndroid Build Coastguard Worker }
86*6dbdd20aSAndroid Build Coastguard Worker 
WaitForTracingDisabledWithError(const testing::Matcher<const std::string &> & error_matcher,uint32_t timeout_ms)87*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::WaitForTracingDisabledWithError(
88*6dbdd20aSAndroid Build Coastguard Worker     const testing::Matcher<const std::string&>& error_matcher,
89*6dbdd20aSAndroid Build Coastguard Worker     uint32_t timeout_ms) {
90*6dbdd20aSAndroid Build Coastguard Worker   static int i = 0;
91*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint_name = "on_tracing_disabled_consumer_" + std::to_string(i++);
92*6dbdd20aSAndroid Build Coastguard Worker   auto on_tracing_disabled = task_runner_->CreateCheckpoint(checkpoint_name);
93*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_CALL(*this, OnTracingDisabled(error_matcher))
94*6dbdd20aSAndroid Build Coastguard Worker       .WillOnce(testing::InvokeWithoutArgs(on_tracing_disabled));
95*6dbdd20aSAndroid Build Coastguard Worker   task_runner_->RunUntilCheckpoint(checkpoint_name, timeout_ms);
96*6dbdd20aSAndroid Build Coastguard Worker }
97*6dbdd20aSAndroid Build Coastguard Worker 
Flush(uint32_t timeout_ms,FlushFlags flush_flags)98*6dbdd20aSAndroid Build Coastguard Worker MockConsumer::FlushRequest MockConsumer::Flush(uint32_t timeout_ms,
99*6dbdd20aSAndroid Build Coastguard Worker                                                FlushFlags flush_flags) {
100*6dbdd20aSAndroid Build Coastguard Worker   static int i = 0;
101*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint_name = "on_consumer_flush_" + std::to_string(i++);
102*6dbdd20aSAndroid Build Coastguard Worker   auto on_flush = task_runner_->CreateCheckpoint(checkpoint_name);
103*6dbdd20aSAndroid Build Coastguard Worker   std::shared_ptr<bool> result(new bool());
104*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->Flush(
105*6dbdd20aSAndroid Build Coastguard Worker       timeout_ms,
106*6dbdd20aSAndroid Build Coastguard Worker       [result, on_flush](bool success) {
107*6dbdd20aSAndroid Build Coastguard Worker         *result = success;
108*6dbdd20aSAndroid Build Coastguard Worker         on_flush();
109*6dbdd20aSAndroid Build Coastguard Worker       },
110*6dbdd20aSAndroid Build Coastguard Worker       flush_flags);
111*6dbdd20aSAndroid Build Coastguard Worker 
112*6dbdd20aSAndroid Build Coastguard Worker   base::TestTaskRunner* task_runner = task_runner_;
113*6dbdd20aSAndroid Build Coastguard Worker   auto wait_for_flush_completion = [result, task_runner,
114*6dbdd20aSAndroid Build Coastguard Worker                                     checkpoint_name]() -> bool {
115*6dbdd20aSAndroid Build Coastguard Worker     task_runner->RunUntilCheckpoint(checkpoint_name);
116*6dbdd20aSAndroid Build Coastguard Worker     return *result;
117*6dbdd20aSAndroid Build Coastguard Worker   };
118*6dbdd20aSAndroid Build Coastguard Worker 
119*6dbdd20aSAndroid Build Coastguard Worker   return FlushRequest(wait_for_flush_completion);
120*6dbdd20aSAndroid Build Coastguard Worker }
121*6dbdd20aSAndroid Build Coastguard Worker 
ReadBuffers()122*6dbdd20aSAndroid Build Coastguard Worker std::vector<protos::gen::TracePacket> MockConsumer::ReadBuffers() {
123*6dbdd20aSAndroid Build Coastguard Worker   std::vector<protos::gen::TracePacket> decoded_packets;
124*6dbdd20aSAndroid Build Coastguard Worker   static int i = 0;
125*6dbdd20aSAndroid Build Coastguard Worker   std::string checkpoint_name = "on_read_buffers_" + std::to_string(i++);
126*6dbdd20aSAndroid Build Coastguard Worker   auto on_read_buffers = task_runner_->CreateCheckpoint(checkpoint_name);
127*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_CALL(*this, OnTraceData(_, _))
128*6dbdd20aSAndroid Build Coastguard Worker       .WillRepeatedly(Invoke([&decoded_packets, on_read_buffers](
129*6dbdd20aSAndroid Build Coastguard Worker                                  std::vector<TracePacket>* packets,
130*6dbdd20aSAndroid Build Coastguard Worker                                  bool has_more) {
131*6dbdd20aSAndroid Build Coastguard Worker         for (TracePacket& packet : *packets) {
132*6dbdd20aSAndroid Build Coastguard Worker           decoded_packets.emplace_back();
133*6dbdd20aSAndroid Build Coastguard Worker           protos::gen::TracePacket* decoded_packet = &decoded_packets.back();
134*6dbdd20aSAndroid Build Coastguard Worker           decoded_packet->ParseFromString(packet.GetRawBytesForTesting());
135*6dbdd20aSAndroid Build Coastguard Worker         }
136*6dbdd20aSAndroid Build Coastguard Worker         if (!has_more)
137*6dbdd20aSAndroid Build Coastguard Worker           on_read_buffers();
138*6dbdd20aSAndroid Build Coastguard Worker       }));
139*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->ReadBuffers();
140*6dbdd20aSAndroid Build Coastguard Worker   task_runner_->RunUntilCheckpoint(checkpoint_name);
141*6dbdd20aSAndroid Build Coastguard Worker   return decoded_packets;
142*6dbdd20aSAndroid Build Coastguard Worker }
143*6dbdd20aSAndroid Build Coastguard Worker 
GetTraceStats()144*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::GetTraceStats() {
145*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->GetTraceStats();
146*6dbdd20aSAndroid Build Coastguard Worker }
147*6dbdd20aSAndroid Build Coastguard Worker 
WaitForTraceStats(bool success)148*6dbdd20aSAndroid Build Coastguard Worker TraceStats MockConsumer::WaitForTraceStats(bool success) {
149*6dbdd20aSAndroid Build Coastguard Worker   static int i = 0;
150*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint_name = "on_trace_stats_" + std::to_string(i++);
151*6dbdd20aSAndroid Build Coastguard Worker   auto on_trace_stats = task_runner_->CreateCheckpoint(checkpoint_name);
152*6dbdd20aSAndroid Build Coastguard Worker   TraceStats stats;
153*6dbdd20aSAndroid Build Coastguard Worker   auto result_callback = [on_trace_stats, &stats](bool, const TraceStats& s) {
154*6dbdd20aSAndroid Build Coastguard Worker     stats = s;
155*6dbdd20aSAndroid Build Coastguard Worker     on_trace_stats();
156*6dbdd20aSAndroid Build Coastguard Worker   };
157*6dbdd20aSAndroid Build Coastguard Worker   if (success) {
158*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_CALL(*this,
159*6dbdd20aSAndroid Build Coastguard Worker                 OnTraceStats(true, testing::Property(&TraceStats::total_buffers,
160*6dbdd20aSAndroid Build Coastguard Worker                                                      testing::Gt(0u))))
161*6dbdd20aSAndroid Build Coastguard Worker         .WillOnce(Invoke(result_callback));
162*6dbdd20aSAndroid Build Coastguard Worker   } else {
163*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_CALL(*this, OnTraceStats(false, _))
164*6dbdd20aSAndroid Build Coastguard Worker         .WillOnce(Invoke(result_callback));
165*6dbdd20aSAndroid Build Coastguard Worker   }
166*6dbdd20aSAndroid Build Coastguard Worker   task_runner_->RunUntilCheckpoint(checkpoint_name);
167*6dbdd20aSAndroid Build Coastguard Worker   return stats;
168*6dbdd20aSAndroid Build Coastguard Worker }
169*6dbdd20aSAndroid Build Coastguard Worker 
ObserveEvents(uint32_t enabled_event_types)170*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::ObserveEvents(uint32_t enabled_event_types) {
171*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->ObserveEvents(enabled_event_types);
172*6dbdd20aSAndroid Build Coastguard Worker }
173*6dbdd20aSAndroid Build Coastguard Worker 
WaitForObservableEvents()174*6dbdd20aSAndroid Build Coastguard Worker ObservableEvents MockConsumer::WaitForObservableEvents() {
175*6dbdd20aSAndroid Build Coastguard Worker   ObservableEvents events;
176*6dbdd20aSAndroid Build Coastguard Worker   static int i = 0;
177*6dbdd20aSAndroid Build Coastguard Worker   std::string checkpoint_name = "on_observable_events_" + std::to_string(i++);
178*6dbdd20aSAndroid Build Coastguard Worker   auto on_observable_events = task_runner_->CreateCheckpoint(checkpoint_name);
179*6dbdd20aSAndroid Build Coastguard Worker   EXPECT_CALL(*this, OnObservableEvents(_))
180*6dbdd20aSAndroid Build Coastguard Worker       .WillOnce(Invoke([&events, on_observable_events](
181*6dbdd20aSAndroid Build Coastguard Worker                            const ObservableEvents& observable_events) {
182*6dbdd20aSAndroid Build Coastguard Worker         events = observable_events;
183*6dbdd20aSAndroid Build Coastguard Worker         on_observable_events();
184*6dbdd20aSAndroid Build Coastguard Worker       }));
185*6dbdd20aSAndroid Build Coastguard Worker   task_runner_->RunUntilCheckpoint(checkpoint_name);
186*6dbdd20aSAndroid Build Coastguard Worker   return events;
187*6dbdd20aSAndroid Build Coastguard Worker }
188*6dbdd20aSAndroid Build Coastguard Worker 
QueryServiceState()189*6dbdd20aSAndroid Build Coastguard Worker TracingServiceState MockConsumer::QueryServiceState() {
190*6dbdd20aSAndroid Build Coastguard Worker   static int i = 0;
191*6dbdd20aSAndroid Build Coastguard Worker   TracingServiceState res;
192*6dbdd20aSAndroid Build Coastguard Worker   std::string checkpoint_name = "query_service_state_" + std::to_string(i++);
193*6dbdd20aSAndroid Build Coastguard Worker   auto checkpoint = task_runner_->CreateCheckpoint(checkpoint_name);
194*6dbdd20aSAndroid Build Coastguard Worker   auto callback = [checkpoint, &res](bool success,
195*6dbdd20aSAndroid Build Coastguard Worker                                      const TracingServiceState& svc_state) {
196*6dbdd20aSAndroid Build Coastguard Worker     EXPECT_TRUE(success);
197*6dbdd20aSAndroid Build Coastguard Worker     res = svc_state;
198*6dbdd20aSAndroid Build Coastguard Worker     checkpoint();
199*6dbdd20aSAndroid Build Coastguard Worker   };
200*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->QueryServiceState({}, callback);
201*6dbdd20aSAndroid Build Coastguard Worker   task_runner_->RunUntilCheckpoint(checkpoint_name);
202*6dbdd20aSAndroid Build Coastguard Worker   return res;
203*6dbdd20aSAndroid Build Coastguard Worker }
204*6dbdd20aSAndroid Build Coastguard Worker 
Detach(std::string key)205*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::Detach(std::string key) {
206*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->Detach(key);
207*6dbdd20aSAndroid Build Coastguard Worker }
208*6dbdd20aSAndroid Build Coastguard Worker 
Attach(std::string key)209*6dbdd20aSAndroid Build Coastguard Worker void MockConsumer::Attach(std::string key) {
210*6dbdd20aSAndroid Build Coastguard Worker   service_endpoint_->Attach(key);
211*6dbdd20aSAndroid Build Coastguard Worker }
212*6dbdd20aSAndroid Build Coastguard Worker 
213*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
214