Skip to content

Commit 2be9c52

Browse files
committed
Add tests for AndroidInputEventProtoConverter::toProtoWindowDispatch
Bug: 391468016 Test: Presubmit Flag: TEST_ONLY Change-Id: I2f1270e4266b07861426b8bbd8af9d9337dd138b
1 parent c233f0a commit 2be9c52

2 files changed

Lines changed: 150 additions & 4 deletions

File tree

services/inputflinger/dispatcher/trace/InputTracingBackendInterface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ struct WindowDispatchArgs {
108108
TracedEvent eventEntry;
109109
nsecs_t deliveryTime;
110110
int32_t resolvedFlags;
111-
gui::Uid targetUid;
111+
gui::Uid targetUid = gui::Uid::INVALID;
112112
int64_t vsyncId;
113113
int32_t windowId;
114114
ui::Transform transform;

services/inputflinger/tests/AndroidInputEventProtoConverter_test.cpp

Lines changed: 149 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,26 @@ class MockProtoKey {
7777
MOCK_METHOD(void, set_meta_state, (uint32_t));
7878
};
7979

80-
using TestProtoConverter = AndroidInputEventProtoConverter<MockProtoMotion, MockProtoKey,
81-
proto::AndroidWindowInputDispatchEvent,
82-
proto::AndroidInputEventConfig::Decoder>;
80+
class MockProtoDispatchPointer {
81+
public:
82+
MOCK_METHOD(void, set_pointer_id, (uint32_t));
83+
MOCK_METHOD(void, set_x_in_display, (float));
84+
MOCK_METHOD(void, set_y_in_display, (float));
85+
MOCK_METHOD(MockProtoAxisValue*, add_axis_value_in_window, ());
86+
};
87+
88+
class MockProtoDispatch {
89+
public:
90+
MOCK_METHOD(void, set_event_id, (uint32_t));
91+
MOCK_METHOD(void, set_vsync_id, (uint32_t));
92+
MOCK_METHOD(void, set_window_id, (uint32_t));
93+
MOCK_METHOD(void, set_resolved_flags, (uint32_t));
94+
MOCK_METHOD(MockProtoDispatchPointer*, add_dispatched_pointer, ());
95+
};
96+
97+
using TestProtoConverter =
98+
AndroidInputEventProtoConverter<MockProtoMotion, MockProtoKey, MockProtoDispatch,
99+
proto::AndroidInputEventConfig::Decoder>;
83100

84101
TEST(AndroidInputEventProtoConverterTest, ToProtoMotionEvent) {
85102
TracedMotionEvent event{};
@@ -435,6 +452,135 @@ TEST(AndroidInputEventProtoConverterTest, ToProtoKeyEvent_Redacted) {
435452
TestProtoConverter::toProtoKeyEvent(event, proto, /*isRedacted=*/true);
436453
}
437454

455+
TEST(AndroidInputEventProtoConverterTest, ToProtoWindowDispatchEvent_Motion_IdentityTransform) {
456+
TracedMotionEvent motion{};
457+
motion.pointerProperties.emplace_back(PointerProperties{
458+
.id = 4,
459+
.toolType = ToolType::MOUSE,
460+
});
461+
motion.pointerCoords.emplace_back();
462+
motion.pointerCoords.back().setAxisValue(AMOTION_EVENT_AXIS_X, 5.0f);
463+
motion.pointerCoords.back().setAxisValue(AMOTION_EVENT_AXIS_Y, 6.0f);
464+
465+
WindowDispatchArgs args{};
466+
args.eventEntry = motion;
467+
args.vsyncId = 1;
468+
args.windowId = 2;
469+
args.resolvedFlags = 3;
470+
args.rawTransform = ui::Transform{};
471+
args.transform = ui::Transform{};
472+
473+
testing::StrictMock<MockProtoDispatch> proto;
474+
testing::StrictMock<MockProtoDispatchPointer> pointer;
475+
476+
EXPECT_CALL(proto, set_event_id(0));
477+
EXPECT_CALL(proto, set_vsync_id(1));
478+
EXPECT_CALL(proto, set_window_id(2));
479+
EXPECT_CALL(proto, set_resolved_flags(3));
480+
EXPECT_CALL(proto, add_dispatched_pointer()).WillOnce(Return(&pointer));
481+
EXPECT_CALL(pointer, set_pointer_id(4));
482+
483+
// Since we are using identity transforms, the axis values will be identical to those in the
484+
// traced event, so they should not be traced here.
485+
EXPECT_CALL(pointer, add_axis_value_in_window()).Times(0);
486+
EXPECT_CALL(pointer, set_x_in_display(_)).Times(0);
487+
EXPECT_CALL(pointer, set_y_in_display(_)).Times(0);
488+
489+
TestProtoConverter::toProtoWindowDispatchEvent(args, proto, /*isRedacted=*/false);
490+
}
491+
492+
TEST(AndroidInputEventProtoConverterTest, ToProtoWindowDispatchEvent_Motion_CustomTransform) {
493+
TracedMotionEvent motion{};
494+
motion.pointerProperties.emplace_back(PointerProperties{
495+
.id = 4,
496+
.toolType = ToolType::MOUSE,
497+
});
498+
motion.pointerCoords.emplace_back();
499+
motion.pointerCoords.back().setAxisValue(AMOTION_EVENT_AXIS_X, 8.0f);
500+
motion.pointerCoords.back().setAxisValue(AMOTION_EVENT_AXIS_Y, 6.0f);
501+
502+
WindowDispatchArgs args{};
503+
args.eventEntry = motion;
504+
args.vsyncId = 1;
505+
args.windowId = 2;
506+
args.resolvedFlags = 3;
507+
args.rawTransform.set(2, 0, 0, 0.5);
508+
args.transform.set(1.0, 0, 0, 0.5);
509+
510+
testing::StrictMock<MockProtoDispatch> proto;
511+
testing::StrictMock<MockProtoDispatchPointer> pointer;
512+
testing::StrictMock<MockProtoAxisValue> axisValue1;
513+
514+
EXPECT_CALL(proto, set_event_id(0));
515+
EXPECT_CALL(proto, set_vsync_id(1));
516+
EXPECT_CALL(proto, set_window_id(2));
517+
EXPECT_CALL(proto, set_resolved_flags(3));
518+
EXPECT_CALL(proto, add_dispatched_pointer()).WillOnce(Return(&pointer));
519+
EXPECT_CALL(pointer, set_pointer_id(4));
520+
521+
// Only the transformed axis-values that differ from the traced event will be traced.
522+
EXPECT_CALL(pointer, add_axis_value_in_window()).WillOnce(Return(&axisValue1));
523+
EXPECT_CALL(pointer, set_x_in_display(16.0f)); // MotionEvent::getRawX
524+
EXPECT_CALL(pointer, set_y_in_display(3.0f)); // MotionEvent::getRawY
525+
526+
EXPECT_CALL(axisValue1, set_axis(AMOTION_EVENT_AXIS_Y));
527+
EXPECT_CALL(axisValue1, set_value(3.0f));
528+
529+
TestProtoConverter::toProtoWindowDispatchEvent(args, proto, /*isRedacted=*/false);
530+
}
531+
532+
TEST(AndroidInputEventProtoConverterTest, ToProtoWindowDispatchEvent_Motion_Redacted) {
533+
TracedMotionEvent motion{};
534+
motion.pointerProperties.emplace_back(PointerProperties{
535+
.id = 4,
536+
.toolType = ToolType::MOUSE,
537+
});
538+
motion.pointerCoords.emplace_back();
539+
motion.pointerCoords.back().setAxisValue(AMOTION_EVENT_AXIS_X, 5.0f);
540+
motion.pointerCoords.back().setAxisValue(AMOTION_EVENT_AXIS_Y, 6.0f);
541+
542+
WindowDispatchArgs args{};
543+
args.eventEntry = motion;
544+
args.vsyncId = 1;
545+
args.windowId = 2;
546+
args.resolvedFlags = 3;
547+
args.rawTransform = ui::Transform{};
548+
args.transform = ui::Transform{};
549+
550+
testing::StrictMock<MockProtoDispatch> proto;
551+
552+
EXPECT_CALL(proto, set_event_id(0));
553+
EXPECT_CALL(proto, set_vsync_id(1));
554+
EXPECT_CALL(proto, set_window_id(2));
555+
EXPECT_CALL(proto, set_resolved_flags(3));
556+
557+
// Redacted fields
558+
EXPECT_CALL(proto, add_dispatched_pointer()).Times(0);
559+
560+
TestProtoConverter::toProtoWindowDispatchEvent(args, proto, /*isRedacted=*/true);
561+
}
562+
563+
TEST(AndroidInputEventProtoConverterTest, ToProtoWindowDispatchEvent_Key) {
564+
TracedKeyEvent key{};
565+
566+
WindowDispatchArgs args{};
567+
args.eventEntry = key;
568+
args.vsyncId = 1;
569+
args.windowId = 2;
570+
args.resolvedFlags = 3;
571+
args.rawTransform = ui::Transform{};
572+
args.transform = ui::Transform{};
573+
574+
testing::StrictMock<MockProtoDispatch> proto;
575+
576+
EXPECT_CALL(proto, set_event_id(0));
577+
EXPECT_CALL(proto, set_vsync_id(1));
578+
EXPECT_CALL(proto, set_window_id(2));
579+
EXPECT_CALL(proto, set_resolved_flags(3));
580+
581+
TestProtoConverter::toProtoWindowDispatchEvent(args, proto, /*isRedacted=*/true);
582+
}
583+
438584
} // namespace
439585

440586
} // namespace android::inputdispatcher::trace

0 commit comments

Comments
 (0)