173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn/*
273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * Copyright (C) 2015 The Android Open Source Project
373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn *
473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * Licensed under the Apache License, Version 2.0 (the "License");
573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * you may not use this file except in compliance with the License.
673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * You may obtain a copy of the License at
773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn *
873475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn *      http://www.apache.org/licenses/LICENSE-2.0
973475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn *
1073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * Unless required by applicable law or agreed to in writing, software
1173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * distributed under the License is distributed on an "AS IS" BASIS,
1273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * See the License for the specific language governing permissions and
1473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn * limitations under the License.
1573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn */
1673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
17dbc8c16841483f665feeb9df362551b8e9e65263Tim Kilbourn#include "InputDevice.h"
1873475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
193186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#include <memory>
203186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
2173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn#include <linux/input.h>
2273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
2373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn#include <gtest/gtest.h>
2473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
2573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn#include <utils/Timers.h>
2673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
2773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn#include "InputHub.h"
283186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn#include "InputMocks.h"
294f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn#include "MockInputHost.h"
3073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
3173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn// # of milliseconds to allow for timing measurements
3273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn#define TIMING_TOLERANCE_MS 25
3373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
3473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn#define MSC_ANDROID_TIME_SEC  0x6
3573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn#define MSC_ANDROID_TIME_USEC 0x7
3673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
374f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbournusing ::testing::_;
384f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbournusing ::testing::NiceMock;
394f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbournusing ::testing::Return;
404f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbournusing ::testing::ReturnNull;
414f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn
4273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbournnamespace android {
4373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbournnamespace tests {
4473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
453186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbournclass EvdevDeviceTest : public ::testing::Test {
463186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbournprotected:
474f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    virtual void SetUp() {
484f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn        // Creating device identifiers and definitions should always happen.
494f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn        EXPECT_CALL(mHost, createDeviceIdentifier(_, _, _, _, _))
504f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn            .WillOnce(ReturnNull());
514f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn        EXPECT_CALL(mHost, createDeviceDefinition())
524f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn            .WillOnce(Return(&mDeviceDef));
534f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn        // InputMappers may cause any of these to be called, but we are not
544f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn        // testing these here.
554f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn        ON_CALL(mHost, createInputReportDefinition())
564f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn            .WillByDefault(Return(&mReportDef));
574f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn        ON_CALL(mHost, createOutputReportDefinition())
584f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn            .WillByDefault(Return(&mReportDef));
594f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn        ON_CALL(mHost, registerDevice(_, _))
604f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn            .WillByDefault(ReturnNull());
614f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    }
624f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn
634f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    MockInputHost mHost;
644f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    // Ignore uninteresting calls on the report definitions by using NiceMocks.
654f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    NiceMock<MockInputReportDefinition> mReportDef;
664f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    NiceMock<MockInputDeviceDefinition> mDeviceDef;
6773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn};
6873475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
693186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testOverrideTime) {
7073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    auto node = std::make_shared<MockInputDeviceNode>();
714f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
7273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    ASSERT_TRUE(device != nullptr);
7373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
7473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    // Send two timestamp override events before an input event.
7573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    nsecs_t when = 2ULL;
7673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    InputEvent msc1 = { when, EV_MSC, MSC_ANDROID_TIME_SEC, 1 };
7773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    InputEvent msc2 = { when, EV_MSC, MSC_ANDROID_TIME_USEC, 900000 };
7873475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
7973475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    // Send a key down and syn. Should get the overridden timestamp.
8073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    InputEvent keyDown = { when, EV_KEY, KEY_HOME, 1 };
8173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    InputEvent syn = { when, EV_SYN, SYN_REPORT, 0 };
8273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
8373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    // Send a key up, which should be at the reported timestamp.
8473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    InputEvent keyUp = { when, EV_KEY, KEY_HOME, 0 };
8573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
8673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    device->processInput(msc1, when);
8773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    device->processInput(msc2, when);
8873475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    device->processInput(keyDown, when);
8973475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    device->processInput(syn, when);
9073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    device->processInput(keyUp, when);
9173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
9273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    nsecs_t expectedWhen = s2ns(1) + us2ns(900000);
9373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    EXPECT_EQ(expectedWhen, keyDown.when);
9473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    EXPECT_EQ(expectedWhen, syn.when);
9573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    EXPECT_EQ(when, keyUp.when);
9673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn}
9773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
983186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testWrongClockCorrection) {
9973475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    auto node = std::make_shared<MockInputDeviceNode>();
1004f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
10173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    ASSERT_TRUE(device != nullptr);
10273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
10373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    auto now = systemTime(SYSTEM_TIME_MONOTONIC);
10473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
10573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    // Input event that supposedly comes from 1 minute in the future. In
10673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    // reality, the timestamps would be much further off.
10773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    InputEvent event = { now + s2ns(60), EV_KEY, KEY_HOME, 1 };
10873475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
10973475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    device->processInput(event, now);
11073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
11173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    EXPECT_NEAR(now, event.when, ms2ns(TIMING_TOLERANCE_MS));
11273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn}
11373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
1143186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testClockCorrectionOk) {
11573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    auto node = std::make_shared<MockInputDeviceNode>();
1164f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
11773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    ASSERT_TRUE(device != nullptr);
11873475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
11973475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    auto now = systemTime(SYSTEM_TIME_MONOTONIC);
12073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
12173475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    // Input event from now, but will be reported as if it came early.
12273475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    InputEvent event = { now, EV_KEY, KEY_HOME, 1 };
12373475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
12473475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    // event_time parameter is 11 seconds in the past, so it looks like we used
12573475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    // the wrong clock.
12673475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    device->processInput(event, now - s2ns(11));
12773475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
12873475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn    EXPECT_NEAR(now, event.when, ms2ns(TIMING_TOLERANCE_MS));
12973475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn}
13073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn
1313186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testN7v2Touchscreen) {
1323186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexus7v2::getElanTouchscreen());
1334f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1343186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_TOUCH|INPUT_DEVICE_CLASS_TOUCH_MT,
1353186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn            device->getInputClasses());
1363186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1373186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1383186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testN7v2ButtonJack) {
1393186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexus7v2::getButtonJack());
1404f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1413186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_KEYBOARD, device->getInputClasses());
1423186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1433186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1443186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testN7v2HeadsetJack) {
1454f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    // Eventually these mock device tests will all expect these calls. For now
1464f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    // only the SwitchInputMapper has been implemented.
1474f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    // TODO: move this expectation out to a common function
1484f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    EXPECT_CALL(mHost, createInputReportDefinition());
149864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn    EXPECT_CALL(mHost, createOutputReportDefinition());
150864984c3b1680854bdfc4560f548f2dae9467bddTim Kilbourn    EXPECT_CALL(mHost, freeReportDefinition(_));
1514f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    EXPECT_CALL(mHost, registerDevice(_, _));
1524f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn
1533186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexus7v2::getHeadsetJack());
1544f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1553186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_SWITCH, device->getInputClasses());
1563186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1573186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1583186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testN7v2H2wButton) {
1593186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexus7v2::getH2wButton());
1604f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1613186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_KEYBOARD, device->getInputClasses());
1623186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1633186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1643186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testN7v2GpioKeys) {
1653186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexus7v2::getGpioKeys());
1664f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1673186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_KEYBOARD, device->getInputClasses());
1683186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1693186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1703186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testNexusPlayerGpioKeys) {
1713186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexusPlayer::getGpioKeys());
1724f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1733186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_KEYBOARD, device->getInputClasses());
1743186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1753186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1763186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testNexusPlayerMidPowerBtn) {
1773186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexusPlayer::getMidPowerBtn());
1784f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1793186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_KEYBOARD, device->getInputClasses());
1803186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1813186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1823186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testNexusRemote) {
1833186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexusPlayer::getNexusRemote());
1844f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1853186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_KEYBOARD, device->getInputClasses());
1863186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1873186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1883186e7bf4805b317769470137ffcf1f7eb0215e0Tim KilbournTEST_F(EvdevDeviceTest, testAsusGamepad) {
1893186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    auto node = std::shared_ptr<MockInputDeviceNode>(MockNexusPlayer::getAsusGamepad());
1904f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1913186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn    EXPECT_EQ(INPUT_DEVICE_CLASS_JOYSTICK|INPUT_DEVICE_CLASS_KEYBOARD, device->getInputClasses());
1923186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn}
1933186e7bf4805b317769470137ffcf1f7eb0215e0Tim Kilbourn
1944f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim KilbournTEST_F(EvdevDeviceTest, testMocks) {
1954f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto node = std::make_shared<MockInputDeviceNode>();
1964f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn    auto device = std::make_unique<EvdevDevice>(&mHost, node);
1974f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn}
1984f3145d75f5dfc87f07f8ddf6143ba77966f35e4Tim Kilbourn
19973475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn}  // namespace tests
20073475a4eb2cebf06f965c58e015d06c333e71e61Tim Kilbourn}  // namespace android
201