1 /*
2  * Copyright (C) 2019 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 #include "EventHub.h"
18 
19 #include "UinputDevice.h"
20 
21 #include <gtest/gtest.h>
22 #include <inttypes.h>
23 #include <linux/uinput.h>
24 #include <log/log.h>
25 #include <chrono>
26 
27 #define TAG "EventHub_test"
28 
29 using android::createUinputDevice;
30 using android::EventHub;
31 using android::EventHubInterface;
32 using android::InputDeviceIdentifier;
33 using android::RawEvent;
34 using android::sp;
35 using android::UinputHomeKey;
36 using std::chrono_literals::operator""ms;
37 using std::chrono_literals::operator""s;
38 
39 static constexpr bool DEBUG = false;
40 
dumpEvents(const std::vector<RawEvent> & events)41 static void dumpEvents(const std::vector<RawEvent>& events) {
42     for (const RawEvent& event : events) {
43         if (event.type >= EventHubInterface::FIRST_SYNTHETIC_EVENT) {
44             switch (event.type) {
45                 case EventHubInterface::DEVICE_ADDED:
46                     ALOGI("Device added: %i", event.deviceId);
47                     break;
48                 case EventHubInterface::DEVICE_REMOVED:
49                     ALOGI("Device removed: %i", event.deviceId);
50                     break;
51                 case EventHubInterface::FINISHED_DEVICE_SCAN:
52                     ALOGI("Finished device scan.");
53                     break;
54             }
55         } else {
56             ALOGI("Device %" PRId32 " : time = %" PRId64 ", type %i, code %i, value %i",
57                   event.deviceId, event.when, event.type, event.code, event.value);
58         }
59     }
60 }
61 
62 // --- EventHubTest ---
63 class EventHubTest : public testing::Test {
64 protected:
65     std::unique_ptr<EventHubInterface> mEventHub;
66     // We are only going to emulate a single input device currently.
67     std::unique_ptr<UinputHomeKey> mKeyboard;
68     int32_t mDeviceId;
69 
SetUp()70     virtual void SetUp() override {
71         mEventHub = std::make_unique<EventHub>();
72         consumeInitialDeviceAddedEvents();
73         mKeyboard = createUinputDevice<UinputHomeKey>();
74         ASSERT_NO_FATAL_FAILURE(mDeviceId = waitForDeviceCreation());
75     }
TearDown()76     virtual void TearDown() override {
77         mKeyboard.reset();
78         waitForDeviceClose(mDeviceId);
79         assertNoMoreEvents();
80     }
81 
82     /**
83      * Return the device id of the created device.
84      */
85     int32_t waitForDeviceCreation();
86     void waitForDeviceClose(int32_t deviceId);
87     void consumeInitialDeviceAddedEvents();
88     void assertNoMoreEvents();
89     /**
90      * Read events from the EventHub.
91      *
92      * If expectedEvents is set, wait for a significant period of time to try and ensure that
93      * the expected number of events has been read. The number of returned events
94      * may be smaller (if timeout has been reached) or larger than expectedEvents.
95      *
96      * If expectedEvents is not set, return all of the immediately available events.
97      */
98     std::vector<RawEvent> getEvents(std::optional<size_t> expectedEvents = std::nullopt);
99 };
100 
getEvents(std::optional<size_t> expectedEvents)101 std::vector<RawEvent> EventHubTest::getEvents(std::optional<size_t> expectedEvents) {
102     static constexpr size_t EVENT_BUFFER_SIZE = 256;
103     std::array<RawEvent, EVENT_BUFFER_SIZE> eventBuffer;
104     std::vector<RawEvent> events;
105 
106     while (true) {
107         std::chrono::milliseconds timeout = 0s;
108         if (expectedEvents) {
109             timeout = 2s;
110         }
111         const size_t count =
112                 mEventHub->getEvents(timeout.count(), eventBuffer.data(), eventBuffer.size());
113         if (count == 0) {
114             break;
115         }
116         events.insert(events.end(), eventBuffer.begin(), eventBuffer.begin() + count);
117         if (expectedEvents && events.size() >= *expectedEvents) {
118             break;
119         }
120     }
121     if (DEBUG) {
122         dumpEvents(events);
123     }
124     return events;
125 }
126 
127 /**
128  * Since the test runs on a real platform, there will be existing devices
129  * in addition to the test devices being added. Therefore, when EventHub is first created,
130  * it will return a lot of "device added" type of events.
131  */
consumeInitialDeviceAddedEvents()132 void EventHubTest::consumeInitialDeviceAddedEvents() {
133     std::vector<RawEvent> events = getEvents();
134     std::set<int32_t /*deviceId*/> existingDevices;
135     // All of the events should be DEVICE_ADDED type, except the last one.
136     for (size_t i = 0; i < events.size() - 1; i++) {
137         const RawEvent& event = events[i];
138         EXPECT_EQ(EventHubInterface::DEVICE_ADDED, event.type);
139         existingDevices.insert(event.deviceId);
140     }
141     // None of the existing system devices should be changing while this test is run.
142     // Check that the returned device ids are unique for all of the existing devices.
143     EXPECT_EQ(existingDevices.size(), events.size() - 1);
144     // The last event should be "finished device scan"
145     EXPECT_EQ(EventHubInterface::FINISHED_DEVICE_SCAN, events[events.size() - 1].type);
146 }
147 
waitForDeviceCreation()148 int32_t EventHubTest::waitForDeviceCreation() {
149     // Wait a little longer than usual, to ensure input device has time to be created
150     std::vector<RawEvent> events = getEvents(2);
151     if (events.size() != 2) {
152         ADD_FAILURE() << "Instead of 2 events, received " << events.size();
153         return 0; // this value is unused
154     }
155     const RawEvent& deviceAddedEvent = events[0];
156     EXPECT_EQ(static_cast<int32_t>(EventHubInterface::DEVICE_ADDED), deviceAddedEvent.type);
157     InputDeviceIdentifier identifier = mEventHub->getDeviceIdentifier(deviceAddedEvent.deviceId);
158     const int32_t deviceId = deviceAddedEvent.deviceId;
159     EXPECT_EQ(identifier.name, mKeyboard->getName());
160     const RawEvent& finishedDeviceScanEvent = events[1];
161     EXPECT_EQ(static_cast<int32_t>(EventHubInterface::FINISHED_DEVICE_SCAN),
162               finishedDeviceScanEvent.type);
163     return deviceId;
164 }
165 
waitForDeviceClose(int32_t deviceId)166 void EventHubTest::waitForDeviceClose(int32_t deviceId) {
167     std::vector<RawEvent> events = getEvents(2);
168     ASSERT_EQ(2U, events.size());
169     const RawEvent& deviceRemovedEvent = events[0];
170     EXPECT_EQ(static_cast<int32_t>(EventHubInterface::DEVICE_REMOVED), deviceRemovedEvent.type);
171     EXPECT_EQ(deviceId, deviceRemovedEvent.deviceId);
172     const RawEvent& finishedDeviceScanEvent = events[1];
173     EXPECT_EQ(static_cast<int32_t>(EventHubInterface::FINISHED_DEVICE_SCAN),
174               finishedDeviceScanEvent.type);
175 }
176 
assertNoMoreEvents()177 void EventHubTest::assertNoMoreEvents() {
178     std::vector<RawEvent> events = getEvents();
179     ASSERT_TRUE(events.empty());
180 }
181 
182 /**
183  * Ensure that input_events are generated with monotonic clock.
184  * That means input_event should receive a timestamp that is in the future of the time
185  * before the event was sent.
186  * Input system uses CLOCK_MONOTONIC everywhere in the code base.
187  */
TEST_F(EventHubTest,InputEvent_TimestampIsMonotonic)188 TEST_F(EventHubTest, InputEvent_TimestampIsMonotonic) {
189     nsecs_t lastEventTime = systemTime(SYSTEM_TIME_MONOTONIC);
190     ASSERT_NO_FATAL_FAILURE(mKeyboard->pressAndReleaseHomeKey());
191 
192     std::vector<RawEvent> events = getEvents(4);
193     ASSERT_EQ(4U, events.size()) << "Expected to receive 2 keys and 2 syncs, total of 4 events";
194     for (const RawEvent& event : events) {
195         // Cannot use strict comparison because the events may happen too quickly
196         ASSERT_LE(lastEventTime, event.when) << "Event must have occurred after the key was sent";
197         ASSERT_LT(std::chrono::nanoseconds(event.when - lastEventTime), 100ms)
198                 << "Event times are too far apart";
199         lastEventTime = event.when; // Ensure all returned events are monotonic
200     }
201 }
202