diff options
author | 2023-12-15 07:13:30 +0000 | |
---|---|---|
committer | 2024-02-08 19:00:21 +0000 | |
commit | 4497c862673b25ba675d52af23df18a45c5367b3 (patch) | |
tree | 7d1c97de976f3061a9c4c69992af461bf50aeeed | |
parent | fc36472e3198d40da6adbff9d6c2f19f0e50bf43 (diff) |
InputDispatcher_test: Verify all events dispatched to windows are traced
Bug: 210460522
Test: atest inputflinger_tests
Change-Id: I8ce95c44645f8c3bee7e2eb7cfefab2dae59f6e6
-rw-r--r-- | services/inputflinger/tests/FakeInputTracingBackend.cpp | 41 | ||||
-rw-r--r-- | services/inputflinger/tests/FakeInputTracingBackend.h | 13 | ||||
-rw-r--r-- | services/inputflinger/tests/InputDispatcher_test.cpp | 5 |
3 files changed, 45 insertions, 14 deletions
diff --git a/services/inputflinger/tests/FakeInputTracingBackend.cpp b/services/inputflinger/tests/FakeInputTracingBackend.cpp index 1d2710749b..f4a06f7d28 100644 --- a/services/inputflinger/tests/FakeInputTracingBackend.cpp +++ b/services/inputflinger/tests/FakeInputTracingBackend.cpp @@ -33,18 +33,22 @@ base::ResultError<> error(const std::ostringstream& ss) { return base::ResultError(ss.str(), BAD_VALUE); } +inline auto getId(const trace::TracedEvent& v) { + return std::visit([](const auto& event) { return event.id; }, v); +} + } // namespace // --- VerifyingTrace --- -void VerifyingTrace::expectKeyDispatchTraced(const KeyEvent& event) { +void VerifyingTrace::expectKeyDispatchTraced(const KeyEvent& event, int32_t windowId) { std::scoped_lock lock(mLock); - mExpectedEvents.emplace_back(event); + mExpectedEvents.emplace_back(event, windowId); } -void VerifyingTrace::expectMotionDispatchTraced(const MotionEvent& event) { +void VerifyingTrace::expectMotionDispatchTraced(const MotionEvent& event, int32_t windowId) { std::scoped_lock lock(mLock); - mExpectedEvents.emplace_back(event); + mExpectedEvents.emplace_back(event, windowId); } void VerifyingTrace::verifyExpectedEventsTraced() { @@ -53,9 +57,9 @@ void VerifyingTrace::verifyExpectedEventsTraced() { base::Result<void> result; mEventTracedCondition.wait_for(lock, TRACE_TIMEOUT, [&]() REQUIRES(mLock) { - for (const auto& expectedEvent : mExpectedEvents) { + for (const auto& [expectedEvent, windowId] : mExpectedEvents) { std::visit([&](const auto& event) - REQUIRES(mLock) { result = verifyEventTraced(event); }, + REQUIRES(mLock) { result = verifyEventTraced(event, windowId); }, expectedEvent); if (!result.ok()) { return false; @@ -72,11 +76,13 @@ void VerifyingTrace::verifyExpectedEventsTraced() { void VerifyingTrace::reset() { std::scoped_lock lock(mLock); mTracedEvents.clear(); + mTracedWindowDispatches.clear(); mExpectedEvents.clear(); } template <typename Event> -base::Result<void> VerifyingTrace::verifyEventTraced(const Event& expectedEvent) const { +base::Result<void> VerifyingTrace::verifyEventTraced(const Event& expectedEvent, + int32_t expectedWindowId) const { std::ostringstream msg; auto tracedEventsIt = mTracedEvents.find(expectedEvent.getId()); @@ -87,6 +93,19 @@ base::Result<void> VerifyingTrace::verifyEventTraced(const Event& expectedEvent) return error(msg); } + auto tracedDispatchesIt = + std::find_if(mTracedWindowDispatches.begin(), mTracedWindowDispatches.end(), + [&](const WindowDispatchArgs& args) { + return args.windowId == expectedWindowId && + getId(args.eventEntry) == expectedEvent.getId(); + }); + if (tracedDispatchesIt == mTracedWindowDispatches.end()) { + msg << "Expected dispatch of event with ID 0x" << std::hex << expectedEvent.getId() + << " to window with ID 0x" << expectedWindowId << " to be traced, but it was not." + << "\nExpected event: " << expectedEvent; + return error(msg); + } + return {}; } @@ -108,4 +127,12 @@ void FakeInputTracingBackend::traceMotionEvent(const trace::TracedMotionEvent& e mTrace->mEventTracedCondition.notify_all(); } +void FakeInputTracingBackend::traceWindowDispatch(const WindowDispatchArgs& args) const { + { + std::scoped_lock lock(mTrace->mLock); + mTrace->mTracedWindowDispatches.push_back(args); + } + mTrace->mEventTracedCondition.notify_all(); +} + } // namespace android::inputdispatcher diff --git a/services/inputflinger/tests/FakeInputTracingBackend.h b/services/inputflinger/tests/FakeInputTracingBackend.h index e5dd5469c9..40ca3a29f8 100644 --- a/services/inputflinger/tests/FakeInputTracingBackend.h +++ b/services/inputflinger/tests/FakeInputTracingBackend.h @@ -39,10 +39,10 @@ public: VerifyingTrace() = default; /** Add an expectation for a key event to be traced. */ - void expectKeyDispatchTraced(const KeyEvent& event); + void expectKeyDispatchTraced(const KeyEvent& event, int32_t windowId); /** Add an expectation for a motion event to be traced. */ - void expectMotionDispatchTraced(const MotionEvent& event); + void expectMotionDispatchTraced(const MotionEvent& event, int32_t windowId); /** * Wait and verify that all expected events are traced. @@ -59,14 +59,17 @@ private: std::mutex mLock; std::condition_variable mEventTracedCondition; std::unordered_set<uint32_t /*eventId*/> mTracedEvents GUARDED_BY(mLock); - std::vector<std::variant<KeyEvent, MotionEvent>> mExpectedEvents GUARDED_BY(mLock); + using WindowDispatchArgs = trace::InputTracingBackendInterface::WindowDispatchArgs; + std::vector<WindowDispatchArgs> mTracedWindowDispatches GUARDED_BY(mLock); + std::vector<std::pair<std::variant<KeyEvent, MotionEvent>, int32_t /*windowId*/>> + mExpectedEvents GUARDED_BY(mLock); friend class FakeInputTracingBackend; // Helper to verify that the given event appears as expected in the trace. If the verification // fails, the error message describes why. template <typename Event> - base::Result<void> verifyEventTraced(const Event&) const REQUIRES(mLock); + base::Result<void> verifyEventTraced(const Event&, int32_t windowId) const REQUIRES(mLock); }; /** @@ -82,7 +85,7 @@ private: void traceKeyEvent(const trace::TracedKeyEvent& entry) const override; void traceMotionEvent(const trace::TracedMotionEvent& entry) const override; - void traceWindowDispatch(const WindowDispatchArgs& entry) const override {} + void traceWindowDispatch(const WindowDispatchArgs& entry) const override; }; } // namespace android::inputdispatcher diff --git a/services/inputflinger/tests/InputDispatcher_test.cpp b/services/inputflinger/tests/InputDispatcher_test.cpp index 31c7c67db5..4c455f7804 100644 --- a/services/inputflinger/tests/InputDispatcher_test.cpp +++ b/services/inputflinger/tests/InputDispatcher_test.cpp @@ -1482,11 +1482,12 @@ private: switch (event->getType()) { case InputEventType::KEY: { - gVerifyingTrace->expectKeyDispatchTraced(static_cast<KeyEvent&>(*event)); + gVerifyingTrace->expectKeyDispatchTraced(static_cast<KeyEvent&>(*event), mInfo.id); break; } case InputEventType::MOTION: { - gVerifyingTrace->expectMotionDispatchTraced(static_cast<MotionEvent&>(*event)); + gVerifyingTrace->expectMotionDispatchTraced(static_cast<MotionEvent&>(*event), + mInfo.id); break; } default: |