xref: /aosp_15_r20/frameworks/native/services/inputflinger/tests/FakeInputTracingBackend.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2024 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include "../dispatcher/trace/InputTracingBackendInterface.h"
20*38e8c45fSAndroid Build Coastguard Worker 
21*38e8c45fSAndroid Build Coastguard Worker #include <android-base/result.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <input/Input.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <condition_variable>
26*38e8c45fSAndroid Build Coastguard Worker #include <memory>
27*38e8c45fSAndroid Build Coastguard Worker #include <mutex>
28*38e8c45fSAndroid Build Coastguard Worker #include <unordered_map>
29*38e8c45fSAndroid Build Coastguard Worker #include <vector>
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker namespace android::inputdispatcher {
32*38e8c45fSAndroid Build Coastguard Worker 
33*38e8c45fSAndroid Build Coastguard Worker /**
34*38e8c45fSAndroid Build Coastguard Worker  * A class representing an input trace, used to make assertions on what was traced by
35*38e8c45fSAndroid Build Coastguard Worker  * InputDispatcher in tests. This class is thread-safe.
36*38e8c45fSAndroid Build Coastguard Worker  */
37*38e8c45fSAndroid Build Coastguard Worker class VerifyingTrace {
38*38e8c45fSAndroid Build Coastguard Worker public:
39*38e8c45fSAndroid Build Coastguard Worker     VerifyingTrace() = default;
40*38e8c45fSAndroid Build Coastguard Worker 
41*38e8c45fSAndroid Build Coastguard Worker     /** Add an expectation for a key event to be traced. */
42*38e8c45fSAndroid Build Coastguard Worker     void expectKeyDispatchTraced(const KeyEvent& event, int32_t windowId);
43*38e8c45fSAndroid Build Coastguard Worker 
44*38e8c45fSAndroid Build Coastguard Worker     /** Add an expectation for a motion event to be traced. */
45*38e8c45fSAndroid Build Coastguard Worker     void expectMotionDispatchTraced(const MotionEvent& event, int32_t windowId);
46*38e8c45fSAndroid Build Coastguard Worker 
47*38e8c45fSAndroid Build Coastguard Worker     /**
48*38e8c45fSAndroid Build Coastguard Worker      * Wait and verify that all expected events are traced.
49*38e8c45fSAndroid Build Coastguard Worker      * This is a lenient verifier that does not expect the events to be traced in the order
50*38e8c45fSAndroid Build Coastguard Worker      * that the events were expected, and does not fail if there are events that are traced that
51*38e8c45fSAndroid Build Coastguard Worker      * were not expected. Verifying does not clear the expectations.
52*38e8c45fSAndroid Build Coastguard Worker      */
53*38e8c45fSAndroid Build Coastguard Worker     void verifyExpectedEventsTraced();
54*38e8c45fSAndroid Build Coastguard Worker 
55*38e8c45fSAndroid Build Coastguard Worker     /** Reset the trace and clear all expectations. */
56*38e8c45fSAndroid Build Coastguard Worker     void reset();
57*38e8c45fSAndroid Build Coastguard Worker 
58*38e8c45fSAndroid Build Coastguard Worker private:
59*38e8c45fSAndroid Build Coastguard Worker     std::mutex mLock;
60*38e8c45fSAndroid Build Coastguard Worker     std::condition_variable mEventTracedCondition;
61*38e8c45fSAndroid Build Coastguard Worker     std::unordered_map<uint32_t /*eventId*/, trace::TracedEvent> mTracedEvents GUARDED_BY(mLock);
62*38e8c45fSAndroid Build Coastguard Worker     std::vector<trace::WindowDispatchArgs> mTracedWindowDispatches GUARDED_BY(mLock);
63*38e8c45fSAndroid Build Coastguard Worker     std::vector<std::pair<std::variant<KeyEvent, MotionEvent>, int32_t /*windowId*/>>
64*38e8c45fSAndroid Build Coastguard Worker             mExpectedEvents GUARDED_BY(mLock);
65*38e8c45fSAndroid Build Coastguard Worker 
66*38e8c45fSAndroid Build Coastguard Worker     friend class FakeInputTracingBackend;
67*38e8c45fSAndroid Build Coastguard Worker 
68*38e8c45fSAndroid Build Coastguard Worker     // Helper to verify that the given event appears as expected in the trace. If the verification
69*38e8c45fSAndroid Build Coastguard Worker     // fails, the error message describes why.
70*38e8c45fSAndroid Build Coastguard Worker     template <typename Event>
71*38e8c45fSAndroid Build Coastguard Worker     base::Result<void> verifyEventTraced(const Event&, int32_t windowId) const REQUIRES(mLock);
72*38e8c45fSAndroid Build Coastguard Worker };
73*38e8c45fSAndroid Build Coastguard Worker 
74*38e8c45fSAndroid Build Coastguard Worker /**
75*38e8c45fSAndroid Build Coastguard Worker  * A backend implementation for input tracing that records events to the provided
76*38e8c45fSAndroid Build Coastguard Worker  * VerifyingTrace used for testing.
77*38e8c45fSAndroid Build Coastguard Worker  */
78*38e8c45fSAndroid Build Coastguard Worker class FakeInputTracingBackend : public trace::InputTracingBackendInterface {
79*38e8c45fSAndroid Build Coastguard Worker public:
FakeInputTracingBackend(std::shared_ptr<VerifyingTrace> trace)80*38e8c45fSAndroid Build Coastguard Worker     FakeInputTracingBackend(std::shared_ptr<VerifyingTrace> trace) : mTrace(trace) {}
81*38e8c45fSAndroid Build Coastguard Worker 
82*38e8c45fSAndroid Build Coastguard Worker private:
83*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<VerifyingTrace> mTrace;
84*38e8c45fSAndroid Build Coastguard Worker 
85*38e8c45fSAndroid Build Coastguard Worker     void traceKeyEvent(const trace::TracedKeyEvent& entry,
86*38e8c45fSAndroid Build Coastguard Worker                        const trace::TracedEventMetadata&) override;
87*38e8c45fSAndroid Build Coastguard Worker     void traceMotionEvent(const trace::TracedMotionEvent& entry,
88*38e8c45fSAndroid Build Coastguard Worker                           const trace::TracedEventMetadata&) override;
89*38e8c45fSAndroid Build Coastguard Worker     void traceWindowDispatch(const trace::WindowDispatchArgs& entry,
90*38e8c45fSAndroid Build Coastguard Worker                              const trace::TracedEventMetadata&) override;
91*38e8c45fSAndroid Build Coastguard Worker };
92*38e8c45fSAndroid Build Coastguard Worker 
93*38e8c45fSAndroid Build Coastguard Worker } // namespace android::inputdispatcher
94