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