| /* |
| * Copyright 2020 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 <InputDevice.h> |
| #include <InputMapper.h> |
| #include <InputReader.h> |
| #include <MapperHelpers.h> |
| #include <fuzzer/FuzzedDataProvider.h> |
| |
| namespace android { |
| |
| class FuzzContainer { |
| int32_t meventID; |
| std::shared_ptr<FuzzEventHub> mFuzzEventHub; |
| sp<FuzzInputReaderPolicy> mFuzzPolicy; |
| sp<FuzzInputListener> mFuzzListener; |
| std::unique_ptr<FuzzInputReaderContext> mFuzzContext; |
| std::unique_ptr<InputDevice> mFuzzDevice; |
| InputReaderConfiguration mPolicyConfig; |
| std::shared_ptr<FuzzedDataProvider> fdp; |
| |
| public: |
| FuzzContainer(std::shared_ptr<FuzzedDataProvider> fdp) : fdp(fdp) { |
| // Setup parameters. |
| std::string deviceName = fdp->ConsumeRandomLengthString(16); |
| std::string deviceLocation = fdp->ConsumeRandomLengthString(12); |
| int32_t deviceID = fdp->ConsumeIntegralInRange<int32_t>(0, 5); |
| int32_t deviceGeneration = fdp->ConsumeIntegralInRange<int32_t>(0, 5); |
| meventID = fdp->ConsumeIntegral<int32_t>(); |
| |
| // Create mocked objects. |
| mFuzzEventHub = std::make_shared<FuzzEventHub>(fdp); |
| mFuzzPolicy = new FuzzInputReaderPolicy(fdp); |
| mFuzzListener = new FuzzInputListener(); |
| mFuzzContext = std::make_unique<FuzzInputReaderContext>(mFuzzEventHub, mFuzzPolicy, |
| mFuzzListener, fdp); |
| |
| InputDeviceIdentifier identifier; |
| identifier.name = deviceName; |
| identifier.location = deviceLocation; |
| mFuzzDevice = std::make_unique<InputDevice>(mFuzzContext.get(), deviceID, deviceGeneration, |
| identifier); |
| mFuzzPolicy->getReaderConfiguration(&mPolicyConfig); |
| } |
| |
| ~FuzzContainer() {} |
| |
| void configureDevice() { |
| nsecs_t arbitraryTime = fdp->ConsumeIntegral<nsecs_t>(); |
| mFuzzDevice->configure(arbitraryTime, &mPolicyConfig, 0); |
| mFuzzDevice->reset(arbitraryTime); |
| } |
| |
| void addProperty(const String8& key, const String8& value) { |
| mFuzzEventHub->addProperty(key, value); |
| configureDevice(); |
| } |
| |
| InputReaderConfiguration& getPolicyConfig() { return mPolicyConfig; } |
| |
| template <class T, typename... Args> |
| T& getMapper(Args... args) { |
| T& mapper = mFuzzDevice->addMapper<T>(fdp->ConsumeIntegral<int32_t>(), args...); |
| configureDevice(); |
| return mapper; |
| } |
| }; |
| |
| } // namespace android |