/* * 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 #include #include #include namespace android { class FuzzContainer { std::shared_ptr mFuzzEventHub; sp mFuzzPolicy; FuzzInputListener mFuzzListener; std::unique_ptr mFuzzContext; std::unique_ptr mFuzzDevice; InputReaderConfiguration mPolicyConfig; std::shared_ptr mFdp; public: FuzzContainer(std::shared_ptr fdp) : mFdp(fdp) { // Setup parameters. std::string deviceName = mFdp->ConsumeRandomLengthString(16); std::string deviceLocation = mFdp->ConsumeRandomLengthString(12); int32_t deviceID = mFdp->ConsumeIntegralInRange(0, 5); int32_t deviceGeneration = mFdp->ConsumeIntegralInRange(/*from*/ 0, /*to*/ 5); // Create mocked objects. mFuzzEventHub = std::make_shared(mFdp); mFuzzPolicy = sp::make(mFdp); mFuzzContext = std::make_unique(mFuzzEventHub, mFuzzPolicy, mFuzzListener, mFdp); InputDeviceIdentifier identifier; identifier.name = deviceName; identifier.location = deviceLocation; mFuzzDevice = std::make_unique(mFuzzContext.get(), deviceID, deviceGeneration, identifier); mFuzzPolicy->getReaderConfiguration(&mPolicyConfig); } ~FuzzContainer() {} void configureDevice() { nsecs_t arbitraryTime = mFdp->ConsumeIntegral(); std::list out; out += mFuzzDevice->configure(arbitraryTime, mPolicyConfig, /*changes=*/{}); out += mFuzzDevice->reset(arbitraryTime); for (const NotifyArgs& args : out) { mFuzzListener.notify(args); } } void addProperty(std::string key, std::string value) { mFuzzEventHub->addProperty(key, value); configureDevice(); } InputReaderConfiguration& getPolicyConfig() { return mPolicyConfig; } template T& getMapper(Args... args) { int32_t eventhubId = mFdp->ConsumeIntegral(); // ensure a device entry exists for this eventHubId mFuzzDevice->addEmptyEventHubDevice(eventhubId); configureDevice(); return mFuzzDevice->template constructAndAddMapper(eventhubId, args...); } }; } // namespace android