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