InputDispatcher_test.cpp revision 199d1c131d29b5356f71fbd7826a592c1dd8575f
1199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong/*
2199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * Copyright (C) 2010 The Android Open Source Project
3199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong *
4199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
5199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * you may not use this file except in compliance with the License.
6199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * You may obtain a copy of the License at
7199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong *
8199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
9199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong *
10199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * Unless required by applicable law or agreed to in writing, software
11199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
12199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * See the License for the specific language governing permissions and
14199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong * limitations under the License.
15199d1c131d29b5356f71fbd7826a592c1dd8575fJames Dong */
1646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
17b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown#include "../InputDispatcher.h"
18b4ff35df5c04aec71fce7e90a6d6f9ef7180c2adJeff Brown
1946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <gtest/gtest.h>
20c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown#include <linux/input.h>
2146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
2246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
2346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
24c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary time value.
25c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const nsecs_t ARBITRARY_TIME = 1234;
26c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
27c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary device id.
28c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t DEVICE_ID = 1;
29c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
30c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary injector pid / uid pair that has permission to inject events.
31c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t INJECTOR_PID = 999;
32c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t INJECTOR_UID = 1001;
33c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
34c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
35c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputDispatcherPolicy ---
36c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
37c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputDispatcherPolicy : public InputDispatcherPolicyInterface {
38c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
39c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual ~FakeInputDispatcherPolicy() {
40c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
41c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
43c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputDispatcherPolicy() {
44c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
45c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
46c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate:
47c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void notifyConfigurationChanged(nsecs_t when) {
48c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
49c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
50c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,
51928e054931d357326613c78e62f4d850b7c442ffJeff Brown            const sp<InputWindowHandle>& inputWindowHandle) {
52c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 0;
53c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
54c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
55928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) {
56c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
57c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
58c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual nsecs_t getKeyRepeatTimeout() {
59c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 500 * 1000000LL;
60c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
61c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
62c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual nsecs_t getKeyRepeatDelay() {
63c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 50 * 1000000LL;
64c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
65c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
66c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getMaxEventsPerSecond() {
67c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 60;
68c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
69c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
701f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) {
71c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
72c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
7356194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) {
74c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
75c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
76928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual bool interceptKeyBeforeDispatching(const sp<InputWindowHandle>& inputWindowHandle,
77c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags) {
78c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return false;
79c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
80c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
81928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle,
8249ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) {
833915bb845b032dc184dba5e60970b803390ca3edJeff Brown        return false;
843915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
853915bb845b032dc184dba5e60970b803390ca3edJeff Brown
86c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void notifySwitch(nsecs_t when,
87c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t switchCode, int32_t switchValue, uint32_t policyFlags) {
88c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
89c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
90c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) {
91c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
92c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
93c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual bool checkInjectEventsPermissionNonReentrant(
94c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t injectorPid, int32_t injectorUid) {
95c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return false;
96c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
9746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
9846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
99c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputDispatcherTest ---
101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputDispatcherTest : public testing::Test {
103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeInputDispatcherPolicy> mFakePolicy;
105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<InputDispatcher> mDispatcher;
106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void SetUp() {
108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy = new FakeInputDispatcherPolicy();
109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDispatcher = new InputDispatcher(mFakePolicy);
110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void TearDown() {
113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy.clear();
114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDispatcher.clear();
115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) {
120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    KeyEvent event;
121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects undefined key actions.
123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*action*/ -1, 0,
125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject key events with undefined action.";
129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API.
131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEY_EVENT_ACTION_MULTIPLE, 0,
133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject key events with ACTION_MULTIPLE.";
137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    MotionEvent event;
141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t pointerIds[MAX_POINTERS + 1];
142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    PointerCoords pointerCoords[MAX_POINTERS + 1];
143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    for (int i = 0; i <= MAX_POINTERS; i++) {
144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        pointerIds[i] = i;
145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects undefined motion actions.
148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0,
150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with undefined action.";
155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects pointer down with invalid index.
157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0,
160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer down index too large.";
165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0,
169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer down index too small.";
174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects pointer up with invalid index.
176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0,
179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer up index too large.";
184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0,
188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer up index too small.";
193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with invalid number of pointers.
195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 0, pointerIds, pointerCoords);
199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with 0 pointers.";
202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ MAX_POINTERS + 1, pointerIds, pointerCoords);
207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with more than MAX_POINTERS pointers.";
210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with invalid pointer ids.
212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    pointerIds[0] = -1;
213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer ids less than 0.";
220c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    pointerIds[0] = MAX_POINTER_ID + 1;
222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
227c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer ids greater than MAX_POINTER_ID.";
229c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with duplicate pointer ids.
231c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    pointerIds[0] = 1;
232c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    pointerIds[1] = 1;
233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 2, pointerIds, pointerCoords);
237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
238c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with duplicate pointer ids.";
24046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
24146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
24246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
243