15912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown/*
25912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Copyright (C) 2010 The Android Open Source Project
35912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
45912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Licensed under the Apache License, Version 2.0 (the "License");
55912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * you may not use this file except in compliance with the License.
65912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * You may obtain a copy of the License at
75912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
85912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *      http://www.apache.org/licenses/LICENSE-2.0
95912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown *
105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * Unless required by applicable law or agreed to in writing, software
115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * distributed under the License is distributed on an "AS IS" BASIS,
125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * See the License for the specific language governing permissions and
145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown * limitations under the License.
155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown */
165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include "TestHelpers.h"
185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <unistd.h>
205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <sys/mman.h>
215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <time.h>
225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <cutils/ashmem.h>
245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <gtest/gtest.h>
255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <input/InputTransport.h>
265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/Timers.h>
275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown#include <utils/StopWatch.h>
285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownnamespace android {
305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownclass InputPublisherAndConsumerTest : public testing::Test {
325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownprotected:
335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    sp<InputChannel> serverChannel, clientChannel;
345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputPublisher* mPublisher;
355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputConsumer* mConsumer;
365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PreallocatedInputEventFactory mEventFactory;
375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual void SetUp() {
395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        status_t result = InputChannel::openInputChannelPair(String8("channel name"),
405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                serverChannel, clientChannel);
415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mPublisher = new InputPublisher(serverChannel);
435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        mConsumer = new InputConsumer(clientChannel);
445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    virtual void TearDown() {
475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        if (mPublisher) {
485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            delete mPublisher;
495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            mPublisher = NULL;
505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        if (mConsumer) {
535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            delete mConsumer;
545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            mConsumer = NULL;
555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        }
565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        serverChannel.clear();
585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        clientChannel.clear();
595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void PublishAndConsumeKeyEvent();
625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    void PublishAndConsumeMotionEvent();
635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown};
645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputPublisherAndConsumerTest, GetChannel_ReturnsTheChannel) {
665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(serverChannel.get(), mPublisher->getChannel().get());
675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(clientChannel.get(), mConsumer->getChannel().get());
685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid InputPublisherAndConsumerTest::PublishAndConsumeKeyEvent() {
715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t status;
725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const uint32_t seq = 15;
745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t deviceId = 1;
755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t source = AINPUT_SOURCE_KEYBOARD;
765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t action = AKEY_EVENT_ACTION_DOWN;
775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t flags = AKEY_EVENT_FLAG_FROM_SYSTEM;
785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t keyCode = AKEYCODE_ENTER;
795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t scanCode = 13;
805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t metaState = AMETA_ALT_LEFT_ON | AMETA_ALT_ON;
815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t repeatCount = 1;
825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const nsecs_t downTime = 3;
835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const nsecs_t eventTime = 4;
845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mPublisher->publishKeyEvent(seq, deviceId, source, action, flags,
865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            keyCode, scanCode, metaState, repeatCount, downTime, eventTime);
875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, status)
885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher publishKeyEvent should return OK";
895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t consumeSeq;
915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputEvent* event;
925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mConsumer->consume(&mEventFactory, true /*consumeBatches*/, -1, &consumeSeq, &event);
935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, status)
945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "consumer consume should return OK";
955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_TRUE(event != NULL)
975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "consumer should have returned non-NULL event";
985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AINPUT_EVENT_TYPE_KEY, event->getType())
995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "consumer should have returned a key event";
1005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    KeyEvent* keyEvent = static_cast<KeyEvent*>(event);
1025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(seq, consumeSeq);
1035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(deviceId, keyEvent->getDeviceId());
1045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(source, keyEvent->getSource());
1055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(action, keyEvent->getAction());
1065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(flags, keyEvent->getFlags());
1075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(keyCode, keyEvent->getKeyCode());
1085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(scanCode, keyEvent->getScanCode());
1095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(metaState, keyEvent->getMetaState());
1105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(repeatCount, keyEvent->getRepeatCount());
1115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(downTime, keyEvent->getDownTime());
1125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(eventTime, keyEvent->getEventTime());
1135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mConsumer->sendFinishedSignal(seq, true);
1155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, status)
1165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "consumer sendFinishedSignal should return OK";
1175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t finishedSeq = 0;
1195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool handled = false;
1205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mPublisher->receiveFinishedSignal(&finishedSeq, &handled);
1215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, status)
1225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher receiveFinishedSignal should return OK";
1235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(seq, finishedSeq)
1245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher receiveFinishedSignal should have returned the original sequence number";
1255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_TRUE(handled)
1265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher receiveFinishedSignal should have set handled to consumer's reply";
1275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
1285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brownvoid InputPublisherAndConsumerTest::PublishAndConsumeMotionEvent() {
1305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t status;
1315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const uint32_t seq = 15;
1335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t deviceId = 1;
1345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t source = AINPUT_SOURCE_TOUCHSCREEN;
1355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t action = AMOTION_EVENT_ACTION_MOVE;
1365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t flags = AMOTION_EVENT_FLAG_WINDOW_IS_OBSCURED;
1375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t edgeFlags = AMOTION_EVENT_EDGE_FLAG_TOP;
1385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t metaState = AMETA_ALT_LEFT_ON | AMETA_ALT_ON;
1395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const int32_t buttonState = AMOTION_EVENT_BUTTON_PRIMARY;
1405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float xOffset = -10;
1415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float yOffset = -20;
1425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float xPrecision = 0.25;
1435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const float yPrecision = 0.5;
1445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const nsecs_t downTime = 3;
1455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const size_t pointerCount = 3;
1465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const nsecs_t eventTime = 4;
1475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerProperties pointerProperties[pointerCount];
1485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords pointerCoords[pointerCount];
1495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
1505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerProperties[i].clear();
1515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerProperties[i].id = (i + 2) % pointerCount;
1525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerProperties[i].toolType = AMOTION_EVENT_TOOL_TYPE_FINGER;
1535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].clear();
1555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_X, 100 * i);
1565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_Y, 200 * i);
1575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_PRESSURE, 0.5 * i);
1585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_SIZE, 0.7 * i);
1595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR, 1.5 * i);
1605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR, 1.7 * i);
1615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 2.5 * i);
1625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR, 2.7 * i);
1635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].setAxisValue(AMOTION_EVENT_AXIS_ORIENTATION, 3.5 * i);
1645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
1655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mPublisher->publishMotionEvent(seq, deviceId, source, action, flags, edgeFlags,
1675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            metaState, buttonState, xOffset, yOffset, xPrecision, yPrecision,
1685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            downTime, eventTime, pointerCount,
1695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            pointerProperties, pointerCoords);
1705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, status)
1715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher publishMotionEvent should return OK";
1725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t consumeSeq;
1745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    InputEvent* event;
1755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mConsumer->consume(&mEventFactory, true /*consumeBatches*/, -1, &consumeSeq, &event);
1765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, status)
1775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "consumer consume should return OK";
1785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_TRUE(event != NULL)
1805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "consumer should have returned non-NULL event";
1815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(AINPUT_EVENT_TYPE_MOTION, event->getType())
1825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "consumer should have returned a motion event";
1835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
1845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    MotionEvent* motionEvent = static_cast<MotionEvent*>(event);
1855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(seq, consumeSeq);
1865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(deviceId, motionEvent->getDeviceId());
1875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(source, motionEvent->getSource());
1885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(action, motionEvent->getAction());
1895912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(flags, motionEvent->getFlags());
1905912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(edgeFlags, motionEvent->getEdgeFlags());
1915912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(metaState, motionEvent->getMetaState());
1925912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(buttonState, motionEvent->getButtonState());
1935912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(xPrecision, motionEvent->getXPrecision());
1945912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(yPrecision, motionEvent->getYPrecision());
1955912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(downTime, motionEvent->getDownTime());
1965912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(eventTime, motionEvent->getEventTime());
1975912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(pointerCount, motionEvent->getPointerCount());
1985912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    EXPECT_EQ(0U, motionEvent->getHistorySize());
1995912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2005912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
2015912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        SCOPED_TRACE(i);
2025912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerProperties[i].id, motionEvent->getPointerId(i));
2035912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerProperties[i].toolType, motionEvent->getToolType(i));
2045912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2055912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X),
2065912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getRawX(i));
2075912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y),
2085912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getRawY(i));
2095912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_X) + xOffset,
2105912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getX(i));
2115912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_Y) + yOffset,
2125912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getY(i));
2135912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_PRESSURE),
2145912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getPressure(i));
2155912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_SIZE),
2165912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getSize(i));
2175912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MAJOR),
2185912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getTouchMajor(i));
2195912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOUCH_MINOR),
2205912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getTouchMinor(i));
2215912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MAJOR),
2225912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getToolMajor(i));
2235912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_TOOL_MINOR),
2245912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getToolMinor(i));
2255912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        EXPECT_EQ(pointerCoords[i].getAxisValue(AMOTION_EVENT_AXIS_ORIENTATION),
2265912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown                motionEvent->getOrientation(i));
2275912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2285912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2295912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mConsumer->sendFinishedSignal(seq, false);
2305912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, status)
2315912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "consumer sendFinishedSignal should return OK";
2325912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2335912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    uint32_t finishedSeq = 0;
2345912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    bool handled = true;
2355912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mPublisher->receiveFinishedSignal(&finishedSeq, &handled);
2365912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(OK, status)
2375912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher receiveFinishedSignal should return OK";
2385912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(seq, finishedSeq)
2395912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher receiveFinishedSignal should have returned the original sequence number";
2405912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_FALSE(handled)
2415912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher receiveFinishedSignal should have set handled to consumer's reply";
2425912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2435912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2445912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputPublisherAndConsumerTest, PublishKeyEvent_EndToEnd) {
2455912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(PublishAndConsumeKeyEvent());
2465912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2475912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2485912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputPublisherAndConsumerTest, PublishMotionEvent_EndToEnd) {
2495912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(PublishAndConsumeMotionEvent());
2505912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2515912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2525912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputPublisherAndConsumerTest, PublishMotionEvent_WhenPointerCountLessThan1_ReturnsError) {
2535912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t status;
2545912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const size_t pointerCount = 0;
2555912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerProperties pointerProperties[pointerCount];
2565912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords pointerCoords[pointerCount];
2575912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2585912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mPublisher->publishMotionEvent(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2595912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            pointerCount, pointerProperties, pointerCoords);
2605912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(BAD_VALUE, status)
2615912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher publishMotionEvent should return BAD_VALUE";
2625912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2635912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2645912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputPublisherAndConsumerTest, PublishMotionEvent_WhenPointerCountGreaterThanMax_ReturnsError) {
2655912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status_t status;
2665912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    const size_t pointerCount = MAX_POINTERS + 1;
2675912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerProperties pointerProperties[pointerCount];
2685912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    PointerCoords pointerCoords[pointerCount];
2695912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    for (size_t i = 0; i < pointerCount; i++) {
2705912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerProperties[i].clear();
2715912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown        pointerCoords[i].clear();
2725912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    }
2735912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2745912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    status = mPublisher->publishMotionEvent(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2755912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            pointerCount, pointerProperties, pointerCoords);
2765912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_EQ(BAD_VALUE, status)
2775912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown            << "publisher publishMotionEvent should return BAD_VALUE";
2785912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2795912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2805912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff BrownTEST_F(InputPublisherAndConsumerTest, PublishMultipleEvents_EndToEnd) {
2815912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(PublishAndConsumeMotionEvent());
2825912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(PublishAndConsumeKeyEvent());
2835912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(PublishAndConsumeMotionEvent());
2845912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(PublishAndConsumeMotionEvent());
2855912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown    ASSERT_NO_FATAL_FAILURE(PublishAndConsumeKeyEvent());
2865912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown}
2875912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown
2885912f95d26f77d2b6df13e1f2672e48e3f9b871cJeff Brown} // namespace android
289