Changeset View
Changeset View
Standalone View
Standalone View
src/test/fuzz/util.h
| Show First 20 Lines • Show All 83 Lines • ▼ Show 20 Lines | ConsumeRandomLengthByteVector(FuzzedDataProvider &fuzzed_data_provider, | ||||
| static_assert(sizeof(B) == 1); | static_assert(sizeof(B) == 1); | ||||
| const std::string s = | const std::string s = | ||||
| fuzzed_data_provider.ConsumeRandomLengthString(max_length); | fuzzed_data_provider.ConsumeRandomLengthString(max_length); | ||||
| std::vector<B> ret(s.size()); | std::vector<B> ret(s.size()); | ||||
| std::copy(s.begin(), s.end(), reinterpret_cast<char *>(ret.data())); | std::copy(s.begin(), s.end(), reinterpret_cast<char *>(ret.data())); | ||||
| return ret; | return ret; | ||||
| } | } | ||||
| [[nodiscard]] inline CDataStream | [[nodiscard]] inline DataStream | ||||
| ConsumeDataStream(FuzzedDataProvider &fuzzed_data_provider, | ConsumeDataStream(FuzzedDataProvider &fuzzed_data_provider, | ||||
| const size_t max_length = 4096) noexcept { | const size_t max_length = 4096) noexcept { | ||||
| return CDataStream{ | return DataStream{ | ||||
| ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length), | ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length)}; | ||||
| SER_NETWORK, INIT_PROTO_VERSION}; | |||||
| } | } | ||||
| [[nodiscard]] inline std::vector<std::string> | [[nodiscard]] inline std::vector<std::string> | ||||
| ConsumeRandomLengthStringVector(FuzzedDataProvider &fuzzed_data_provider, | ConsumeRandomLengthStringVector(FuzzedDataProvider &fuzzed_data_provider, | ||||
| const size_t max_vector_size = 16, | const size_t max_vector_size = 16, | ||||
| const size_t max_string_length = 16) noexcept { | const size_t max_string_length = 16) noexcept { | ||||
| const size_t n_elements = | const size_t n_elements = | ||||
| fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size); | fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size); | ||||
| Show All 13 Lines | const size_t n_elements = | ||||
| fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size); | fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, max_vector_size); | ||||
| std::vector<T> r; | std::vector<T> r; | ||||
| for (size_t i = 0; i < n_elements; ++i) { | for (size_t i = 0; i < n_elements; ++i) { | ||||
| r.push_back(fuzzed_data_provider.ConsumeIntegral<T>()); | r.push_back(fuzzed_data_provider.ConsumeIntegral<T>()); | ||||
| } | } | ||||
| return r; | return r; | ||||
| } | } | ||||
| template <typename P> | |||||
| [[nodiscard]] P | |||||
| ConsumeDeserializationParams(FuzzedDataProvider &fuzzed_data_provider) noexcept; | |||||
| template <typename T, typename P> | |||||
| [[nodiscard]] std::optional<T> | |||||
| ConsumeDeserializable(FuzzedDataProvider &fuzzed_data_provider, const P ¶ms, | |||||
| const size_t max_length = 4096) noexcept { | |||||
| const std::vector<uint8_t> buffer{ | |||||
| ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length)}; | |||||
| DataStream ds{buffer}; | |||||
| T obj; | |||||
| try { | |||||
| ds >> WithParams(params, obj); | |||||
| } catch (const std::ios_base::failure &) { | |||||
| return std::nullopt; | |||||
| } | |||||
| return obj; | |||||
| } | |||||
| template <typename T> | template <typename T> | ||||
| [[nodiscard]] inline std::optional<T> | [[nodiscard]] inline std::optional<T> | ||||
| ConsumeDeserializable(FuzzedDataProvider &fuzzed_data_provider, | ConsumeDeserializable(FuzzedDataProvider &fuzzed_data_provider, | ||||
| const size_t max_length = 4096) noexcept { | const size_t max_length = 4096) noexcept { | ||||
| const std::vector<uint8_t> buffer = | const std::vector<uint8_t> buffer = | ||||
| ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length); | ConsumeRandomLengthByteVector(fuzzed_data_provider, max_length); | ||||
| CDataStream ds{buffer, SER_NETWORK, INIT_PROTO_VERSION}; | CDataStream ds{buffer, SER_NETWORK, INIT_PROTO_VERSION}; | ||||
| T obj; | T obj; | ||||
| ▲ Show 20 Lines • Show All 197 Lines • ▼ Show 20 Lines | |||||
| inline CAddress | inline CAddress | ||||
| ConsumeAddress(FuzzedDataProvider &fuzzed_data_provider) noexcept { | ConsumeAddress(FuzzedDataProvider &fuzzed_data_provider) noexcept { | ||||
| return {ConsumeService(fuzzed_data_provider), | return {ConsumeService(fuzzed_data_provider), | ||||
| ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS), | ConsumeWeakEnum(fuzzed_data_provider, ALL_SERVICE_FLAGS), | ||||
| NodeSeconds{std::chrono::seconds{ | NodeSeconds{std::chrono::seconds{ | ||||
| fuzzed_data_provider.ConsumeIntegral<uint32_t>()}}}; | fuzzed_data_provider.ConsumeIntegral<uint32_t>()}}}; | ||||
| } | } | ||||
| // TODO: move to test/fuzz/util/net.cpp when backporting core#26497 | |||||
| template <typename P> | |||||
| P ConsumeDeserializationParams( | |||||
| FuzzedDataProvider &fuzzed_data_provider) noexcept { | |||||
| constexpr std::array<CNetAddr::Encoding, 2> ADDR_ENCODINGS{{ | |||||
| CNetAddr::Encoding::V1, | |||||
| CNetAddr::Encoding::V2, | |||||
| }}; | |||||
| constexpr std::array<CAddress::Format, 2> ADDR_FORMATS{{ | |||||
| CAddress::Format::Disk, | |||||
| CAddress::Format::Network, | |||||
| }}; | |||||
| if constexpr (std::is_same_v<P, CNetAddr::SerParams>) { | |||||
| return P{fuzzed_data_provider.PickValueInArray(ADDR_ENCODINGS)}; | |||||
| } | |||||
| if constexpr (std::is_same_v<P, CAddress::SerParams>) { | |||||
| return P{{fuzzed_data_provider.PickValueInArray(ADDR_ENCODINGS)}, | |||||
| fuzzed_data_provider.PickValueInArray(ADDR_FORMATS)}; | |||||
| } | |||||
| } | |||||
| template CNetAddr::SerParams | |||||
| ConsumeDeserializationParams(FuzzedDataProvider &) noexcept; | |||||
| template CAddress::SerParams | |||||
| ConsumeDeserializationParams(FuzzedDataProvider &) noexcept; | |||||
| template <bool ReturnUniquePtr = false> | template <bool ReturnUniquePtr = false> | ||||
| auto ConsumeNode( | auto ConsumeNode( | ||||
| FuzzedDataProvider &fuzzed_data_provider, | FuzzedDataProvider &fuzzed_data_provider, | ||||
| const std::optional<NodeId> &node_id_in = std::nullopt) noexcept { | const std::optional<NodeId> &node_id_in = std::nullopt) noexcept { | ||||
| const NodeId node_id = | const NodeId node_id = | ||||
| node_id_in.value_or(fuzzed_data_provider.ConsumeIntegral<NodeId>()); | node_id_in.value_or(fuzzed_data_provider.ConsumeIntegral<NodeId>()); | ||||
| const auto sock = std::make_shared<FuzzedSock>(fuzzed_data_provider); | const auto sock = std::make_shared<FuzzedSock>(fuzzed_data_provider); | ||||
| const CAddress address = ConsumeAddress(fuzzed_data_provider); | const CAddress address = ConsumeAddress(fuzzed_data_provider); | ||||
| ▲ Show 20 Lines • Show All 247 Lines • Show Last 20 Lines | |||||