InputDispatcher_test.cpp revision 8b10c65312c0cd9a76fe9bdae2917e13d1e120eb
1d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright/*
2d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Copyright (C) 2010 The Android Open Source Project
3d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *
4d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Licensed under the Apache License, Version 2.0 (the "License");
5d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * you may not use this file except in compliance with the License.
6d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * You may obtain a copy of the License at
7d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *
8d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *      http://www.apache.org/licenses/LICENSE-2.0
9d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright *
10d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * Unless required by applicable law or agreed to in writing, software
11d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * distributed under the License is distributed on an "AS IS" BASIS,
12d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * See the License for the specific language governing permissions and
14d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright * limitations under the License.
15d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright */
16d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
17d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include "../InputDispatcher.h"
18d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
19d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <gtest/gtest.h>
20d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright#include <linux/input.h>
21d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
22d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightnamespace android {
23d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
24d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// An arbitrary time value.
25d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const nsecs_t ARBITRARY_TIME = 1234;
26d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
27d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// An arbitrary device id.
28d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t DEVICE_ID = 1;
29d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
30f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown// An arbitrary display id.
31f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brownstatic const int32_t DISPLAY_ID = 0;
32f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown
33d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// An arbitrary injector pid / uid pair that has permission to inject events.
34d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t INJECTOR_PID = 999;
35d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t INJECTOR_UID = 1001;
36d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
37d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
38d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- FakeInputDispatcherPolicy ---
39d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
40d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass FakeInputDispatcherPolicy : public InputDispatcherPolicyInterface {
41d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    InputDispatcherConfiguration mConfig;
42d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
43d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected:
44d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual ~FakeInputDispatcherPolicy() {
45d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
46d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
47d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightpublic:
48d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    FakeInputDispatcherPolicy() {
49d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
50d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
51d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprivate:
5239efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual void notifyConfigurationChanged(nsecs_t) {
53d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
54d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
5539efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual nsecs_t notifyANR(const sp<InputApplicationHandle>&,
5639efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath            const sp<InputWindowHandle>&,
5739efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath            const String8&) {
58d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return 0;
59d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
60d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
6139efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual void notifyInputChannelBroken(const sp<InputWindowHandle>&) {
62d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
63d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
64d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) {
65d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        *outConfig = mConfig;
66d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
67d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
6839efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual bool filterInputEvent(const InputEvent*, uint32_t) {
69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return true;
70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
71d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
7239efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual void interceptKeyBeforeQueueing(const KeyEvent*, uint32_t&) {
73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
7539efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual void interceptMotionBeforeQueueing(nsecs_t, uint32_t&) {
76d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
77d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
7839efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual nsecs_t interceptKeyBeforeDispatching(const sp<InputWindowHandle>&,
7939efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath            const KeyEvent*, uint32_t) {
80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return 0;
81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
8339efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>&,
8439efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath            const KeyEvent*, uint32_t, KeyEvent*) {
85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return false;
86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
8839efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual void notifySwitch(nsecs_t, uint32_t, uint32_t, uint32_t) {
89d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
9139efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual void pokeUserActivity(nsecs_t, int32_t) {
92d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
9439efe3e5bf6282a4851e0eb3b938060c8f7790aeNarayan Kamath    virtual bool checkInjectEventsPermissionNonReentrant(int32_t, int32_t) {
95d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return false;
96d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
97d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright};
98d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
99d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- InputDispatcherTest ---
101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherTest : public testing::Test {
103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected:
104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    sp<FakeInputDispatcherPolicy> mFakePolicy;
105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    sp<InputDispatcher> mDispatcher;
106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void SetUp() {
108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mFakePolicy = new FakeInputDispatcherPolicy();
109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mDispatcher = new InputDispatcher(mFakePolicy);
110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void TearDown() {
113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mFakePolicy.clear();
114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mDispatcher.clear();
115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright};
117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) {
120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    KeyEvent event;
121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects undefined key actions.
123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*action*/ -1, 0,
125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
126f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
127f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
128d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
129d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject key events with undefined action.";
130d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
131d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API.
132d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
133d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AKEY_EVENT_ACTION_MULTIPLE, 0,
134d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
135f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
136f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
137d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
138d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject key events with ACTION_MULTIPLE.";
139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
141d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
142d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    MotionEvent event;
143d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    PointerProperties pointerProperties[MAX_POINTERS + 1];
144d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    PointerCoords pointerCoords[MAX_POINTERS + 1];
145d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    for (int i = 0; i <= MAX_POINTERS; i++) {
146d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        pointerProperties[i].clear();
147d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        pointerProperties[i].id = i;
148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        pointerCoords[i].clear();
149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects undefined motion actions.
152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
1537b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            /*action*/ -1, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
156f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
157f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
158d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
159d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with undefined action.";
160d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
161d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects pointer down with invalid index.
162d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
163d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
1647b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
165d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
166d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
167f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
168f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
169d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
170d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer down index too large.";
171d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
172d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
1738b10c65312c0cd9a76fe9bdae2917e13d1e120ebDan Albert            AMOTION_EVENT_ACTION_POINTER_DOWN | (~0U << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
1747b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
175d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
176d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
177f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
178f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
179d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
180d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer down index too small.";
181d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
182d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects pointer up with invalid index.
183d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
184d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
1857b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
186d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
187d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
188f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
189f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
190d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
191d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer up index too large.";
192d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
193d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
1948b10c65312c0cd9a76fe9bdae2917e13d1e120ebDan Albert            AMOTION_EVENT_ACTION_POINTER_UP | (~0U << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
1957b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
196d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
197d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
198f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
199f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
200d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
201d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer up index too small.";
202d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
203d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects motion events with invalid number of pointers.
204d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
2057b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
206d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
207d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 0, pointerProperties, pointerCoords);
208f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
209f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
210d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
211d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with 0 pointers.";
212d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
213d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
2147b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
215d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
216d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords);
217f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
218f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
219d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
220d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with more than MAX_POINTERS pointers.";
221d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
222d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects motion events with invalid pointer ids.
223d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    pointerProperties[0].id = -1;
224d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
2257b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
226d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
227d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
228f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
229f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
230d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
231d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer ids less than 0.";
232d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
233d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    pointerProperties[0].id = MAX_POINTER_ID + 1;
234d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
2357b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
236d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
237d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
238f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
239f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
240d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
241d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer ids greater than MAX_POINTER_ID.";
242d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
243d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects motion events with duplicate pointer ids.
244d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    pointerProperties[0].id = 1;
245d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    pointerProperties[1].id = 1;
246d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
2477b159c9a4f589da7fdab7c16f3aefea25e0e7e4fMichael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
248d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
249d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 2, pointerProperties, pointerCoords);
250f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(
251f086ddbb97e59bd4a0c27745f6e6cc9832a2d4f8Jeff Brown            &event, DISPLAY_ID,
252d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
253d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with duplicate pointer ids.";
254d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
255d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
256d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android
257