// Copyright 2020 The Pigweed Authors // // 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 // // https://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 #include #include #include "pw_bytes/span.h" #include "pw_containers/vector.h" #include "pw_status/status.h" #include "pw_status/status_with_size.h" #include "pw_string/string.h" namespace pw::fuzzer::examples { // DOCSTAG: [pwfuzzer_examples_fuzztest-metrics_h] // Represent a named value. In order to transmit these values efficiently, they // can be referenced by fixed length, generated keys instead of names. struct Metric { using Key = uint16_t; using Value = uint32_t; static constexpr size_t kMaxNameLen = 32; Metric() = default; Metric(std::string_view name_, Value value_); InlineString name; Key key = 0; Value value = 0; }; // Represents a set of measurements from a particular source. // // In order to transmit metrics efficiently, the names of metrics are hashed // internally into fixed length keys. The names can be shared once via `GetKeys` // and `SetKeys`, after which metrics can be efficiently shared via `Serialize` // and `Deserialize`. class Metrics { public: static constexpr size_t kMaxMetrics = 32; static constexpr size_t kMaxSerializedSize = sizeof(size_t) + kMaxMetrics * (sizeof(Metric::Key) + sizeof(Metric::Value)); // Retrieves the value of a named metric and stores it in `out_value`. The // name must consist of printable ASCII characters. Returns false if the named // metric was not `Set` or `Import`ed. std::optional GetValue(std::string_view name) const; // Sets the value of a named metric. The name must consist of printable ASCII // characters, and will be added to the mapping of names to keys. Status SetValue(std::string_view name, Metric::Value value); // Returns the current mapping of names to keys. const Vector& GetMetrics() const; // Replaces the current mapping of names to keys. Status SetMetrics(const Vector& metrics); // Serializes this object to the given `buffer`. Does not write more bytes // than `buffer.size()`. Returns the number of number of bytes written or an // error if insufficient space. StatusWithSize Serialize(pw::ByteSpan buffer) const; // Populates this object from the data in the given `buffer`. // Returns whether this buffer could be deserialized. Status Deserialize(pw::ConstByteSpan buffer); private: Vector metrics_; }; // DOCSTAG: [pwfuzzer_examples_fuzztest-metrics_h] } // namespace pw::fuzzer::examples