xref: /aosp_15_r20/external/pigweed/pw_fuzzer/examples/fuzztest/metrics.h (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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