blob: 3f14c2312bbef9174106d977002353e729d3fac4 [file] [log] [blame]
Siarhei Vishniakouf2652122021-03-05 21:39:46 +00001/*
2 * Copyright (C) 2021 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include "../dispatcher/LatencyTracker.h"
Asmita Poddardd9a6cd2023-09-26 15:35:12 +000018#include "../InputDeviceMetricsSource.h"
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000019
Siarhei Vishniakou363e7292021-07-09 03:22:42 +000020#include <android-base/properties.h>
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000021#include <binder/Binder.h>
22#include <gtest/gtest.h>
23#include <inttypes.h>
Asmita Poddardd9a6cd2023-09-26 15:35:12 +000024#include <linux/input.h>
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000025#include <log/log.h>
26
27#define TAG "LatencyTracker_test"
28
Siarhei Vishniakou363e7292021-07-09 03:22:42 +000029using android::base::HwTimeoutMultiplier;
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000030using android::inputdispatcher::InputEventTimeline;
31using android::inputdispatcher::LatencyTracker;
32
33namespace android::inputdispatcher {
34
Asmita Poddardd9a6cd2023-09-26 15:35:12 +000035namespace {
36
37constexpr DeviceId DEVICE_ID = 100;
38
39static InputDeviceInfo generateTestDeviceInfo(uint16_t vendorId, uint16_t productId,
40 DeviceId deviceId) {
41 InputDeviceIdentifier identifier;
42 identifier.vendor = vendorId;
43 identifier.product = productId;
44 auto info = InputDeviceInfo();
45 info.initialize(deviceId, /*generation=*/1, /*controllerNumber=*/1, identifier, "Test Device",
Siarhei Vishniakoucfbee532024-05-10 13:41:35 -070046 /*isExternal=*/false, /*hasMic=*/false, ui::LogicalDisplayId::INVALID);
Asmita Poddardd9a6cd2023-09-26 15:35:12 +000047 return info;
48}
49
50void setDefaultInputDeviceInfo(LatencyTracker& tracker) {
51 InputDeviceInfo deviceInfo = generateTestDeviceInfo(
52 /*vendorId=*/0, /*productId=*/0, DEVICE_ID);
53 tracker.setInputDevices({deviceInfo});
54}
55
56} // namespace
57
Siarhei Vishniakou363e7292021-07-09 03:22:42 +000058const std::chrono::duration ANR_TIMEOUT = std::chrono::milliseconds(
59 android::os::IInputConstants::UNMULTIPLIED_DEFAULT_DISPATCHING_TIMEOUT_MILLIS *
60 HwTimeoutMultiplier());
61
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000062InputEventTimeline getTestTimeline() {
63 InputEventTimeline t(
Harry Cutts33476232023-01-30 19:57:29 +000064 /*eventTime=*/2,
Asmita Poddardd9a6cd2023-09-26 15:35:12 +000065 /*readTime=*/3,
66 /*vendorId=*/0,
67 /*productId=*/0,
jioana0bdbea12024-08-10 19:26:04 +000068 /*sources=*/{InputDeviceUsageSource::UNKNOWN},
69 /*inputEventActionType=*/InputEventActionType::UNKNOWN_INPUT_EVENT);
Harry Cutts33476232023-01-30 19:57:29 +000070 ConnectionTimeline expectedCT(/*deliveryTime=*/6, /*consumeTime=*/7, /*finishTime=*/8);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000071 std::array<nsecs_t, GraphicsTimeline::SIZE> graphicsTimeline;
72 graphicsTimeline[GraphicsTimeline::GPU_COMPLETED_TIME] = 9;
73 graphicsTimeline[GraphicsTimeline::PRESENT_TIME] = 10;
74 expectedCT.setGraphicsTimeline(std::move(graphicsTimeline));
Siarhei Vishniakouaed7ad02022-08-03 15:04:33 -070075 t.connectionTimelines.emplace(sp<BBinder>::make(), std::move(expectedCT));
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000076 return t;
77}
78
79// --- LatencyTrackerTest ---
80class LatencyTrackerTest : public testing::Test, public InputEventTimelineProcessor {
81protected:
82 std::unique_ptr<LatencyTracker> mTracker;
83 sp<IBinder> connection1;
84 sp<IBinder> connection2;
85
86 void SetUp() override {
Siarhei Vishniakouaed7ad02022-08-03 15:04:33 -070087 connection1 = sp<BBinder>::make();
88 connection2 = sp<BBinder>::make();
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000089
jioana24878b52024-09-10 10:13:27 +000090 mTracker = std::make_unique<LatencyTracker>(*this);
Asmita Poddardd9a6cd2023-09-26 15:35:12 +000091 setDefaultInputDeviceInfo(*mTracker);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000092 }
93 void TearDown() override {}
94
Siarhei Vishniakou363e7292021-07-09 03:22:42 +000095 void triggerEventReporting(nsecs_t lastEventTime);
96
Siarhei Vishniakouf2652122021-03-05 21:39:46 +000097 void assertReceivedTimeline(const InputEventTimeline& timeline);
98 /**
99 * Timelines can be received in any order (order is not guaranteed). So if we are expecting more
100 * than 1 timeline, use this function to check that the set of received timelines matches
101 * what we expected.
102 */
103 void assertReceivedTimelines(const std::vector<InputEventTimeline>& timelines);
104
105private:
106 void processTimeline(const InputEventTimeline& timeline) override {
107 mReceivedTimelines.push_back(timeline);
108 }
jioana24878b52024-09-10 10:13:27 +0000109 void pushLatencyStatistics() override {}
110 std::string dump(const char* prefix) const { return ""; };
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000111 std::deque<InputEventTimeline> mReceivedTimelines;
112};
113
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000114/**
115 * Send an event that would trigger the reporting of all of the events that are at least as old as
116 * the provided 'lastEventTime'.
117 */
118void LatencyTrackerTest::triggerEventReporting(nsecs_t lastEventTime) {
119 const nsecs_t triggerEventTime =
120 lastEventTime + std::chrono::nanoseconds(ANR_TIMEOUT).count() + 1;
jioana0bdbea12024-08-10 19:26:04 +0000121 mTracker->trackListener(/*inputEventId=*/1, triggerEventTime,
Asmita Poddardd9a6cd2023-09-26 15:35:12 +0000122 /*readTime=*/3, DEVICE_ID,
jioana0bdbea12024-08-10 19:26:04 +0000123 /*sources=*/{InputDeviceUsageSource::UNKNOWN},
124 AMOTION_EVENT_ACTION_CANCEL, InputEventType::MOTION);
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000125}
126
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000127void LatencyTrackerTest::assertReceivedTimeline(const InputEventTimeline& timeline) {
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000128 ASSERT_FALSE(mReceivedTimelines.empty());
129 const InputEventTimeline& t = mReceivedTimelines.front();
130 ASSERT_EQ(timeline, t);
131 mReceivedTimelines.pop_front();
132}
133
134/**
135 * We are essentially comparing two multisets, but without constructing them.
136 * This comparison is inefficient, but it avoids having to construct a set, and also avoids the
137 * declaration of copy constructor for ConnectionTimeline.
138 * We ensure that collections A and B have the same size, that for every element in A, there is an
139 * equal element in B, and for every element in B there is an equal element in A.
140 */
141void LatencyTrackerTest::assertReceivedTimelines(const std::vector<InputEventTimeline>& timelines) {
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000142 ASSERT_EQ(timelines.size(), mReceivedTimelines.size());
143 for (const InputEventTimeline& expectedTimeline : timelines) {
144 bool found = false;
145 for (const InputEventTimeline& receivedTimeline : mReceivedTimelines) {
146 if (receivedTimeline == expectedTimeline) {
147 found = true;
148 break;
149 }
150 }
151 ASSERT_TRUE(found) << "Could not find expected timeline with eventTime="
152 << expectedTimeline.eventTime;
153 }
154 for (const InputEventTimeline& receivedTimeline : mReceivedTimelines) {
155 bool found = false;
156 for (const InputEventTimeline& expectedTimeline : timelines) {
157 if (receivedTimeline == expectedTimeline) {
158 found = true;
159 break;
160 }
161 }
162 ASSERT_TRUE(found) << "Could not find received timeline with eventTime="
163 << receivedTimeline.eventTime;
164 }
165 mReceivedTimelines.clear();
166}
167
168/**
169 * Ensure that calling 'trackListener' in isolation only creates an inputflinger timeline, without
170 * any additional ConnectionTimeline's.
171 */
172TEST_F(LatencyTrackerTest, TrackListener_DoesNotTriggerReporting) {
jioana0bdbea12024-08-10 19:26:04 +0000173 mTracker->trackListener(/*inputEventId=*/1, /*eventTime=*/2,
174 /*readTime=*/3, DEVICE_ID, {InputDeviceUsageSource::UNKNOWN},
175 AMOTION_EVENT_ACTION_CANCEL, InputEventType::MOTION);
Harry Cutts33476232023-01-30 19:57:29 +0000176 triggerEventReporting(/*eventTime=*/2);
jioana0bdbea12024-08-10 19:26:04 +0000177 assertReceivedTimeline(
jioana97cc8ac2024-09-09 15:01:43 +0000178 InputEventTimeline{/*eventTime=*/2,
jioana0bdbea12024-08-10 19:26:04 +0000179 /*readTime=*/3, /*vendorId=*/0, /*productID=*/0,
180 /*sources=*/{InputDeviceUsageSource::UNKNOWN},
181 /*inputEventActionType=*/InputEventActionType::UNKNOWN_INPUT_EVENT});
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000182}
183
184/**
185 * A single call to trackFinishedEvent should not cause a timeline to be reported.
186 */
187TEST_F(LatencyTrackerTest, TrackFinishedEvent_DoesNotTriggerReporting) {
Harry Cutts33476232023-01-30 19:57:29 +0000188 mTracker->trackFinishedEvent(/*inputEventId=*/1, connection1, /*deliveryTime=*/2,
189 /*consumeTime=*/3, /*finishTime=*/4);
190 triggerEventReporting(/*eventTime=*/4);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000191 assertReceivedTimelines({});
192}
193
194/**
195 * A single call to trackGraphicsLatency should not cause a timeline to be reported.
196 */
197TEST_F(LatencyTrackerTest, TrackGraphicsLatency_DoesNotTriggerReporting) {
198 std::array<nsecs_t, GraphicsTimeline::SIZE> graphicsTimeline;
199 graphicsTimeline[GraphicsTimeline::GPU_COMPLETED_TIME] = 2;
200 graphicsTimeline[GraphicsTimeline::PRESENT_TIME] = 3;
Harry Cutts33476232023-01-30 19:57:29 +0000201 mTracker->trackGraphicsLatency(/*inputEventId=*/1, connection2, graphicsTimeline);
202 triggerEventReporting(/*eventTime=*/3);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000203 assertReceivedTimelines({});
204}
205
206TEST_F(LatencyTrackerTest, TrackAllParameters_ReportsFullTimeline) {
207 constexpr int32_t inputEventId = 1;
208 InputEventTimeline expected = getTestTimeline();
209
210 const auto& [connectionToken, expectedCT] = *expected.connectionTimelines.begin();
211
jioana0bdbea12024-08-10 19:26:04 +0000212 mTracker->trackListener(inputEventId, expected.eventTime, expected.readTime, DEVICE_ID,
213 {InputDeviceUsageSource::UNKNOWN}, AMOTION_EVENT_ACTION_CANCEL,
214 InputEventType::MOTION);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000215 mTracker->trackFinishedEvent(inputEventId, connectionToken, expectedCT.deliveryTime,
216 expectedCT.consumeTime, expectedCT.finishTime);
217 mTracker->trackGraphicsLatency(inputEventId, connectionToken, expectedCT.graphicsTimeline);
218
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000219 triggerEventReporting(expected.eventTime);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000220 assertReceivedTimeline(expected);
221}
222
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000223/**
224 * Send 2 events with the same inputEventId, but different eventTime's. Ensure that no crash occurs,
225 * and that the tracker drops such events completely.
226 */
227TEST_F(LatencyTrackerTest, WhenDuplicateEventsAreReported_DoesNotCrash) {
228 constexpr nsecs_t inputEventId = 1;
229 constexpr nsecs_t readTime = 3; // does not matter for this test
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000230
231 // In the following 2 calls to trackListener, the inputEventId's are the same, but event times
232 // are different.
jioana0bdbea12024-08-10 19:26:04 +0000233 mTracker->trackListener(inputEventId, /*eventTime=*/1, readTime, DEVICE_ID,
234 {InputDeviceUsageSource::UNKNOWN}, AMOTION_EVENT_ACTION_CANCEL,
235 InputEventType::MOTION);
236 mTracker->trackListener(inputEventId, /*eventTime=*/2, readTime, DEVICE_ID,
237 {InputDeviceUsageSource::UNKNOWN}, AMOTION_EVENT_ACTION_CANCEL,
238 InputEventType::MOTION);
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000239
Harry Cutts33476232023-01-30 19:57:29 +0000240 triggerEventReporting(/*eventTime=*/2);
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000241 // Since we sent duplicate input events, the tracker should just delete all of them, because it
242 // does not have enough information to properly track them.
243 assertReceivedTimelines({});
244}
245
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000246TEST_F(LatencyTrackerTest, MultipleEvents_AreReportedConsistently) {
247 constexpr int32_t inputEventId1 = 1;
248 InputEventTimeline timeline1(
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000249 /*eventTime*/ 2,
Asmita Poddardd9a6cd2023-09-26 15:35:12 +0000250 /*readTime*/ 3,
251 /*vendorId=*/0,
252 /*productId=*/0,
jioana0bdbea12024-08-10 19:26:04 +0000253 /*sources=*/{InputDeviceUsageSource::UNKNOWN},
254 /*inputEventType=*/InputEventActionType::UNKNOWN_INPUT_EVENT);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000255 timeline1.connectionTimelines.emplace(connection1,
256 ConnectionTimeline(/*deliveryTime*/ 6, /*consumeTime*/ 7,
257 /*finishTime*/ 8));
258 ConnectionTimeline& connectionTimeline1 = timeline1.connectionTimelines.begin()->second;
259 std::array<nsecs_t, GraphicsTimeline::SIZE> graphicsTimeline1;
260 graphicsTimeline1[GraphicsTimeline::GPU_COMPLETED_TIME] = 9;
261 graphicsTimeline1[GraphicsTimeline::PRESENT_TIME] = 10;
262 connectionTimeline1.setGraphicsTimeline(std::move(graphicsTimeline1));
263
264 constexpr int32_t inputEventId2 = 10;
265 InputEventTimeline timeline2(
Harry Cutts33476232023-01-30 19:57:29 +0000266 /*eventTime=*/20,
Asmita Poddardd9a6cd2023-09-26 15:35:12 +0000267 /*readTime=*/30,
268 /*vendorId=*/0,
269 /*productId=*/0,
jioana0bdbea12024-08-10 19:26:04 +0000270 /*sources=*/{InputDeviceUsageSource::UNKNOWN},
271 /*inputEventActionType=*/InputEventActionType::UNKNOWN_INPUT_EVENT);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000272 timeline2.connectionTimelines.emplace(connection2,
Harry Cutts33476232023-01-30 19:57:29 +0000273 ConnectionTimeline(/*deliveryTime=*/60,
274 /*consumeTime=*/70,
275 /*finishTime=*/80));
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000276 ConnectionTimeline& connectionTimeline2 = timeline2.connectionTimelines.begin()->second;
277 std::array<nsecs_t, GraphicsTimeline::SIZE> graphicsTimeline2;
278 graphicsTimeline2[GraphicsTimeline::GPU_COMPLETED_TIME] = 90;
279 graphicsTimeline2[GraphicsTimeline::PRESENT_TIME] = 100;
280 connectionTimeline2.setGraphicsTimeline(std::move(graphicsTimeline2));
281
282 // Start processing first event
jioana0bdbea12024-08-10 19:26:04 +0000283 mTracker->trackListener(inputEventId1, timeline1.eventTime, timeline1.readTime, DEVICE_ID,
284 {InputDeviceUsageSource::UNKNOWN}, AMOTION_EVENT_ACTION_CANCEL,
285 InputEventType::MOTION);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000286 // Start processing second event
jioana0bdbea12024-08-10 19:26:04 +0000287 mTracker->trackListener(inputEventId2, timeline2.eventTime, timeline2.readTime, DEVICE_ID,
288 {InputDeviceUsageSource::UNKNOWN}, AMOTION_EVENT_ACTION_CANCEL,
289 InputEventType::MOTION);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000290 mTracker->trackFinishedEvent(inputEventId1, connection1, connectionTimeline1.deliveryTime,
291 connectionTimeline1.consumeTime, connectionTimeline1.finishTime);
292
293 mTracker->trackFinishedEvent(inputEventId2, connection2, connectionTimeline2.deliveryTime,
294 connectionTimeline2.consumeTime, connectionTimeline2.finishTime);
295 mTracker->trackGraphicsLatency(inputEventId1, connection1,
296 connectionTimeline1.graphicsTimeline);
297 mTracker->trackGraphicsLatency(inputEventId2, connection2,
298 connectionTimeline2.graphicsTimeline);
299 // Now both events should be completed
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000300 triggerEventReporting(timeline2.eventTime);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000301 assertReceivedTimelines({timeline1, timeline2});
302}
303
304/**
305 * Check that LatencyTracker consistently tracks events even if there are many incomplete events.
306 */
307TEST_F(LatencyTrackerTest, IncompleteEvents_AreHandledConsistently) {
308 InputEventTimeline timeline = getTestTimeline();
309 std::vector<InputEventTimeline> expectedTimelines;
310 const ConnectionTimeline& expectedCT = timeline.connectionTimelines.begin()->second;
311 const sp<IBinder>& token = timeline.connectionTimelines.begin()->first;
312
313 for (size_t i = 1; i <= 100; i++) {
jioana0bdbea12024-08-10 19:26:04 +0000314 mTracker->trackListener(/*inputEventId=*/i, timeline.eventTime, timeline.readTime,
315 /*deviceId=*/DEVICE_ID,
316 /*sources=*/{InputDeviceUsageSource::UNKNOWN},
317 AMOTION_EVENT_ACTION_CANCEL, InputEventType::MOTION);
jioana97cc8ac2024-09-09 15:01:43 +0000318 expectedTimelines.push_back(InputEventTimeline{timeline.eventTime, timeline.readTime,
319 timeline.vendorId, timeline.productId,
320 timeline.sources,
jioana0bdbea12024-08-10 19:26:04 +0000321 timeline.inputEventActionType});
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000322 }
323 // Now, complete the first event that was sent.
Harry Cutts33476232023-01-30 19:57:29 +0000324 mTracker->trackFinishedEvent(/*inputEventId=*/1, token, expectedCT.deliveryTime,
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000325 expectedCT.consumeTime, expectedCT.finishTime);
Harry Cutts33476232023-01-30 19:57:29 +0000326 mTracker->trackGraphicsLatency(/*inputEventId=*/1, token, expectedCT.graphicsTimeline);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000327
328 expectedTimelines[0].connectionTimelines.emplace(token, std::move(expectedCT));
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000329 triggerEventReporting(timeline.eventTime);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000330 assertReceivedTimelines(expectedTimelines);
331}
332
333/**
334 * For simplicity of the implementation, LatencyTracker only starts tracking an event when
335 * 'trackListener' is invoked.
336 * Both 'trackFinishedEvent' and 'trackGraphicsLatency' should not start a new event.
337 * If they are received before 'trackListener' (which should not be possible), they are ignored.
338 */
339TEST_F(LatencyTrackerTest, EventsAreTracked_WhenTrackListenerIsCalledFirst) {
340 constexpr int32_t inputEventId = 1;
341 InputEventTimeline expected = getTestTimeline();
342 const ConnectionTimeline& expectedCT = expected.connectionTimelines.begin()->second;
343 mTracker->trackFinishedEvent(inputEventId, connection1, expectedCT.deliveryTime,
344 expectedCT.consumeTime, expectedCT.finishTime);
345 mTracker->trackGraphicsLatency(inputEventId, connection1, expectedCT.graphicsTimeline);
346
jioana0bdbea12024-08-10 19:26:04 +0000347 mTracker->trackListener(inputEventId, expected.eventTime, expected.readTime, DEVICE_ID,
348 {InputDeviceUsageSource::UNKNOWN}, AMOTION_EVENT_ACTION_CANCEL,
349 InputEventType::MOTION);
Siarhei Vishniakou363e7292021-07-09 03:22:42 +0000350 triggerEventReporting(expected.eventTime);
jioana97cc8ac2024-09-09 15:01:43 +0000351 assertReceivedTimeline(InputEventTimeline{expected.eventTime, expected.readTime,
352 expected.vendorId, expected.productId,
353 expected.sources, expected.inputEventActionType});
Asmita Poddardd9a6cd2023-09-26 15:35:12 +0000354}
355
356/**
357 * Check that LatencyTracker has the received timeline that contains the correctly
358 * resolved product ID, vendor ID and source for a particular device ID from
359 * among a list of devices.
360 */
361TEST_F(LatencyTrackerTest, TrackListenerCheck_DeviceInfoFieldsInputEventTimeline) {
362 constexpr int32_t inputEventId = 1;
363 InputEventTimeline timeline(
jioana97cc8ac2024-09-09 15:01:43 +0000364 /*eventTime*/ 2, /*readTime*/ 3,
Asmita Poddardd9a6cd2023-09-26 15:35:12 +0000365 /*vendorId=*/50, /*productId=*/60,
366 /*sources=*/
jioana0bdbea12024-08-10 19:26:04 +0000367 {InputDeviceUsageSource::TOUCHSCREEN, InputDeviceUsageSource::STYLUS_DIRECT},
368 /*inputEventActionType=*/InputEventActionType::UNKNOWN_INPUT_EVENT);
Asmita Poddardd9a6cd2023-09-26 15:35:12 +0000369 InputDeviceInfo deviceInfo1 = generateTestDeviceInfo(
370 /*vendorId=*/5, /*productId=*/6, /*deviceId=*/DEVICE_ID + 1);
371 InputDeviceInfo deviceInfo2 = generateTestDeviceInfo(
372 /*vendorId=*/50, /*productId=*/60, /*deviceId=*/DEVICE_ID);
373
374 mTracker->setInputDevices({deviceInfo1, deviceInfo2});
jioana0bdbea12024-08-10 19:26:04 +0000375 mTracker->trackListener(inputEventId, timeline.eventTime, timeline.readTime, DEVICE_ID,
Asmita Poddardd9a6cd2023-09-26 15:35:12 +0000376 {InputDeviceUsageSource::TOUCHSCREEN,
jioana0bdbea12024-08-10 19:26:04 +0000377 InputDeviceUsageSource::STYLUS_DIRECT},
378 AMOTION_EVENT_ACTION_CANCEL, InputEventType::MOTION);
Asmita Poddardd9a6cd2023-09-26 15:35:12 +0000379 triggerEventReporting(timeline.eventTime);
380 assertReceivedTimeline(timeline);
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000381}
382
jioana0bdbea12024-08-10 19:26:04 +0000383/**
384 * Check that InputEventActionType is correctly assigned to InputEventTimeline in trackListener.
385 */
386TEST_F(LatencyTrackerTest, TrackListenerCheck_InputEventActionTypeFieldInputEventTimeline) {
387 constexpr int32_t inputEventId = 1;
388 // Create timelines for different event types (Motion, Key)
389 InputEventTimeline motionDownTimeline(
jioana97cc8ac2024-09-09 15:01:43 +0000390 /*eventTime*/ 2, /*readTime*/ 3,
jioana0bdbea12024-08-10 19:26:04 +0000391 /*vendorId*/ 0, /*productId*/ 0,
392 /*sources*/ {InputDeviceUsageSource::UNKNOWN},
393 /*inputEventActionType*/ InputEventActionType::MOTION_ACTION_DOWN);
394
395 InputEventTimeline motionMoveTimeline(
jioana97cc8ac2024-09-09 15:01:43 +0000396 /*eventTime*/ 4, /*readTime*/ 5,
jioana0bdbea12024-08-10 19:26:04 +0000397 /*vendorId*/ 0, /*productId*/ 0,
398 /*sources*/ {InputDeviceUsageSource::UNKNOWN},
399 /*inputEventActionType*/ InputEventActionType::MOTION_ACTION_MOVE);
400
401 InputEventTimeline motionUpTimeline(
jioana97cc8ac2024-09-09 15:01:43 +0000402 /*eventTime*/ 6, /*readTime*/ 7,
jioana0bdbea12024-08-10 19:26:04 +0000403 /*vendorId*/ 0, /*productId*/ 0,
404 /*sources*/ {InputDeviceUsageSource::UNKNOWN},
405 /*inputEventActionType*/ InputEventActionType::MOTION_ACTION_UP);
406
407 InputEventTimeline keyDownTimeline(
jioana97cc8ac2024-09-09 15:01:43 +0000408 /*eventTime*/ 8, /*readTime*/ 9,
jioana0bdbea12024-08-10 19:26:04 +0000409 /*vendorId*/ 0, /*productId*/ 0,
410 /*sources*/ {InputDeviceUsageSource::UNKNOWN},
411 /*inputEventActionType*/ InputEventActionType::KEY);
412
413 InputEventTimeline keyUpTimeline(
jioana97cc8ac2024-09-09 15:01:43 +0000414 /*eventTime*/ 10, /*readTime*/ 11,
jioana0bdbea12024-08-10 19:26:04 +0000415 /*vendorId*/ 0, /*productId*/ 0,
416 /*sources*/ {InputDeviceUsageSource::UNKNOWN},
417 /*inputEventActionType*/ InputEventActionType::KEY);
418
419 InputEventTimeline unknownTimeline(
jioana97cc8ac2024-09-09 15:01:43 +0000420 /*eventTime*/ 12, /*readTime*/ 13,
jioana0bdbea12024-08-10 19:26:04 +0000421 /*vendorId*/ 0, /*productId*/ 0,
422 /*sources*/ {InputDeviceUsageSource::UNKNOWN},
423 /*inputEventActionType*/ InputEventActionType::UNKNOWN_INPUT_EVENT);
424
425 mTracker->trackListener(inputEventId, motionDownTimeline.eventTime, motionDownTimeline.readTime,
426 DEVICE_ID, motionDownTimeline.sources, AMOTION_EVENT_ACTION_DOWN,
427 InputEventType::MOTION);
428 mTracker->trackListener(inputEventId + 1, motionMoveTimeline.eventTime,
429 motionMoveTimeline.readTime, DEVICE_ID, motionMoveTimeline.sources,
430 AMOTION_EVENT_ACTION_MOVE, InputEventType::MOTION);
431 mTracker->trackListener(inputEventId + 2, motionUpTimeline.eventTime, motionUpTimeline.readTime,
432 DEVICE_ID, motionUpTimeline.sources, AMOTION_EVENT_ACTION_UP,
433 InputEventType::MOTION);
434 mTracker->trackListener(inputEventId + 3, keyDownTimeline.eventTime, keyDownTimeline.readTime,
435 DEVICE_ID, keyDownTimeline.sources, AKEY_EVENT_ACTION_DOWN,
436 InputEventType::KEY);
437 mTracker->trackListener(inputEventId + 4, keyUpTimeline.eventTime, keyUpTimeline.readTime,
438 DEVICE_ID, keyUpTimeline.sources, AKEY_EVENT_ACTION_UP,
439 InputEventType::KEY);
440 mTracker->trackListener(inputEventId + 5, unknownTimeline.eventTime, unknownTimeline.readTime,
441 DEVICE_ID, unknownTimeline.sources, AMOTION_EVENT_ACTION_POINTER_DOWN,
442 InputEventType::MOTION);
443
444 triggerEventReporting(unknownTimeline.eventTime);
445
446 std::vector<InputEventTimeline> expectedTimelines = {motionDownTimeline, motionMoveTimeline,
447 motionUpTimeline, keyDownTimeline,
448 keyUpTimeline, unknownTimeline};
449 assertReceivedTimelines(expectedTimelines);
450}
451
Siarhei Vishniakouf2652122021-03-05 21:39:46 +0000452} // namespace android::inputdispatcher