InputDispatcher_test.cpp revision d02c5b6aace05d9fd938e2d03705ac4f60f8da19
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
30d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// An arbitrary injector pid / uid pair that has permission to inject events.
31d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t INJECTOR_PID = 999;
32d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightstatic const int32_t INJECTOR_UID = 1001;
33d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
34d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
35d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- FakeInputDispatcherPolicy ---
36d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
37d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass FakeInputDispatcherPolicy : public InputDispatcherPolicyInterface {
38d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    InputDispatcherConfiguration mConfig;
39d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
40d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected:
41d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual ~FakeInputDispatcherPolicy() {
42d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
43d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
44d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightpublic:
45d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    FakeInputDispatcherPolicy() {
46d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
47d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
48d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprivate:
49d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void notifyConfigurationChanged(nsecs_t when) {
50d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
51d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
52d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,
53d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            const sp<InputWindowHandle>& inputWindowHandle,
54d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            const String8& reason) {
55d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return 0;
56d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
57d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
58d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) {
59d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
60d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
61d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) {
62d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        *outConfig = mConfig;
63d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
64d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
65d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual bool isKeyRepeatEnabled() {
66d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return true;
67d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
68d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
69d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) {
70d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return true;
71d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
72d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
73d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) {
74d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
75d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
76d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) {
77d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
78d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
79d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual nsecs_t interceptKeyBeforeDispatching(const sp<InputWindowHandle>& inputWindowHandle,
80d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            const KeyEvent* keyEvent, uint32_t policyFlags) {
81d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return 0;
82d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
83d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
84d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle,
85d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) {
86d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return false;
87d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
88d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
89d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void notifySwitch(nsecs_t when,
90d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            uint32_t switchValues, uint32_t switchMask, uint32_t policyFlags) {
91d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
92d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
93d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) {
94d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
95d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
96d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual bool checkInjectEventsPermissionNonReentrant(
97d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            int32_t injectorPid, int32_t injectorUid) {
98d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        return false;
99d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
100d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright};
101d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
102d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
103d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright// --- InputDispatcherTest ---
104d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
105d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightclass InputDispatcherTest : public testing::Test {
106d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wrightprotected:
107d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    sp<FakeInputDispatcherPolicy> mFakePolicy;
108d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    sp<InputDispatcher> mDispatcher;
109d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
110d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void SetUp() {
111d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mFakePolicy = new FakeInputDispatcherPolicy();
112d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mDispatcher = new InputDispatcher(mFakePolicy);
113d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
114d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
115d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    virtual void TearDown() {
116d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mFakePolicy.clear();
117d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        mDispatcher.clear();
118d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
119d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright};
120d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
121d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
122d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) {
123d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    KeyEvent event;
124d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
125d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects undefined key actions.
126d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
127d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*action*/ -1, 0,
128d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
129d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
130d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
131d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject key events with undefined action.";
132d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
133d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API.
134d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
135d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AKEY_EVENT_ACTION_MULTIPLE, 0,
136d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
137d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
138d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
139d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject key events with ACTION_MULTIPLE.";
140d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
141d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
142d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael WrightTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
143d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    MotionEvent event;
144d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    PointerProperties pointerProperties[MAX_POINTERS + 1];
145d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    PointerCoords pointerCoords[MAX_POINTERS + 1];
146d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    for (int i = 0; i <= MAX_POINTERS; i++) {
147d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        pointerProperties[i].clear();
148d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        pointerProperties[i].id = i;
149d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright        pointerCoords[i].clear();
150d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    }
151d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
152d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects undefined motion actions.
153d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
154d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
155d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
156d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
157d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
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),
164d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
165d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
166d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
167d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
168d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
169d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer down index too large.";
170d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
171d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
172d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
173d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
174d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
175d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
176d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
177d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
178d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer down index too small.";
179d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
180d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects pointer up with invalid index.
181d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
182d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
183d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
184d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
185d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
186d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
187d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
188d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer up index too large.";
189d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
190d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
191d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
192d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
193d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
194d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
195d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
196d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
197d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer up index too small.";
198d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
199d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects motion events with invalid number of pointers.
200d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
201d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
202d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
203d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 0, pointerProperties, pointerCoords);
204d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
205d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
206d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with 0 pointers.";
207d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
208d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
209d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
210d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
211d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords);
212d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
213d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
214d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with more than MAX_POINTERS pointers.";
215d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
216d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects motion events with invalid pointer ids.
217d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    pointerProperties[0].id = -1;
218d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
219d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
220d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
221d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
222d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
223d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
224d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer ids less than 0.";
225d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
226d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    pointerProperties[0].id = MAX_POINTER_ID + 1;
227d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
228d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
229d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
230d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 1, pointerProperties, pointerCoords);
231d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
232d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
233d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with pointer ids greater than MAX_POINTER_ID.";
234d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
235d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    // Rejects motion events with duplicate pointer ids.
236d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    pointerProperties[0].id = 1;
237d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    pointerProperties[1].id = 1;
238d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
239d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
240d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            ARBITRARY_TIME, ARBITRARY_TIME,
241d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            /*pointerCount*/ 2, pointerProperties, pointerCoords);
242d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
243d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
244d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright            << "Should reject motion events with duplicate pointer ids.";
245d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright}
246d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright
247d02c5b6aace05d9fd938e2d03705ac4f60f8da19Michael Wright} // namespace android
248