| /* |
| * Copyright 2017 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. |
| */ |
| |
| #ifndef __VTS_PROTO_FUZZER_RUNNER_H_ |
| #define __VTS_PROTO_FUZZER_RUNNER_H_ |
| |
| #include "ProtoFuzzerStats.h" |
| #include "ProtoFuzzerUtils.h" |
| |
| #include <memory> |
| |
| namespace android { |
| namespace vts { |
| namespace fuzzer { |
| |
| // Describes a HIDL HAL interface. |
| struct IfaceDesc { |
| // VTS spec of the interface. |
| const CompSpec *comp_spec_; |
| // Handle to an interface instance. |
| std::shared_ptr<DriverBase> hal_; |
| }; |
| |
| using IfaceDescTbl = std::unordered_map<std::string, IfaceDesc>; |
| |
| // Responsible for issuing function calls to the HAL and keeps track of |
| // HAL-related information, e.g. which interfaces has been opened so far. |
| class ProtoFuzzerRunner { |
| public: |
| ProtoFuzzerRunner(const std::vector<CompSpec> &comp_specs); |
| |
| // Initializes interface descriptor table by opening the root interface. |
| void Init(const std::string &, bool); |
| // Call every API from call sequence specified by the ExecSpec. |
| void Execute(const ExecSpec &); |
| // Execute the specified interface function call. |
| void Execute(const FuncCall &); |
| // Accessor to interface descriptor table containing currently opened |
| // interfaces. |
| const IfaceDescTbl &GetOpenedIfaces() const { return opened_ifaces_; } |
| // Accessor to stats object. |
| const ProtoFuzzerStats &GetStats() const { return stats_; } |
| // Returns true iff there are opened interfaces that are untouched. |
| bool UntouchedIfaces() const { |
| return opened_ifaces_.size() > stats_.TouchedIfaces().size(); |
| } |
| |
| private: |
| // Looks up interface spec by name. |
| const CompSpec *FindCompSpec(std::string); |
| // Processes return value from a function call. |
| void ProcessReturnValue(const FuncSpec &result); |
| // Loads the interface corresponding to the given VTS spec. Interface is |
| // constructed with the given argument. |
| DriverBase *LoadInterface(const CompSpec &, uint64_t); |
| |
| // Keeps track of opened interfaces. |
| IfaceDescTbl opened_ifaces_; |
| // All loaded VTS specs indexed by name. |
| std::unordered_map<std::string, CompSpec> comp_specs_; |
| // Handle to the driver library. |
| void *driver_handle_; |
| |
| // Collects statistical information. |
| ProtoFuzzerStats stats_; |
| }; |
| |
| } // namespace fuzzer |
| } // namespace vts |
| } // namespace android |
| |
| #endif // __VTS_PROTO_FUZZER_RUNNER_H__ |