blob: c2ac2587652801baa20a83de688c516903d2de65 [file] [log] [blame]
Harry Cuttse6512e12022-11-28 18:44:01 +00001/*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <list>
20#include <memory>
21
22#include <InputDevice.h>
23#include <InputMapper.h>
24#include <NotifyArgs.h>
25#include <ftl/flags.h>
Siarhei Vishniakou979f2d82023-05-16 14:26:24 -070026#include <gmock/gmock.h>
Harry Cuttse6512e12022-11-28 18:44:01 +000027#include <utils/StrongPointer.h>
28
29#include "FakeEventHub.h"
30#include "FakeInputReaderPolicy.h"
31#include "InstrumentedInputReader.h"
Siarhei Vishniakou979f2d82023-05-16 14:26:24 -070032#include "InterfaceMocks.h"
Harry Cuttse6512e12022-11-28 18:44:01 +000033#include "TestConstants.h"
34#include "TestInputListener.h"
35
36namespace android {
37
Siarhei Vishniakou979f2d82023-05-16 14:26:24 -070038class InputMapperUnitTest : public testing::Test {
39protected:
40 static constexpr int32_t EVENTHUB_ID = 1;
41 static constexpr int32_t DEVICE_ID = END_RESERVED_ID + 1000;
Siarhei Vishniakou5197ce62023-09-19 08:27:05 -070042 static constexpr float INITIAL_CURSOR_X = 400;
43 static constexpr float INITIAL_CURSOR_Y = 240;
Siarhei Vishniakou979f2d82023-05-16 14:26:24 -070044 virtual void SetUp() override;
45
46 void setupAxis(int axis, bool valid, int32_t min, int32_t max, int32_t resolution);
47
48 void expectScanCodes(bool present, std::set<int> scanCodes);
49
50 void setScanCodeState(KeyState state, std::set<int> scanCodes);
51
52 void setKeyCodeState(KeyState state, std::set<int> keyCodes);
53
54 std::list<NotifyArgs> process(int32_t type, int32_t code, int32_t value);
55
56 MockEventHubInterface mMockEventHub;
57 std::shared_ptr<FakePointerController> mFakePointerController;
58 MockInputReaderContext mMockInputReaderContext;
59 std::unique_ptr<InputDevice> mDevice;
60
61 std::unique_ptr<InputDeviceContext> mDeviceContext;
62 InputReaderConfiguration mReaderConfiguration;
63 // The mapper should be created by the subclasses.
64 std::unique_ptr<InputMapper> mMapper;
65};
66
67/**
68 * Deprecated - use InputMapperUnitTest instead.
69 */
Harry Cuttse6512e12022-11-28 18:44:01 +000070class InputMapperTest : public testing::Test {
71protected:
72 static const char* DEVICE_NAME;
73 static const char* DEVICE_LOCATION;
74 static constexpr int32_t DEVICE_ID = END_RESERVED_ID + 1000;
75 static constexpr int32_t DEVICE_GENERATION = 2;
76 static constexpr int32_t DEVICE_CONTROLLER_NUMBER = 0;
77 static const ftl::Flags<InputDeviceClass> DEVICE_CLASSES;
78 static constexpr int32_t EVENTHUB_ID = 1;
79
80 std::shared_ptr<FakeEventHub> mFakeEventHub;
81 sp<FakeInputReaderPolicy> mFakePolicy;
82 std::unique_ptr<TestInputListener> mFakeListener;
83 std::unique_ptr<InstrumentedInputReader> mReader;
84 std::shared_ptr<InputDevice> mDevice;
85
86 virtual void SetUp(ftl::Flags<InputDeviceClass> classes, int bus = 0);
87 void SetUp() override;
88 void TearDown() override;
89
90 void addConfigurationProperty(const char* key, const char* value);
Prabir Pradhan4bf6d452023-04-18 21:26:56 +000091 std::list<NotifyArgs> configureDevice(ConfigurationChanges changes);
Harry Cuttse6512e12022-11-28 18:44:01 +000092 std::shared_ptr<InputDevice> newDevice(int32_t deviceId, const std::string& name,
93 const std::string& location, int32_t eventHubId,
94 ftl::Flags<InputDeviceClass> classes, int bus = 0);
95 template <class T, typename... Args>
96 T& addMapperAndConfigure(Args... args) {
Arpit Singh8e6fb252023-04-06 11:49:17 +000097 T& mapper =
98 mDevice->addMapper<T>(EVENTHUB_ID, mFakePolicy->getReaderConfiguration(), args...);
Prabir Pradhan4bf6d452023-04-18 21:26:56 +000099 configureDevice(/*changes=*/{});
Harry Cuttse6512e12022-11-28 18:44:01 +0000100 std::list<NotifyArgs> resetArgList = mDevice->reset(ARBITRARY_TIME);
101 resetArgList += mapper.reset(ARBITRARY_TIME);
102 // Loop the reader to flush the input listener queue.
103 for (const NotifyArgs& loopArgs : resetArgList) {
104 mFakeListener->notify(loopArgs);
105 }
106 mReader->loopOnce();
107 return mapper;
108 }
109
Arpit Singh56adebc2023-04-25 13:56:05 +0000110 template <class T, typename... Args>
111 T& constructAndAddMapper(Args... args) {
112 // ensure a device entry exists for this eventHubId
113 mDevice->addEmptyEventHubDevice(EVENTHUB_ID);
114 // configure the empty device
115 configureDevice(/*changes=*/{});
116
117 return mDevice->constructAndAddMapper<T>(EVENTHUB_ID, mFakePolicy->getReaderConfiguration(),
118 args...);
119 }
120
Harry Cuttse6512e12022-11-28 18:44:01 +0000121 void setDisplayInfoAndReconfigure(int32_t displayId, int32_t width, int32_t height,
122 ui::Rotation orientation, const std::string& uniqueId,
123 std::optional<uint8_t> physicalPort,
124 ViewportType viewportType);
125 void clearViewports();
126 std::list<NotifyArgs> process(InputMapper& mapper, nsecs_t when, nsecs_t readTime, int32_t type,
127 int32_t code, int32_t value);
128 void resetMapper(InputMapper& mapper, nsecs_t when);
129
130 std::list<NotifyArgs> handleTimeout(InputMapper& mapper, nsecs_t when);
131
132 static void assertMotionRange(const InputDeviceInfo& info, int32_t axis, uint32_t source,
133 float min, float max, float flat, float fuzz);
134 static void assertPointerCoords(const PointerCoords& coords, float x, float y, float pressure,
135 float size, float touchMajor, float touchMinor, float toolMajor,
136 float toolMinor, float orientation, float distance,
137 float scaledAxisEpsilon = 1.f);
Harry Cuttse6512e12022-11-28 18:44:01 +0000138};
139
140} // namespace android