Loading services/inputflinger/tests/InputDispatcher_test.cpp +57 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "TestEventMatchers.h" #include <NotifyArgsBuilders.h> #include <android-base/logging.h> #include <android-base/properties.h> #include <android-base/silent_death_test.h> #include <android-base/stringprintf.h> Loading Loading @@ -53,6 +54,7 @@ namespace android::inputdispatcher { using namespace ftl::flag_operators; using testing::AllOf; using testing::Not; namespace { Loading Loading @@ -1319,10 +1321,13 @@ public: mInputReceiver->consumeCaptureEvent(hasCapture); } void consumeMotionEvent(const ::testing::Matcher<MotionEvent>& matcher) { const MotionEvent& consumeMotionEvent(const ::testing::Matcher<MotionEvent>& matcher) { MotionEvent* motionEvent = consumeMotion(); ASSERT_NE(nullptr, motionEvent) << "Did not get a motion event, but expected " << matcher; ASSERT_THAT(*motionEvent, matcher); if (nullptr == motionEvent) { LOG(FATAL) << "Did not get a motion event, but expected " << matcher; } EXPECT_THAT(*motionEvent, matcher); return *motionEvent; } void consumeEvent(InputEventType expectedEventType, int32_t expectedAction, Loading Loading @@ -6539,6 +6544,55 @@ TEST_F(InputDispatcherTest, NotifiesDeviceInteractionsWithKeys) { ASSERT_NO_FATAL_FAILURE(mFakePolicy->assertNotifyDeviceInteractionWasNotCalled()); } TEST_F(InputDispatcherTest, HoverEnterExitSynthesisUsesNewEventId) { std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>(); sp<FakeWindowHandle> left = sp<FakeWindowHandle>::make(application, mDispatcher, "Left Window", ADISPLAY_ID_DEFAULT); left->setFrame(Rect(0, 0, 100, 100)); sp<FakeWindowHandle> right = sp<FakeWindowHandle>::make(application, mDispatcher, "Right Window", ADISPLAY_ID_DEFAULT); right->setFrame(Rect(100, 0, 200, 100)); sp<FakeWindowHandle> spy = sp<FakeWindowHandle>::make(application, mDispatcher, "Spy Window", ADISPLAY_ID_DEFAULT); spy->setFrame(Rect(0, 0, 200, 100)); spy->setTrustedOverlay(true); spy->setSpy(true); mDispatcher->onWindowInfosChanged( {{*spy->getInfo(), *left->getInfo(), *right->getInfo()}, {}, 0, 0}); // Send hover move to the left window, and ensure hover enter is synthesized with a new eventId. NotifyMotionArgs notifyArgs = generateMotionArgs(ACTION_HOVER_MOVE, AINPUT_SOURCE_STYLUS, ADISPLAY_ID_DEFAULT, {PointF{50, 50}}); mDispatcher->notifyMotion(notifyArgs); const MotionEvent& leftEnter = left->consumeMotionEvent( AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); spy->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), Not(WithEventId(leftEnter.getId())), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); // Send move to the right window, and ensure hover exit and enter are synthesized with new ids. notifyArgs = generateMotionArgs(ACTION_HOVER_MOVE, AINPUT_SOURCE_STYLUS, ADISPLAY_ID_DEFAULT, {PointF{150, 50}}); mDispatcher->notifyMotion(notifyArgs); const MotionEvent& leftExit = left->consumeMotionEvent( AllOf(WithMotionAction(ACTION_HOVER_EXIT), Not(WithEventId(notifyArgs.id)), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); right->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), Not(WithEventId(leftExit.getId())), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); spy->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_MOVE), WithEventId(notifyArgs.id))); } class InputDispatcherFallbackKeyTest : public InputDispatcherTest { protected: std::shared_ptr<FakeApplicationHandle> mApp; Loading services/inputflinger/tests/TestEventMatchers.h +65 −0 Original line number Diff line number Diff line Loading @@ -492,6 +492,71 @@ inline WithKeyCodeMatcher WithKeyCode(int32_t keyCode) { return WithKeyCodeMatcher(keyCode); } /// EventId class WithEventIdMatcher { public: using is_gtest_matcher = void; explicit WithEventIdMatcher(int32_t eventId) : mEventId(eventId) {} bool MatchAndExplain(const NotifyMotionArgs& args, std::ostream*) const { return mEventId == args.id; } bool MatchAndExplain(const NotifyKeyArgs& args, std::ostream*) const { return mEventId == args.id; } bool MatchAndExplain(const InputEvent& event, std::ostream*) const { return mEventId == event.getId(); } void DescribeTo(std::ostream* os) const { *os << "with eventId 0x" << std::hex << mEventId; } void DescribeNegationTo(std::ostream* os) const { *os << "with eventId not equal to 0x" << std::hex << mEventId; } private: const int32_t mEventId; }; inline WithEventIdMatcher WithEventId(int32_t eventId) { return WithEventIdMatcher(eventId); } /// EventIdSource class WithEventIdSourceMatcher { public: using is_gtest_matcher = void; explicit WithEventIdSourceMatcher(IdGenerator::Source eventIdSource) : mEventIdSource(eventIdSource) {} bool MatchAndExplain(const NotifyMotionArgs& args, std::ostream*) const { return mEventIdSource == IdGenerator::getSource(args.id); } bool MatchAndExplain(const NotifyKeyArgs& args, std::ostream*) const { return mEventIdSource == IdGenerator::getSource(args.id); } bool MatchAndExplain(const InputEvent& event, std::ostream*) const { return mEventIdSource == IdGenerator::getSource(event.getId()); } void DescribeTo(std::ostream* os) const { *os << "with eventId from source 0x" << std::hex << ftl::to_underlying(mEventIdSource); } void DescribeNegationTo(std::ostream* os) const { *os << "wrong event from source"; } private: const IdGenerator::Source mEventIdSource; }; inline WithEventIdSourceMatcher WithEventIdSource(IdGenerator::Source eventIdSource) { return WithEventIdSourceMatcher(eventIdSource); } MATCHER_P(WithRepeatCount, repeatCount, "KeyEvent with specified repeat count") { return arg.getRepeatCount() == repeatCount; } Loading Loading
services/inputflinger/tests/InputDispatcher_test.cpp +57 −3 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "TestEventMatchers.h" #include <NotifyArgsBuilders.h> #include <android-base/logging.h> #include <android-base/properties.h> #include <android-base/silent_death_test.h> #include <android-base/stringprintf.h> Loading Loading @@ -53,6 +54,7 @@ namespace android::inputdispatcher { using namespace ftl::flag_operators; using testing::AllOf; using testing::Not; namespace { Loading Loading @@ -1319,10 +1321,13 @@ public: mInputReceiver->consumeCaptureEvent(hasCapture); } void consumeMotionEvent(const ::testing::Matcher<MotionEvent>& matcher) { const MotionEvent& consumeMotionEvent(const ::testing::Matcher<MotionEvent>& matcher) { MotionEvent* motionEvent = consumeMotion(); ASSERT_NE(nullptr, motionEvent) << "Did not get a motion event, but expected " << matcher; ASSERT_THAT(*motionEvent, matcher); if (nullptr == motionEvent) { LOG(FATAL) << "Did not get a motion event, but expected " << matcher; } EXPECT_THAT(*motionEvent, matcher); return *motionEvent; } void consumeEvent(InputEventType expectedEventType, int32_t expectedAction, Loading Loading @@ -6539,6 +6544,55 @@ TEST_F(InputDispatcherTest, NotifiesDeviceInteractionsWithKeys) { ASSERT_NO_FATAL_FAILURE(mFakePolicy->assertNotifyDeviceInteractionWasNotCalled()); } TEST_F(InputDispatcherTest, HoverEnterExitSynthesisUsesNewEventId) { std::shared_ptr<FakeApplicationHandle> application = std::make_shared<FakeApplicationHandle>(); sp<FakeWindowHandle> left = sp<FakeWindowHandle>::make(application, mDispatcher, "Left Window", ADISPLAY_ID_DEFAULT); left->setFrame(Rect(0, 0, 100, 100)); sp<FakeWindowHandle> right = sp<FakeWindowHandle>::make(application, mDispatcher, "Right Window", ADISPLAY_ID_DEFAULT); right->setFrame(Rect(100, 0, 200, 100)); sp<FakeWindowHandle> spy = sp<FakeWindowHandle>::make(application, mDispatcher, "Spy Window", ADISPLAY_ID_DEFAULT); spy->setFrame(Rect(0, 0, 200, 100)); spy->setTrustedOverlay(true); spy->setSpy(true); mDispatcher->onWindowInfosChanged( {{*spy->getInfo(), *left->getInfo(), *right->getInfo()}, {}, 0, 0}); // Send hover move to the left window, and ensure hover enter is synthesized with a new eventId. NotifyMotionArgs notifyArgs = generateMotionArgs(ACTION_HOVER_MOVE, AINPUT_SOURCE_STYLUS, ADISPLAY_ID_DEFAULT, {PointF{50, 50}}); mDispatcher->notifyMotion(notifyArgs); const MotionEvent& leftEnter = left->consumeMotionEvent( AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); spy->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), Not(WithEventId(leftEnter.getId())), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); // Send move to the right window, and ensure hover exit and enter are synthesized with new ids. notifyArgs = generateMotionArgs(ACTION_HOVER_MOVE, AINPUT_SOURCE_STYLUS, ADISPLAY_ID_DEFAULT, {PointF{150, 50}}); mDispatcher->notifyMotion(notifyArgs); const MotionEvent& leftExit = left->consumeMotionEvent( AllOf(WithMotionAction(ACTION_HOVER_EXIT), Not(WithEventId(notifyArgs.id)), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); right->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_ENTER), Not(WithEventId(notifyArgs.id)), Not(WithEventId(leftExit.getId())), WithEventIdSource(IdGenerator::Source::INPUT_DISPATCHER))); spy->consumeMotionEvent(AllOf(WithMotionAction(ACTION_HOVER_MOVE), WithEventId(notifyArgs.id))); } class InputDispatcherFallbackKeyTest : public InputDispatcherTest { protected: std::shared_ptr<FakeApplicationHandle> mApp; Loading
services/inputflinger/tests/TestEventMatchers.h +65 −0 Original line number Diff line number Diff line Loading @@ -492,6 +492,71 @@ inline WithKeyCodeMatcher WithKeyCode(int32_t keyCode) { return WithKeyCodeMatcher(keyCode); } /// EventId class WithEventIdMatcher { public: using is_gtest_matcher = void; explicit WithEventIdMatcher(int32_t eventId) : mEventId(eventId) {} bool MatchAndExplain(const NotifyMotionArgs& args, std::ostream*) const { return mEventId == args.id; } bool MatchAndExplain(const NotifyKeyArgs& args, std::ostream*) const { return mEventId == args.id; } bool MatchAndExplain(const InputEvent& event, std::ostream*) const { return mEventId == event.getId(); } void DescribeTo(std::ostream* os) const { *os << "with eventId 0x" << std::hex << mEventId; } void DescribeNegationTo(std::ostream* os) const { *os << "with eventId not equal to 0x" << std::hex << mEventId; } private: const int32_t mEventId; }; inline WithEventIdMatcher WithEventId(int32_t eventId) { return WithEventIdMatcher(eventId); } /// EventIdSource class WithEventIdSourceMatcher { public: using is_gtest_matcher = void; explicit WithEventIdSourceMatcher(IdGenerator::Source eventIdSource) : mEventIdSource(eventIdSource) {} bool MatchAndExplain(const NotifyMotionArgs& args, std::ostream*) const { return mEventIdSource == IdGenerator::getSource(args.id); } bool MatchAndExplain(const NotifyKeyArgs& args, std::ostream*) const { return mEventIdSource == IdGenerator::getSource(args.id); } bool MatchAndExplain(const InputEvent& event, std::ostream*) const { return mEventIdSource == IdGenerator::getSource(event.getId()); } void DescribeTo(std::ostream* os) const { *os << "with eventId from source 0x" << std::hex << ftl::to_underlying(mEventIdSource); } void DescribeNegationTo(std::ostream* os) const { *os << "wrong event from source"; } private: const IdGenerator::Source mEventIdSource; }; inline WithEventIdSourceMatcher WithEventIdSource(IdGenerator::Source eventIdSource) { return WithEventIdSourceMatcher(eventIdSource); } MATCHER_P(WithRepeatCount, repeatCount, "KeyEvent with specified repeat count") { return arg.getRepeatCount() == repeatCount; } Loading