File: web_feature_histogram_tester.h

package info (click to toggle)
chromium 139.0.7258.127-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 6,122,068 kB
  • sloc: cpp: 35,100,771; ansic: 7,163,530; javascript: 4,103,002; python: 1,436,920; asm: 946,517; xml: 746,709; pascal: 187,653; perl: 88,691; sh: 88,436; objc: 79,953; sql: 51,488; cs: 44,583; fortran: 24,137; makefile: 22,147; tcl: 15,277; php: 13,980; yacc: 8,984; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (91 lines) | stat: -rw-r--r-- 3,806 bytes parent folder | download | duplicates (7)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef CHROME_TEST_BASE_WEB_FEATURE_HISTOGRAM_TESTER_H_
#define CHROME_TEST_BASE_WEB_FEATURE_HISTOGRAM_TESTER_H_

#include <map>
#include <vector>

#include "base/test/metrics/histogram_tester.h"
#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom.h"

// Returns a map containing the given `features` as keys, all mapping to zero.
std::map<blink::mojom::WebFeature, int> AllZeroFeatureCounts(
    const std::vector<blink::mojom::WebFeature>& features);

// Builds a new map by adding the value in `lhs` and `rhs` key-wise.
//
// Useful in conjunction with `AllZeroFeatureCounts()`, when building a map of
// mostly zero values with a few exceptions.
std::map<blink::mojom::WebFeature, int> AddFeatureCounts(
    const std::map<blink::mojom::WebFeature, int>& lhs,
    const std::map<blink::mojom::WebFeature, int>& rhs);

// Helper for testing `WebFeature` use counts recorded as UMA histograms.
//
// Wraps around `base::HistogramTester` and provides a simpler API centered
// around `WebFeature`s. Similarly to `base::HistogramTester`, the counts
// returned by this instance are relative diffs compared to the histogram
// values at construction time.
//
// This class publicly depends solely on content/ code, yet it is defined in
// chrome/ on purpose. Indeed, `WebFeature` use counts are recorded in UMA
// histograms by components/page_load_metrics, which sits above content/. While
// this code may compile in content/, content/ tests written against it would
// observe zero counts that never increase, because no code would be recording
// the feature use counts in histograms.
class WebFeatureHistogramTester final {
 public:
  // Takes a snapshot of counts.
  WebFeatureHistogramTester();

  WebFeatureHistogramTester(const WebFeatureHistogramTester&) = delete;
  WebFeatureHistogramTester& operator=(const WebFeatureHistogramTester&) =
      delete;

  ~WebFeatureHistogramTester();

  // Returns the current count of the given `feature`.
  // This is a diff from the snapshot taken at construction time.
  int GetCount(blink::mojom::WebFeature feature) const;

  // Returns a map of the given `features` to their corresponding count.
  // These are diffs from the snapshot taken at construction time.
  // Duplicate features are ignored.
  std::map<blink::mojom::WebFeature, int> GetCounts(
      const std::vector<blink::mojom::WebFeature>& features) const;

  // Same as `GetCounts()`, except that entries with zero counts are skipped.
  std::map<blink::mojom::WebFeature, int> GetNonZeroCounts(
      const std::vector<blink::mojom::WebFeature>& features) const;

  // Waits for the given features' counts to reach the `expected` values, then
  // returns the last observed feature counts.
  //
  // `expected` must have only non-negative values.
  //
  // As with other methods above, `expected` is compared against diffs from
  // the snapshot taken at constructon time.
  //
  // See also `AllZeroFeatureCounts()` and `AddFeatureCounts()` for help
  // building `expected`.
  std::map<blink::mojom::WebFeature, int> WaitForCountsAtLeast(
      const std::map<blink::mojom::WebFeature, int>& expected) const;

  // Equivalent to `EXPECT_EQ(WaitForCountsAtLeast(expected), expected)`.
  void ExpectCounts(
      const std::map<blink::mojom::WebFeature, int>& expected) const;

 private:
  int GetCountInternal(blink::mojom::WebFeature feature) const;

  std::map<blink::mojom::WebFeature, int> GetCountsInternal(
      const std::vector<blink::mojom::WebFeature>& features,
      bool include_zeroes) const;

  base::HistogramTester histogram_tester_;
};

#endif  // CHROME_TEST_BASE_WEB_FEATURE_HISTOGRAM_TESTER_H_