xref: /aosp_15_r20/external/perfetto/src/tracing/test/mock_consumer.h (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 #ifndef SRC_TRACING_TEST_MOCK_CONSUMER_H_
18*6dbdd20aSAndroid Build Coastguard Worker #define SRC_TRACING_TEST_MOCK_CONSUMER_H_
19*6dbdd20aSAndroid Build Coastguard Worker 
20*6dbdd20aSAndroid Build Coastguard Worker #include <memory>
21*6dbdd20aSAndroid Build Coastguard Worker #include <string_view>
22*6dbdd20aSAndroid Build Coastguard Worker 
23*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/consumer.h"
24*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/trace_packet.h"
25*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/ext/tracing/core/tracing_service.h"
26*6dbdd20aSAndroid Build Coastguard Worker #include "perfetto/tracing/core/tracing_service_state.h"
27*6dbdd20aSAndroid Build Coastguard Worker #include "test/gtest_and_gmock.h"
28*6dbdd20aSAndroid Build Coastguard Worker 
29*6dbdd20aSAndroid Build Coastguard Worker #include "protos/perfetto/trace/trace_packet.gen.h"
30*6dbdd20aSAndroid Build Coastguard Worker 
31*6dbdd20aSAndroid Build Coastguard Worker namespace perfetto {
32*6dbdd20aSAndroid Build Coastguard Worker 
33*6dbdd20aSAndroid Build Coastguard Worker namespace base {
34*6dbdd20aSAndroid Build Coastguard Worker class TestTaskRunner;
35*6dbdd20aSAndroid Build Coastguard Worker }
36*6dbdd20aSAndroid Build Coastguard Worker 
37*6dbdd20aSAndroid Build Coastguard Worker class MockConsumer : public Consumer {
38*6dbdd20aSAndroid Build Coastguard Worker  public:
39*6dbdd20aSAndroid Build Coastguard Worker   class FlushRequest {
40*6dbdd20aSAndroid Build Coastguard Worker    public:
FlushRequest(std::function<bool (void)> wait_func)41*6dbdd20aSAndroid Build Coastguard Worker     FlushRequest(std::function<bool(void)> wait_func) : wait_func_(wait_func) {}
WaitForReply()42*6dbdd20aSAndroid Build Coastguard Worker     bool WaitForReply() { return wait_func_(); }
43*6dbdd20aSAndroid Build Coastguard Worker 
44*6dbdd20aSAndroid Build Coastguard Worker    private:
45*6dbdd20aSAndroid Build Coastguard Worker     std::function<bool(void)> wait_func_;
46*6dbdd20aSAndroid Build Coastguard Worker   };
47*6dbdd20aSAndroid Build Coastguard Worker 
48*6dbdd20aSAndroid Build Coastguard Worker   explicit MockConsumer(base::TestTaskRunner*);
49*6dbdd20aSAndroid Build Coastguard Worker   ~MockConsumer() override;
50*6dbdd20aSAndroid Build Coastguard Worker 
51*6dbdd20aSAndroid Build Coastguard Worker   void Connect(std::unique_ptr<TracingService::ConsumerEndpoint>);
52*6dbdd20aSAndroid Build Coastguard Worker   void Connect(TracingService* svc, uid_t = 0);
53*6dbdd20aSAndroid Build Coastguard Worker   void ForceDisconnect();
54*6dbdd20aSAndroid Build Coastguard Worker   void EnableTracing(const TraceConfig&, base::ScopedFile = base::ScopedFile());
55*6dbdd20aSAndroid Build Coastguard Worker   void StartTracing();
56*6dbdd20aSAndroid Build Coastguard Worker   void Detach(std::string key);
57*6dbdd20aSAndroid Build Coastguard Worker   void Attach(std::string key);
58*6dbdd20aSAndroid Build Coastguard Worker   void ChangeTraceConfig(const TraceConfig&);
59*6dbdd20aSAndroid Build Coastguard Worker   void DisableTracing();
60*6dbdd20aSAndroid Build Coastguard Worker   void FreeBuffers();
61*6dbdd20aSAndroid Build Coastguard Worker   void WaitForTracingDisabled(uint32_t timeout_ms = 3000) {
62*6dbdd20aSAndroid Build Coastguard Worker     return WaitForTracingDisabledWithError(testing::_, timeout_ms);
63*6dbdd20aSAndroid Build Coastguard Worker   }
64*6dbdd20aSAndroid Build Coastguard Worker   void WaitForTracingDisabledWithError(
65*6dbdd20aSAndroid Build Coastguard Worker       const testing::Matcher<const std::string&>& error_matcher,
66*6dbdd20aSAndroid Build Coastguard Worker       uint32_t timeout_ms = 3000);
67*6dbdd20aSAndroid Build Coastguard Worker   FlushRequest Flush(
68*6dbdd20aSAndroid Build Coastguard Worker       uint32_t timeout_ms = 10000,
69*6dbdd20aSAndroid Build Coastguard Worker       FlushFlags = FlushFlags(FlushFlags::Initiator::kConsumerSdk,
70*6dbdd20aSAndroid Build Coastguard Worker                               FlushFlags::Reason::kExplicit));
71*6dbdd20aSAndroid Build Coastguard Worker   std::vector<protos::gen::TracePacket> ReadBuffers();
72*6dbdd20aSAndroid Build Coastguard Worker   void GetTraceStats();
73*6dbdd20aSAndroid Build Coastguard Worker   TraceStats WaitForTraceStats(bool success);
74*6dbdd20aSAndroid Build Coastguard Worker   TracingServiceState QueryServiceState();
75*6dbdd20aSAndroid Build Coastguard Worker   void ObserveEvents(uint32_t enabled_event_types);
76*6dbdd20aSAndroid Build Coastguard Worker   ObservableEvents WaitForObservableEvents();
77*6dbdd20aSAndroid Build Coastguard Worker   void CloneSession(TracingSessionID);
78*6dbdd20aSAndroid Build Coastguard Worker 
endpoint()79*6dbdd20aSAndroid Build Coastguard Worker   TracingService::ConsumerEndpoint* endpoint() {
80*6dbdd20aSAndroid Build Coastguard Worker     return service_endpoint_.get();
81*6dbdd20aSAndroid Build Coastguard Worker   }
82*6dbdd20aSAndroid Build Coastguard Worker 
83*6dbdd20aSAndroid Build Coastguard Worker   // Consumer implementation.
84*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void, OnConnect, (), (override));
85*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void, OnDisconnect, (), (override));
86*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void,
87*6dbdd20aSAndroid Build Coastguard Worker               OnTracingDisabled,
88*6dbdd20aSAndroid Build Coastguard Worker               (const std::string& /*error*/),
89*6dbdd20aSAndroid Build Coastguard Worker               (override));
90*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void,
91*6dbdd20aSAndroid Build Coastguard Worker               OnTraceData,
92*6dbdd20aSAndroid Build Coastguard Worker               (std::vector<TracePacket>* /*packets*/, bool /*has_more*/));
93*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void, OnDetach, (bool), (override));
94*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void, OnAttach, (bool, const TraceConfig&), (override));
95*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void, OnTraceStats, (bool, const TraceStats&), (override));
96*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void, OnObservableEvents, (const ObservableEvents&), (override));
97*6dbdd20aSAndroid Build Coastguard Worker   MOCK_METHOD(void, OnSessionCloned, (const OnSessionClonedArgs&), (override));
98*6dbdd20aSAndroid Build Coastguard Worker 
99*6dbdd20aSAndroid Build Coastguard Worker   // gtest doesn't support move-only types. This wrapper is here jut to pass
100*6dbdd20aSAndroid Build Coastguard Worker   // a pointer to the vector (rather than the vector itself) to the mock method.
OnTraceData(std::vector<TracePacket> packets,bool has_more)101*6dbdd20aSAndroid Build Coastguard Worker   void OnTraceData(std::vector<TracePacket> packets, bool has_more) override {
102*6dbdd20aSAndroid Build Coastguard Worker     OnTraceData(&packets, has_more);
103*6dbdd20aSAndroid Build Coastguard Worker   }
104*6dbdd20aSAndroid Build Coastguard Worker 
105*6dbdd20aSAndroid Build Coastguard Worker  private:
106*6dbdd20aSAndroid Build Coastguard Worker   base::TestTaskRunner* const task_runner_;
107*6dbdd20aSAndroid Build Coastguard Worker   std::unique_ptr<TracingService::ConsumerEndpoint> service_endpoint_;
108*6dbdd20aSAndroid Build Coastguard Worker };
109*6dbdd20aSAndroid Build Coastguard Worker 
110*6dbdd20aSAndroid Build Coastguard Worker }  // namespace perfetto
111*6dbdd20aSAndroid Build Coastguard Worker 
112*6dbdd20aSAndroid Build Coastguard Worker #endif  // SRC_TRACING_TEST_MOCK_CONSUMER_H_
113