InputDispatcher_test.cpp revision 1f2451007c660091b7b090c1ea332f9044515d2d
146b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//
246b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown// Copyright 2010 The Android Open Source Project
346b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown//
446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <ui/InputDispatcher.h>
646b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown#include <gtest/gtest.h>
7c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown#include <linux/input.h>
846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownnamespace android {
1046b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
11c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary time value.
12c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const nsecs_t ARBITRARY_TIME = 1234;
13c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
14c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary device id.
15c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t DEVICE_ID = 1;
16c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
17c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// An arbitrary injector pid / uid pair that has permission to inject events.
18c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t INJECTOR_PID = 999;
19c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownstatic const int32_t INJECTOR_UID = 1001;
20c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
21c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
22c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- FakeInputDispatcherPolicy ---
23c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
24c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass FakeInputDispatcherPolicy : public InputDispatcherPolicyInterface {
25c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
26c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual ~FakeInputDispatcherPolicy() {
27c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
28c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
2946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brownpublic:
30c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    FakeInputDispatcherPolicy() {
31c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
32c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
33c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprivate:
34c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void notifyConfigurationChanged(nsecs_t when) {
35c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
36c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
37c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual nsecs_t notifyANR(const sp<InputApplicationHandle>& inputApplicationHandle,
38c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            const sp<InputChannel>& inputChannel) {
39c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 0;
40c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
41c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
42c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void notifyInputChannelBroken(const sp<InputChannel>& inputChannel) {
43c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
44c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
45c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual nsecs_t getKeyRepeatTimeout() {
46c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 500 * 1000000LL;
47c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
48c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
49c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual nsecs_t getKeyRepeatDelay() {
50c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 50 * 1000000LL;
51c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
52c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
53c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual int32_t getMaxEventsPerSecond() {
54c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return 60;
55c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
56c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
571f2451007c660091b7b090c1ea332f9044515d2dJeff Brown    virtual void interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) {
58c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
59c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
60c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void interceptGenericBeforeQueueing(nsecs_t when, uint32_t& policyFlags) {
61c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
62c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
63c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual bool interceptKeyBeforeDispatching(const sp<InputChannel>& inputChannel,
64c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags) {
65c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return false;
66c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
67c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
683915bb845b032dc184dba5e60970b803390ca3edJeff Brown    virtual bool dispatchUnhandledKey(const sp<InputChannel>& inputChannel,
693915bb845b032dc184dba5e60970b803390ca3edJeff Brown            const KeyEvent* keyEvent, uint32_t policyFlags) {
703915bb845b032dc184dba5e60970b803390ca3edJeff Brown        return false;
713915bb845b032dc184dba5e60970b803390ca3edJeff Brown    }
723915bb845b032dc184dba5e60970b803390ca3edJeff Brown
73c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void notifySwitch(nsecs_t when,
74c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t switchCode, int32_t switchValue, uint32_t policyFlags) {
75c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
76c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
77c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void pokeUserActivity(nsecs_t eventTime, int32_t eventType) {
78c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
79c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
80c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual bool checkInjectEventsPermissionNonReentrant(
81c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            int32_t injectorPid, int32_t injectorUid) {
82c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        return false;
83c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
8446b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown};
8546b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
86c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
87c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown// --- InputDispatcherTest ---
88c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
89c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownclass InputDispatcherTest : public testing::Test {
90c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brownprotected:
91c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<FakeInputDispatcherPolicy> mFakePolicy;
92c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    sp<InputDispatcher> mDispatcher;
93c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
94c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void SetUp() {
95c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy = new FakeInputDispatcherPolicy();
96c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDispatcher = new InputDispatcher(mFakePolicy);
97c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
98c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
99c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    virtual void TearDown() {
100c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mFakePolicy.clear();
101c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        mDispatcher.clear();
102c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
103c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown};
104c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
105c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
106c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesKeyEvents) {
107c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    KeyEvent event;
108c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
109c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects undefined key actions.
110c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
111c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*action*/ -1, 0,
112c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
113c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
114c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
115c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject key events with undefined action.";
116c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
117c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects ACTION_MULTIPLE since it is not supported despite being defined in the API.
118c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_KEYBOARD,
119c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEY_EVENT_ACTION_MULTIPLE, 0,
120c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AKEYCODE_A, KEY_A, AMETA_NONE, 0, ARBITRARY_TIME, ARBITRARY_TIME);
121c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
122c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
123c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject key events with ACTION_MULTIPLE.";
124c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown}
125c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
126c3db858de9fa152480b9cf53c8c0cb793a280722Jeff BrownTEST_F(InputDispatcherTest, InjectInputEvent_ValidatesMotionEvents) {
127c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    MotionEvent event;
128c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    int32_t pointerIds[MAX_POINTERS + 1];
129c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    PointerCoords pointerCoords[MAX_POINTERS + 1];
130c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    for (int i = 0; i <= MAX_POINTERS; i++) {
131c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown        pointerIds[i] = i;
132c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    }
133c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
134c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects undefined motion actions.
135c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
136c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*action*/ -1, 0, 0, AMETA_NONE, 0, 0, 0, 0,
137c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
138c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
139c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
140c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
141c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with undefined action.";
142c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
143c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects pointer down with invalid index.
144c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
145c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_DOWN | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
146c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0,
147c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
148c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
149c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
150c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
151c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer down index too large.";
152c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
153c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
154c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_DOWN | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
155c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0,
156c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
157c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
158c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
159c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
160c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer down index too small.";
161c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
162c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects pointer up with invalid index.
163c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
164c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_UP | (1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
165c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0,
166c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
167c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
168c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
169c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
170c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer up index too large.";
171c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
172c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
173c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_POINTER_UP | (-1 << AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT),
174c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            0, 0, AMETA_NONE, 0, 0, 0, 0,
175c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
176c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
177c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
178c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
179c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer up index too small.";
180c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
181c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with invalid number of pointers.
182c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
183c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
184c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
185c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 0, pointerIds, pointerCoords);
186c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
187c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
188c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with 0 pointers.";
189c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
190c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
191c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
192c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
193c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ MAX_POINTERS + 1, pointerIds, pointerCoords);
194c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
195c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
196c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with more than MAX_POINTERS pointers.";
197c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
198c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with invalid pointer ids.
199c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    pointerIds[0] = -1;
200c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
201c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
202c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
203c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
204c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
205c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
206c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer ids less than 0.";
207c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
208c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    pointerIds[0] = MAX_POINTER_ID + 1;
209c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
210c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
211c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
212c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 1, pointerIds, pointerCoords);
213c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
214c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
215c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with pointer ids greater than MAX_POINTER_ID.";
216c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown
217c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    // Rejects motion events with duplicate pointer ids.
218c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    pointerIds[0] = 1;
219c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    pointerIds[1] = 1;
220c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    event.initialize(DEVICE_ID, AINPUT_SOURCE_TOUCHSCREEN,
221c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            AMOTION_EVENT_ACTION_DOWN, 0, 0, AMETA_NONE, 0, 0, 0, 0,
222c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            ARBITRARY_TIME, ARBITRARY_TIME,
223c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            /*pointerCount*/ 2, pointerIds, pointerCoords);
224c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown    ASSERT_EQ(INPUT_EVENT_INJECTION_FAILED, mDispatcher->injectInputEvent(&event,
225c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            INJECTOR_PID, INJECTOR_UID, INPUT_EVENT_INJECTION_SYNC_NONE, 0))
226c3db858de9fa152480b9cf53c8c0cb793a280722Jeff Brown            << "Should reject motion events with duplicate pointer ids.";
22746b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown}
22846b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown
22946b9ac0ae2162309774a7478cd9d4e578747bfc2Jeff Brown} // namespace android
230