diff options
-rw-r--r-- | services/inputflinger/tests/Android.bp | 1 | ||||
-rw-r--r-- | services/inputflinger/tests/InputReader_test.cpp | 112 | ||||
-rw-r--r-- | services/inputflinger/tests/InstrumentedInputReader.cpp | 50 | ||||
-rw-r--r-- | services/inputflinger/tests/InstrumentedInputReader.h | 123 |
4 files changed, 175 insertions, 111 deletions
diff --git a/services/inputflinger/tests/Android.bp b/services/inputflinger/tests/Android.bp index 2e5bec9999..2a8b359837 100644 --- a/services/inputflinger/tests/Android.bp +++ b/services/inputflinger/tests/Android.bp @@ -48,6 +48,7 @@ cc_test { "InputProcessorConverter_test.cpp", "InputDispatcher_test.cpp", "InputReader_test.cpp", + "InstrumentedInputReader.cpp", "LatencyTracker_test.cpp", "NotifyArgs_test.cpp", "PreferStylusOverTouch_test.cpp", diff --git a/services/inputflinger/tests/InputReader_test.cpp b/services/inputflinger/tests/InputReader_test.cpp index 01539671d8..58f1e1e035 100644 --- a/services/inputflinger/tests/InputReader_test.cpp +++ b/services/inputflinger/tests/InputReader_test.cpp @@ -45,6 +45,7 @@ #include "FakeEventHub.h" #include "FakeInputReaderPolicy.h" #include "FakePointerController.h" +#include "InstrumentedInputReader.h" #include "TestConstants.h" #include "android/hardware/input/InputDeviceCountryCode.h" #include "input/DisplayViewport.h" @@ -345,117 +346,6 @@ private: } }; - -// --- InstrumentedInputReader --- - -class InstrumentedInputReader : public InputReader { - std::queue<std::shared_ptr<InputDevice>> mNextDevices; - -public: - InstrumentedInputReader(std::shared_ptr<EventHubInterface> eventHub, - const sp<InputReaderPolicyInterface>& policy, - InputListenerInterface& listener) - : InputReader(eventHub, policy, listener), mFakeContext(this) {} - - virtual ~InstrumentedInputReader() {} - - void pushNextDevice(std::shared_ptr<InputDevice> device) { mNextDevices.push(device); } - - std::shared_ptr<InputDevice> newDevice(int32_t deviceId, const std::string& name, - const std::string& location = "") { - InputDeviceIdentifier identifier; - identifier.name = name; - identifier.location = location; - int32_t generation = deviceId + 1; - return std::make_shared<InputDevice>(&mFakeContext, deviceId, generation, identifier); - } - - // Make the protected loopOnce method accessible to tests. - using InputReader::loopOnce; - -protected: - virtual std::shared_ptr<InputDevice> createDeviceLocked(int32_t eventHubId, - const InputDeviceIdentifier& identifier) - REQUIRES(mLock) { - if (!mNextDevices.empty()) { - std::shared_ptr<InputDevice> device(std::move(mNextDevices.front())); - mNextDevices.pop(); - return device; - } - return InputReader::createDeviceLocked(eventHubId, identifier); - } - - // --- FakeInputReaderContext --- - class FakeInputReaderContext : public ContextImpl { - int32_t mGlobalMetaState; - bool mUpdateGlobalMetaStateWasCalled; - int32_t mGeneration; - std::optional<nsecs_t> mRequestedTimeout; - std::vector<InputDeviceInfo> mExternalStylusDevices; - - public: - FakeInputReaderContext(InputReader* reader) - : ContextImpl(reader), - mGlobalMetaState(0), - mUpdateGlobalMetaStateWasCalled(false), - mGeneration(1) {} - - virtual ~FakeInputReaderContext() {} - - void assertUpdateGlobalMetaStateWasCalled() { - ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled) - << "Expected updateGlobalMetaState() to have been called."; - mUpdateGlobalMetaStateWasCalled = false; - } - - void setGlobalMetaState(int32_t state) { mGlobalMetaState = state; } - - uint32_t getGeneration() { return mGeneration; } - - void updateGlobalMetaState() override { - mUpdateGlobalMetaStateWasCalled = true; - ContextImpl::updateGlobalMetaState(); - } - - int32_t getGlobalMetaState() override { - return mGlobalMetaState | ContextImpl::getGlobalMetaState(); - } - - int32_t bumpGeneration() override { - mGeneration = ContextImpl::bumpGeneration(); - return mGeneration; - } - - void requestTimeoutAtTime(nsecs_t when) override { mRequestedTimeout = when; } - - void assertTimeoutWasRequested(nsecs_t when) { - ASSERT_TRUE(mRequestedTimeout) << "Expected timeout at time " << when - << " but there was no timeout requested."; - ASSERT_EQ(when, *mRequestedTimeout); - mRequestedTimeout.reset(); - } - - void assertTimeoutWasNotRequested() { - ASSERT_FALSE(mRequestedTimeout) << "Expected no timeout to have been requested," - " but one was requested at time " - << *mRequestedTimeout; - } - - void getExternalStylusDevices(std::vector<InputDeviceInfo>& outDevices) override { - outDevices = mExternalStylusDevices; - } - - void setExternalStylusDevices(std::vector<InputDeviceInfo>&& devices) { - mExternalStylusDevices = devices; - } - } mFakeContext; - - friend class InputReaderTest; - -public: - FakeInputReaderContext* getContext() { return &mFakeContext; } -}; - // --- InputReaderPolicyTest --- class InputReaderPolicyTest : public testing::Test { protected: diff --git a/services/inputflinger/tests/InstrumentedInputReader.cpp b/services/inputflinger/tests/InstrumentedInputReader.cpp new file mode 100644 index 0000000000..1f8cd12b75 --- /dev/null +++ b/services/inputflinger/tests/InstrumentedInputReader.cpp @@ -0,0 +1,50 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "InstrumentedInputReader.h" + +namespace android { + +InstrumentedInputReader::InstrumentedInputReader(std::shared_ptr<EventHubInterface> eventHub, + const sp<InputReaderPolicyInterface>& policy, + InputListenerInterface& listener) + : InputReader(eventHub, policy, listener), mFakeContext(this) {} + +void InstrumentedInputReader::pushNextDevice(std::shared_ptr<InputDevice> device) { + mNextDevices.push(device); +} + +std::shared_ptr<InputDevice> InstrumentedInputReader::newDevice(int32_t deviceId, + const std::string& name, + const std::string& location) { + InputDeviceIdentifier identifier; + identifier.name = name; + identifier.location = location; + int32_t generation = deviceId + 1; + return std::make_shared<InputDevice>(&mFakeContext, deviceId, generation, identifier); +} + +std::shared_ptr<InputDevice> InstrumentedInputReader::createDeviceLocked( + int32_t eventHubId, const InputDeviceIdentifier& identifier) REQUIRES(mLock) { + if (!mNextDevices.empty()) { + std::shared_ptr<InputDevice> device(std::move(mNextDevices.front())); + mNextDevices.pop(); + return device; + } + return InputReader::createDeviceLocked(eventHubId, identifier); +} + +} // namespace android diff --git a/services/inputflinger/tests/InstrumentedInputReader.h b/services/inputflinger/tests/InstrumentedInputReader.h new file mode 100644 index 0000000000..7f8d5562ef --- /dev/null +++ b/services/inputflinger/tests/InstrumentedInputReader.h @@ -0,0 +1,123 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include <memory> +#include <queue> +#include <string> + +#include <InputDevice.h> +#include <InputReader.h> +#include <gtest/gtest.h> +#include <utils/StrongPointer.h> + +namespace android { + +class InstrumentedInputReader : public InputReader { +public: + InstrumentedInputReader(std::shared_ptr<EventHubInterface> eventHub, + const sp<InputReaderPolicyInterface>& policy, + InputListenerInterface& listener); + virtual ~InstrumentedInputReader() {} + + void pushNextDevice(std::shared_ptr<InputDevice> device); + + std::shared_ptr<InputDevice> newDevice(int32_t deviceId, const std::string& name, + const std::string& location = ""); + + // Make the protected loopOnce method accessible to tests. + using InputReader::loopOnce; + +protected: + virtual std::shared_ptr<InputDevice> createDeviceLocked( + int32_t eventHubId, const InputDeviceIdentifier& identifier); + + class FakeInputReaderContext : public ContextImpl { + public: + FakeInputReaderContext(InputReader* reader) + : ContextImpl(reader), + mGlobalMetaState(0), + mUpdateGlobalMetaStateWasCalled(false), + mGeneration(1) {} + + virtual ~FakeInputReaderContext() {} + + void assertUpdateGlobalMetaStateWasCalled() { + ASSERT_TRUE(mUpdateGlobalMetaStateWasCalled) + << "Expected updateGlobalMetaState() to have been called."; + mUpdateGlobalMetaStateWasCalled = false; + } + + void setGlobalMetaState(int32_t state) { mGlobalMetaState = state; } + + uint32_t getGeneration() { return mGeneration; } + + void updateGlobalMetaState() override { + mUpdateGlobalMetaStateWasCalled = true; + ContextImpl::updateGlobalMetaState(); + } + + int32_t getGlobalMetaState() override { + return mGlobalMetaState | ContextImpl::getGlobalMetaState(); + } + + int32_t bumpGeneration() override { + mGeneration = ContextImpl::bumpGeneration(); + return mGeneration; + } + + void requestTimeoutAtTime(nsecs_t when) override { mRequestedTimeout = when; } + + void assertTimeoutWasRequested(nsecs_t when) { + ASSERT_TRUE(mRequestedTimeout) << "Expected timeout at time " << when + << " but there was no timeout requested."; + ASSERT_EQ(when, *mRequestedTimeout); + mRequestedTimeout.reset(); + } + + void assertTimeoutWasNotRequested() { + ASSERT_FALSE(mRequestedTimeout) << "Expected no timeout to have been requested," + " but one was requested at time " + << *mRequestedTimeout; + } + + void getExternalStylusDevices(std::vector<InputDeviceInfo>& outDevices) override { + outDevices = mExternalStylusDevices; + } + + void setExternalStylusDevices(std::vector<InputDeviceInfo>&& devices) { + mExternalStylusDevices = devices; + } + + private: + int32_t mGlobalMetaState; + bool mUpdateGlobalMetaStateWasCalled; + int32_t mGeneration; + std::optional<nsecs_t> mRequestedTimeout; + std::vector<InputDeviceInfo> mExternalStylusDevices; + } mFakeContext; + + friend class InputReaderTest; + +public: + FakeInputReaderContext* getContext() { return &mFakeContext; } + +private: + std::queue<std::shared_ptr<InputDevice>> mNextDevices; +}; + +} // namespace android |