aboutsummaryrefslogtreecommitdiff
path: root/pw_fuzzer/examples/fuzztest/metrics.h
diff options
context:
space:
mode:
Diffstat (limited to 'pw_fuzzer/examples/fuzztest/metrics.h')
-rw-r--r--pw_fuzzer/examples/fuzztest/metrics.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/pw_fuzzer/examples/fuzztest/metrics.h b/pw_fuzzer/examples/fuzztest/metrics.h
new file mode 100644
index 000000000..9026ffa71
--- /dev/null
+++ b/pw_fuzzer/examples/fuzztest/metrics.h
@@ -0,0 +1,90 @@
+// 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 <cstddef>
+#include <cstdint>
+#include <functional>
+#include <optional>
+#include <span>
+#include <string_view>
+
+#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<kMaxNameLen> 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<Metric::Value> 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<Metric>& GetMetrics() const;
+
+ // Replaces the current mapping of names to keys.
+ Status SetMetrics(const Vector<Metric>& 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<Metric, kMaxMetrics> metrics_;
+};
+// DOCSTAG: [pwfuzzer_examples_fuzztest-metrics_h]
+
+} // namespace pw::fuzzer::examples