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 {
38214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    InputDispatcherConfiguration mConfig;
39214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown
40c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
41c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual ~FakeInputDispatcherPolicy() {
42c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
43c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
4446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
45c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputDispatcherPolicy() {
46c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
47c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
48c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate:
49c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void notifyConfigurationChanged(nsecs_t when) {
50c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
51c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
52c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,
53928e054931d357326613c78e62f4d850b7c442ffJeff Brown            const sp<InputWindowHandle>& inputWindowHandle) {
54c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 0;
55c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
56c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
57928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual void notifyInputChannelBroken(const sp<InputWindowHandle>& inputWindowHandle) {
58c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
59c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
60214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    virtual void getDispatcherConfiguration(InputDispatcherConfiguration* outConfig) {
61214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        *outConfig = mConfig;
62c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
63c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
64214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown    virtual bool isKeyRepeatEnabled() {
65214eaf48878bba00cbd5831871bcbd82632b6e34Jeff Brown        return true;
66c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
67c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
680029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    virtual bool filterInputEvent(const InputEvent* inputEvent, uint32_t policyFlags) {
690029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown        return true;
700029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown    }
710029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown
721f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) {
73c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
74c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
7556194ebec6212e229f4ccdaa4b187166d20013efJeff Brown    virtual void interceptMotionBeforeQueueing(nsecs_t when, uint32_t& policyFlags) {
76c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
77c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
78905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown    virtual nsecs_t interceptKeyBeforeDispatching(const sp<InputWindowHandle>& inputWindowHandle,
79c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags) {
80905805ad7ce18a386076fff99264f821bbad9f83Jeff Brown        return 0;
81c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
82c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
83928e054931d357326613c78e62f4d850b7c442ffJeff Brown    virtual bool dispatchUnhandledKey(const sp<InputWindowHandle>& inputWindowHandle,
8449ed71db425c5054e3ad9526496a7e116c89556bJeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags, KeyEvent* outFallbackKeyEvent) {
853915bb845b032dc184dba5e60970b803390ca3edJeff Brown        return false;
863915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
873915bb845b032dc184dba5e60970b803390ca3edJeff Brown
88c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void notifySwitch(nsecs_t when,
89bcc046af4ef171aa3aa3c6b64efb5cafc1e46cd3Jeff Brown            uint32_t switchValues, uint32_t switchMask, uint32_t policyFlags) {
90c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
91c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
92c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) {
93c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
94c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
95c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual bool checkInjectEventsPermissionNonReentrant(
96c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t injectorPid, int32_t injectorUid) {
97c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return false;
98c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
9946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
10046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputDispatcherTest ---
103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputDispatcherTest : public testing::Test {
105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeInputDispatcherPolicy> mFakePolicy;
107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<InputDispatcher> mDispatcher;
108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void SetUp() {
110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy = new FakeInputDispatcherPolicy();
111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDispatcher = new InputDispatcher(mFakePolicy);
112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void TearDown() {
115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy.clear();
116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDispatcher.clear();
117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) {
122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    KeyEvent event;
123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects undefined key actions.
125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*action*/ -1, 0,
127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1290029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject key events with undefined action.";
131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API.
133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEY_EVENT_ACTION_MULTIPLE, 0,
135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1370029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject key events with ACTION_MULTIPLE.";
139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    MotionEvent event;
143fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    PointerProperties pointerProperties[MAX_POINTERS + 1];
144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    PointerCoords pointerCoords[MAX_POINTERS + 1];
145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    for (int i = 0; i <= MAX_POINTERS; i++) {
146fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        pointerProperties[i].clear();
147fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        pointerProperties[i].id = i;
148fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown        pointerCoords[i].clear();
149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects undefined motion actions.
152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
153fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
155fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1570029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with undefined action.";
159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects pointer down with invalid index.
161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
163fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
165fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1670029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer down index too large.";
169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
172fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
174fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1760029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer down index too small.";
178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects pointer up with invalid index.
180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
182fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
184fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1860029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer up index too large.";
188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
191fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
193fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
1950029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer up index too small.";
197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with invalid number of pointers.
199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
200fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
202fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 0, pointerProperties, pointerCoords);
203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2040029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with 0 pointers.";
206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
208fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
210fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ MAX_POINTERS + 1, pointerProperties, pointerCoords);
211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2120029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with more than MAX_POINTERS pointers.";
214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with invalid pointer ids.
216fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    pointerProperties[0].id = -1;
217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
218fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
220fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2220029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer ids less than 0.";
224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
225fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    pointerProperties[0].id = MAX_POINTER_ID + 1;
226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
227fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
228c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
229fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 1, pointerProperties, pointerCoords);
230c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2310029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
232c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer ids greater than MAX_POINTER_ID.";
233c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
234c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with duplicate pointer ids.
235fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    pointerProperties[0].id = 1;
236fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown    pointerProperties[1].id = 1;
237c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
238fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0, 0,
239c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
240fe9f8ab03a63b1037f07dd85799fbea80ec6adaaJeff Brown            /*pointerCount*/ 2, pointerProperties, pointerCoords);
241c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
2420029c66203ab9ded4342976bf7a17bb63af8c44aJeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0, 0))
243c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with duplicate pointer ids.";
24446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
24546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
24646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
247