1*61c4878aSAndroid Build Coastguard Worker // Copyright 2020 The Pigweed Authors 2*61c4878aSAndroid Build Coastguard Worker // 3*61c4878aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License"); you may not 4*61c4878aSAndroid Build Coastguard Worker // use this file except in compliance with the License. You may obtain a copy of 5*61c4878aSAndroid Build Coastguard Worker // the License at 6*61c4878aSAndroid Build Coastguard Worker // 7*61c4878aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0 8*61c4878aSAndroid Build Coastguard Worker // 9*61c4878aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software 10*61c4878aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 11*61c4878aSAndroid Build Coastguard Worker // WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 12*61c4878aSAndroid Build Coastguard Worker // License for the specific language governing permissions and limitations under 13*61c4878aSAndroid Build Coastguard Worker // the License. 14*61c4878aSAndroid Build Coastguard Worker #pragma once 15*61c4878aSAndroid Build Coastguard Worker 16*61c4878aSAndroid Build Coastguard Worker #include <cstddef> 17*61c4878aSAndroid Build Coastguard Worker #include <cstdint> 18*61c4878aSAndroid Build Coastguard Worker #include <functional> 19*61c4878aSAndroid Build Coastguard Worker #include <optional> 20*61c4878aSAndroid Build Coastguard Worker #include <span> 21*61c4878aSAndroid Build Coastguard Worker #include <string_view> 22*61c4878aSAndroid Build Coastguard Worker 23*61c4878aSAndroid Build Coastguard Worker #include "pw_bytes/span.h" 24*61c4878aSAndroid Build Coastguard Worker #include "pw_containers/vector.h" 25*61c4878aSAndroid Build Coastguard Worker #include "pw_status/status.h" 26*61c4878aSAndroid Build Coastguard Worker #include "pw_status/status_with_size.h" 27*61c4878aSAndroid Build Coastguard Worker #include "pw_string/string.h" 28*61c4878aSAndroid Build Coastguard Worker 29*61c4878aSAndroid Build Coastguard Worker namespace pw::fuzzer::examples { 30*61c4878aSAndroid Build Coastguard Worker 31*61c4878aSAndroid Build Coastguard Worker // DOCSTAG: [pwfuzzer_examples_fuzztest-metrics_h] 32*61c4878aSAndroid Build Coastguard Worker // Represent a named value. In order to transmit these values efficiently, they 33*61c4878aSAndroid Build Coastguard Worker // can be referenced by fixed length, generated keys instead of names. 34*61c4878aSAndroid Build Coastguard Worker struct Metric { 35*61c4878aSAndroid Build Coastguard Worker using Key = uint16_t; 36*61c4878aSAndroid Build Coastguard Worker using Value = uint32_t; 37*61c4878aSAndroid Build Coastguard Worker 38*61c4878aSAndroid Build Coastguard Worker static constexpr size_t kMaxNameLen = 32; 39*61c4878aSAndroid Build Coastguard Worker 40*61c4878aSAndroid Build Coastguard Worker Metric() = default; 41*61c4878aSAndroid Build Coastguard Worker Metric(std::string_view name_, Value value_); 42*61c4878aSAndroid Build Coastguard Worker 43*61c4878aSAndroid Build Coastguard Worker InlineString<kMaxNameLen> name; 44*61c4878aSAndroid Build Coastguard Worker Key key = 0; 45*61c4878aSAndroid Build Coastguard Worker Value value = 0; 46*61c4878aSAndroid Build Coastguard Worker }; 47*61c4878aSAndroid Build Coastguard Worker 48*61c4878aSAndroid Build Coastguard Worker // Represents a set of measurements from a particular source. 49*61c4878aSAndroid Build Coastguard Worker // 50*61c4878aSAndroid Build Coastguard Worker // In order to transmit metrics efficiently, the names of metrics are hashed 51*61c4878aSAndroid Build Coastguard Worker // internally into fixed length keys. The names can be shared once via `GetKeys` 52*61c4878aSAndroid Build Coastguard Worker // and `SetKeys`, after which metrics can be efficiently shared via `Serialize` 53*61c4878aSAndroid Build Coastguard Worker // and `Deserialize`. 54*61c4878aSAndroid Build Coastguard Worker class Metrics { 55*61c4878aSAndroid Build Coastguard Worker public: 56*61c4878aSAndroid Build Coastguard Worker static constexpr size_t kMaxMetrics = 32; 57*61c4878aSAndroid Build Coastguard Worker static constexpr size_t kMaxSerializedSize = 58*61c4878aSAndroid Build Coastguard Worker sizeof(size_t) + 59*61c4878aSAndroid Build Coastguard Worker kMaxMetrics * (sizeof(Metric::Key) + sizeof(Metric::Value)); 60*61c4878aSAndroid Build Coastguard Worker 61*61c4878aSAndroid Build Coastguard Worker // Retrieves the value of a named metric and stores it in `out_value`. The 62*61c4878aSAndroid Build Coastguard Worker // name must consist of printable ASCII characters. Returns false if the named 63*61c4878aSAndroid Build Coastguard Worker // metric was not `Set` or `Import`ed. 64*61c4878aSAndroid Build Coastguard Worker std::optional<Metric::Value> GetValue(std::string_view name) const; 65*61c4878aSAndroid Build Coastguard Worker 66*61c4878aSAndroid Build Coastguard Worker // Sets the value of a named metric. The name must consist of printable ASCII 67*61c4878aSAndroid Build Coastguard Worker // characters, and will be added to the mapping of names to keys. 68*61c4878aSAndroid Build Coastguard Worker Status SetValue(std::string_view name, Metric::Value value); 69*61c4878aSAndroid Build Coastguard Worker 70*61c4878aSAndroid Build Coastguard Worker // Returns the current mapping of names to keys. 71*61c4878aSAndroid Build Coastguard Worker const Vector<Metric>& GetMetrics() const; 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Worker // Replaces the current mapping of names to keys. 74*61c4878aSAndroid Build Coastguard Worker Status SetMetrics(const Vector<Metric>& metrics); 75*61c4878aSAndroid Build Coastguard Worker 76*61c4878aSAndroid Build Coastguard Worker // Serializes this object to the given `buffer`. Does not write more bytes 77*61c4878aSAndroid Build Coastguard Worker // than `buffer.size()`. Returns the number of number of bytes written or an 78*61c4878aSAndroid Build Coastguard Worker // error if insufficient space. 79*61c4878aSAndroid Build Coastguard Worker StatusWithSize Serialize(pw::ByteSpan buffer) const; 80*61c4878aSAndroid Build Coastguard Worker 81*61c4878aSAndroid Build Coastguard Worker // Populates this object from the data in the given `buffer`. 82*61c4878aSAndroid Build Coastguard Worker // Returns whether this buffer could be deserialized. 83*61c4878aSAndroid Build Coastguard Worker Status Deserialize(pw::ConstByteSpan buffer); 84*61c4878aSAndroid Build Coastguard Worker 85*61c4878aSAndroid Build Coastguard Worker private: 86*61c4878aSAndroid Build Coastguard Worker Vector<Metric, kMaxMetrics> metrics_; 87*61c4878aSAndroid Build Coastguard Worker }; 88*61c4878aSAndroid Build Coastguard Worker // DOCSTAG: [pwfuzzer_examples_fuzztest-metrics_h] 89*61c4878aSAndroid Build Coastguard Worker 90*61c4878aSAndroid Build Coastguard Worker } // namespace pw::fuzzer::examples 91