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