xref: /aosp_15_r20/frameworks/native/services/inputflinger/tests/InstrumentedInputReader.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2022 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 <memory>
20*38e8c45fSAndroid Build Coastguard Worker #include <queue>
21*38e8c45fSAndroid Build Coastguard Worker #include <string>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker #include <InputDevice.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <InputReader.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <utils/StrongPointer.h>
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker namespace android {
29*38e8c45fSAndroid Build Coastguard Worker 
30*38e8c45fSAndroid Build Coastguard Worker class InstrumentedInputReader : public InputReader {
31*38e8c45fSAndroid Build Coastguard Worker public:
32*38e8c45fSAndroid Build Coastguard Worker     InstrumentedInputReader(std::shared_ptr<EventHubInterface> eventHub,
33*38e8c45fSAndroid Build Coastguard Worker                             const sp<InputReaderPolicyInterface>& policy,
34*38e8c45fSAndroid Build Coastguard Worker                             InputListenerInterface& listener);
~InstrumentedInputReader()35*38e8c45fSAndroid Build Coastguard Worker     virtual ~InstrumentedInputReader() {}
36*38e8c45fSAndroid Build Coastguard Worker 
37*38e8c45fSAndroid Build Coastguard Worker     void pushNextDevice(std::shared_ptr<InputDevice> device);
38*38e8c45fSAndroid Build Coastguard Worker 
39*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<InputDevice> newDevice(int32_t deviceId, const std::string& name,
40*38e8c45fSAndroid Build Coastguard Worker                                            const std::string& location = "");
41*38e8c45fSAndroid Build Coastguard Worker 
42*38e8c45fSAndroid Build Coastguard Worker     // Make the protected loopOnce method accessible to tests.
43*38e8c45fSAndroid Build Coastguard Worker     using InputReader::loopOnce;
44*38e8c45fSAndroid Build Coastguard Worker 
45*38e8c45fSAndroid Build Coastguard Worker protected:
46*38e8c45fSAndroid Build Coastguard Worker     virtual std::shared_ptr<InputDevice> createDeviceLocked(
47*38e8c45fSAndroid Build Coastguard Worker             nsecs_t when, int32_t eventHubId, const InputDeviceIdentifier& identifier);
48*38e8c45fSAndroid Build Coastguard Worker 
49*38e8c45fSAndroid Build Coastguard Worker     class FakeInputReaderContext : public ContextImpl {
50*38e8c45fSAndroid Build Coastguard Worker     public:
FakeInputReaderContext(InputReader * reader)51*38e8c45fSAndroid Build Coastguard Worker         FakeInputReaderContext(InputReader* reader)
52*38e8c45fSAndroid Build Coastguard Worker               : ContextImpl(reader),
53*38e8c45fSAndroid Build Coastguard Worker                 mGlobalMetaState(0),
54*38e8c45fSAndroid Build Coastguard Worker                 mUpdateGlobalMetaStateWasCalled(false),
55*38e8c45fSAndroid Build Coastguard Worker                 mGeneration(1) {}
56*38e8c45fSAndroid Build Coastguard Worker 
~FakeInputReaderContext()57*38e8c45fSAndroid Build Coastguard Worker         virtual ~FakeInputReaderContext() {}
58*38e8c45fSAndroid Build Coastguard Worker 
assertUpdateGlobalMetaStateWasCalled()59*38e8c45fSAndroid Build Coastguard Worker         void assertUpdateGlobalMetaStateWasCalled() {
60*38e8c45fSAndroid Build Coastguard Worker             ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled)
61*38e8c45fSAndroid Build Coastguard Worker                     << "Expected updateGlobalMetaState() to have been called.";
62*38e8c45fSAndroid Build Coastguard Worker             mUpdateGlobalMetaStateWasCalled = false;
63*38e8c45fSAndroid Build Coastguard Worker         }
64*38e8c45fSAndroid Build Coastguard Worker 
setGlobalMetaState(int32_t state)65*38e8c45fSAndroid Build Coastguard Worker         void setGlobalMetaState(int32_t state) { mGlobalMetaState = state; }
66*38e8c45fSAndroid Build Coastguard Worker 
getGeneration()67*38e8c45fSAndroid Build Coastguard Worker         uint32_t getGeneration() { return mGeneration; }
68*38e8c45fSAndroid Build Coastguard Worker 
updateGlobalMetaState()69*38e8c45fSAndroid Build Coastguard Worker         void updateGlobalMetaState() override {
70*38e8c45fSAndroid Build Coastguard Worker             mUpdateGlobalMetaStateWasCalled = true;
71*38e8c45fSAndroid Build Coastguard Worker             ContextImpl::updateGlobalMetaState();
72*38e8c45fSAndroid Build Coastguard Worker         }
73*38e8c45fSAndroid Build Coastguard Worker 
getGlobalMetaState()74*38e8c45fSAndroid Build Coastguard Worker         int32_t getGlobalMetaState() override {
75*38e8c45fSAndroid Build Coastguard Worker             return mGlobalMetaState | ContextImpl::getGlobalMetaState();
76*38e8c45fSAndroid Build Coastguard Worker         }
77*38e8c45fSAndroid Build Coastguard Worker 
bumpGeneration()78*38e8c45fSAndroid Build Coastguard Worker         int32_t bumpGeneration() override {
79*38e8c45fSAndroid Build Coastguard Worker             mGeneration = ContextImpl::bumpGeneration();
80*38e8c45fSAndroid Build Coastguard Worker             return mGeneration;
81*38e8c45fSAndroid Build Coastguard Worker         }
82*38e8c45fSAndroid Build Coastguard Worker 
requestTimeoutAtTime(nsecs_t when)83*38e8c45fSAndroid Build Coastguard Worker         void requestTimeoutAtTime(nsecs_t when) override { mRequestedTimeout = when; }
84*38e8c45fSAndroid Build Coastguard Worker 
assertTimeoutWasRequested(nsecs_t when)85*38e8c45fSAndroid Build Coastguard Worker         void assertTimeoutWasRequested(nsecs_t when) {
86*38e8c45fSAndroid Build Coastguard Worker             ASSERT_TRUE(mRequestedTimeout) << "Expected timeout at time " << when
87*38e8c45fSAndroid Build Coastguard Worker                                            << " but there was no timeout requested.";
88*38e8c45fSAndroid Build Coastguard Worker             ASSERT_EQ(when, *mRequestedTimeout);
89*38e8c45fSAndroid Build Coastguard Worker             mRequestedTimeout.reset();
90*38e8c45fSAndroid Build Coastguard Worker         }
91*38e8c45fSAndroid Build Coastguard Worker 
assertTimeoutWasNotRequested()92*38e8c45fSAndroid Build Coastguard Worker         void assertTimeoutWasNotRequested() {
93*38e8c45fSAndroid Build Coastguard Worker             ASSERT_FALSE(mRequestedTimeout) << "Expected no timeout to have been requested,"
94*38e8c45fSAndroid Build Coastguard Worker                                                " but one was requested at time "
95*38e8c45fSAndroid Build Coastguard Worker                                             << *mRequestedTimeout;
96*38e8c45fSAndroid Build Coastguard Worker         }
97*38e8c45fSAndroid Build Coastguard Worker 
getExternalStylusDevices(std::vector<InputDeviceInfo> & outDevices)98*38e8c45fSAndroid Build Coastguard Worker         void getExternalStylusDevices(std::vector<InputDeviceInfo>& outDevices) override {
99*38e8c45fSAndroid Build Coastguard Worker             outDevices = mExternalStylusDevices;
100*38e8c45fSAndroid Build Coastguard Worker         }
101*38e8c45fSAndroid Build Coastguard Worker 
setExternalStylusDevices(std::vector<InputDeviceInfo> && devices)102*38e8c45fSAndroid Build Coastguard Worker         void setExternalStylusDevices(std::vector<InputDeviceInfo>&& devices) {
103*38e8c45fSAndroid Build Coastguard Worker             mExternalStylusDevices = devices;
104*38e8c45fSAndroid Build Coastguard Worker         }
105*38e8c45fSAndroid Build Coastguard Worker 
setPreventingTouchpadTaps(bool prevent)106*38e8c45fSAndroid Build Coastguard Worker         void setPreventingTouchpadTaps(bool prevent) override { mPreventingTouchpadTaps = prevent; }
isPreventingTouchpadTaps()107*38e8c45fSAndroid Build Coastguard Worker         bool isPreventingTouchpadTaps() override { return mPreventingTouchpadTaps; }
108*38e8c45fSAndroid Build Coastguard Worker 
setLastKeyDownTimestamp(nsecs_t when)109*38e8c45fSAndroid Build Coastguard Worker         void setLastKeyDownTimestamp(nsecs_t when) override { mLastKeyDownTimestamp = when; };
getLastKeyDownTimestamp()110*38e8c45fSAndroid Build Coastguard Worker         nsecs_t getLastKeyDownTimestamp() override { return mLastKeyDownTimestamp; };
111*38e8c45fSAndroid Build Coastguard Worker 
112*38e8c45fSAndroid Build Coastguard Worker     private:
113*38e8c45fSAndroid Build Coastguard Worker         int32_t mGlobalMetaState;
114*38e8c45fSAndroid Build Coastguard Worker         bool mUpdateGlobalMetaStateWasCalled;
115*38e8c45fSAndroid Build Coastguard Worker         int32_t mGeneration;
116*38e8c45fSAndroid Build Coastguard Worker         std::optional<nsecs_t> mRequestedTimeout;
117*38e8c45fSAndroid Build Coastguard Worker         std::vector<InputDeviceInfo> mExternalStylusDevices;
118*38e8c45fSAndroid Build Coastguard Worker         bool mPreventingTouchpadTaps{false};
119*38e8c45fSAndroid Build Coastguard Worker         nsecs_t mLastKeyDownTimestamp;
120*38e8c45fSAndroid Build Coastguard Worker     } mFakeContext;
121*38e8c45fSAndroid Build Coastguard Worker 
122*38e8c45fSAndroid Build Coastguard Worker     friend class InputReaderTest;
123*38e8c45fSAndroid Build Coastguard Worker 
124*38e8c45fSAndroid Build Coastguard Worker public:
getContext()125*38e8c45fSAndroid Build Coastguard Worker     FakeInputReaderContext* getContext() { return &mFakeContext; }
126*38e8c45fSAndroid Build Coastguard Worker 
127*38e8c45fSAndroid Build Coastguard Worker private:
128*38e8c45fSAndroid Build Coastguard Worker     std::queue<std::shared_ptr<InputDevice>> mNextDevices;
129*38e8c45fSAndroid Build Coastguard Worker };
130*38e8c45fSAndroid Build Coastguard Worker 
131*38e8c45fSAndroid Build Coastguard Worker } // namespace android
132