1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_LIBARTBASE_BASE_METRICS_METRICS_TEST_H_
18 #define ART_LIBARTBASE_BASE_METRICS_METRICS_TEST_H_
19 
20 #include "metrics.h"
21 
22 #pragma clang diagnostic push
23 #pragma clang diagnostic error "-Wconversion"
24 
25 namespace art {
26 namespace metrics {
27 namespace test {
28 
29 // This namespace contains functions that are helpful for testing metrics but should not be used in
30 // production code.
31 
32 // A trivial MetricsBackend that does nothing for all of the members. This can be overridden by
33 // test cases to test specific behaviors.
34 class TestBackendBase : public MetricsBackend {
35  public:
36   void BeginOrUpdateSession([[maybe_unused]] const SessionData& session_data) override {}
37 
38   void BeginReport([[maybe_unused]] uint64_t timestamp_since_start_ms) override {}
39 
40   void ReportCounter([[maybe_unused]] DatumId counter_type,
41                      [[maybe_unused]] uint64_t value) override {}
42 
43   void ReportHistogram([[maybe_unused]] DatumId histogram_type,
44                        [[maybe_unused]] int64_t low_value_,
45                        [[maybe_unused]] int64_t high_value,
46                        [[maybe_unused]] const std::vector<uint32_t>& buckets) override {}
47 
48   void EndReport() override {}
49 };
50 
51 template <typename MetricType>
52 uint64_t CounterValue(const MetricType& counter) {
53   uint64_t counter_value{0};
54   struct CounterBackend : public TestBackendBase {
55     explicit CounterBackend(uint64_t* counter_value) : counter_value_{counter_value} {}
56 
57     void ReportCounter(DatumId, uint64_t value) override { *counter_value_ = value; }
58 
59     uint64_t* counter_value_;
60   } backend{&counter_value};
61   counter.Report(&backend);
62   return counter_value;
63 }
64 
65 template <DatumId histogram_type, size_t num_buckets, int64_t low_value, int64_t high_value>
66 std::vector<uint32_t> GetBuckets(
67     const MetricsHistogram<histogram_type, num_buckets, low_value, high_value>& histogram) {
68   std::vector<uint32_t> buckets;
69   struct HistogramBackend : public TestBackendBase {
70     explicit HistogramBackend(std::vector<uint32_t>* buckets) : buckets_{buckets} {}
71 
72     void ReportHistogram(DatumId, int64_t, int64_t, const std::vector<uint32_t>& buckets) override {
73       *buckets_ = buckets;
74     }
75 
76     std::vector<uint32_t>* buckets_;
77   } backend{&buckets};
78   histogram.Report(&backend);
79   return buckets;
80 }
81 
82 }  // namespace test
83 }  // namespace metrics
84 }  // namespace art
85 
86 #pragma clang diagnostic pop  // -Wconversion
87 
88 #endif  // ART_LIBARTBASE_BASE_METRICS_METRICS_TEST_H_
89