InputDispatcher_test.cpp revision fe9f8ab03a63b1037f07dd85799fbea80ec6adaa
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
700029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) {
710029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        return true;
720029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    }
730029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
741f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) {
75c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
76c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
7756194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) {
78c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
79c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
80928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual bool interceptKeyBeforeDispatching(const sp<InputWindowHandle>& inputWindowHandle,
81c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags) {
82c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return false;
83c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
84c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
85928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle,
8649ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) {
873915bb845b032dc184dba5e60970b803390ca3edJeff Brown        return false;
883915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
893915bb845b032dc184dba5e60970b803390ca3edJeff Brown
90c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void notifySwitch(nsecs_t when,
91c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t switchCode, int32_t switchValue, uint32_t policyFlags) {
92c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
93c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
94c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) {
95c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
96c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
97c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual bool checkInjectEventsPermissionNonReentrant(
98c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t injectorPid, int32_t injectorUid) {
99c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return false;
100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
10146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
10246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputDispatcherTest ---
105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputDispatcherTest : public testing::Test {
107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeInputDispatcherPolicy> mFakePolicy;
109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<InputDispatcher> mDispatcher;
110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void SetUp() {
112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy = new FakeInputDispatcherPolicy();
113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDispatcher = new InputDispatcher(mFakePolicy);
114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void TearDown() {
117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy.clear();
118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDispatcher.clear();
119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) {
124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    KeyEvent event;
125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects undefined key actions.
127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*action*/ -1, 0,
129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1310029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject key events with undefined action.";
133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API.
135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEY_EVENT_ACTION_MULTIPLE, 0,
137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1390029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject key events with ACTION_MULTIPLE.";
141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    MotionEvent event;
145fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    PointerProperties pointerProperties[MAX_POINTERS + 1];
146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    PointerCoords pointerCoords[MAX_POINTERS + 1];
147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    for (int i = 0; i <= MAX_POINTERS; i++) {
148fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        pointerProperties[i].clear();
149fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        pointerProperties[i].id = i;
150fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        pointerCoords[i].clear();
151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects undefined motion actions.
154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
155fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
157fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1590029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with undefined action.";
161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects pointer down with invalid index.
163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
165fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
167fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1690029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer down index too large.";
171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
174fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
176fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1780029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer down index too small.";
180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects pointer up with invalid index.
182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
184fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
186fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1880029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer up index too large.";
190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
193fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
195fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1970029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer up index too small.";
199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with invalid number of pointers.
201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
202fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
204fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 0, pointerProperties, pointerCoords);
205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2060029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with 0 pointers.";
208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
210fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
212fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords);
213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2140029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with more than MAX_POINTERS pointers.";
216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with invalid pointer ids.
218fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    pointerProperties[0].id = -1;
219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
220fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
222fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2240029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer ids less than 0.";
226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
227fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    pointerProperties[0].id = MAX_POINTER_ID + 1;
228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
229fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
231fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
232c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2330029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer ids greater than MAX_POINTER_ID.";
235c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
236c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with duplicate pointer ids.
237fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    pointerProperties[0].id = 1;
238fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    pointerProperties[1].id = 1;
239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
240fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
242fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 2, pointerProperties, pointerCoords);
243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2440029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
245c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with duplicate pointer ids.";
24646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
24746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
24846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
249