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
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101

content / browser / metrics / histograms_monitor_unittest.cc [blame]

// 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.

#include "content/browser/metrics/histograms_monitor.h"

#include "base/metrics/histogram_macros.h"
#include "base/metrics/statistics_recorder.h"
#include "content/public/test/browser_task_environment.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace content {

class HistogramsMonitorTest : public testing::Test {
 public:
  HistogramsMonitorTest()
      : task_environment_(BrowserTaskEnvironment::IO_MAINLOOP) {}
  content::BrowserTaskEnvironment task_environment_;
};

TEST_F(HistogramsMonitorTest, StartMonitoringThenGetDiff) {
  base::StatisticsRecorder::ForgetHistogramForTesting("MonitorHistogram1");
  base::StatisticsRecorder::ForgetHistogramForTesting("MonitorHistogram2");
  base::HistogramBase* histogram1 = base::Histogram::FactoryGet(
      "MonitorHistogram1", 1, 1000, 10, base::HistogramBase::kNoFlags);
  histogram1->Add(30);
  HistogramsMonitor monitor;
  monitor.StartMonitoring(/*query=*/"");

  // Get diff immediately should return nothing.
  base::Value::List diff = monitor.GetDiff();
  ASSERT_EQ(diff.size(), 0ull);

  // Add more data to histogram.
  histogram1->Add(30);
  histogram1->Add(40);

  diff = monitor.GetDiff();
  ASSERT_EQ(diff.size(), 1ull);
  std::string* header1 = diff[0].GetDict().FindString("header");
  EXPECT_EQ(*header1,
            "Histogram: MonitorHistogram1 recorded 2 samples, mean = 35.0");

  // Add another histogram
  base::HistogramBase* histogram2 = base::Histogram::FactoryGet(
      "MonitorHistogram2", 1, 1000, 10, base::HistogramBase::kNoFlags);
  histogram2->Add(50);
  diff = monitor.GetDiff();
  ASSERT_EQ(diff.size(), 2ull);
  std::string* header2 = diff[1].GetDict().FindString("header");
  EXPECT_EQ(*header2,
            "Histogram: MonitorHistogram2 recorded 1 samples, mean = 50.0");
}

TEST_F(HistogramsMonitorTest, StartMonitoringWithQueryThenGetDiff) {
  base::StatisticsRecorder::ForgetHistogramForTesting("MonitorHistogram1");
  base::StatisticsRecorder::ForgetHistogramForTesting("MonitorHistogram2");
  base::HistogramBase* histogram1 = base::Histogram::FactoryGet(
      "MonitorHistogram1", 1, 1000, 10, base::HistogramBase::kNoFlags);
  histogram1->Add(30);
  HistogramsMonitor monitor;
  monitor.StartMonitoring(/*query=*/"MonitorHistogram1");

  base::HistogramBase* histogram2 = base::Histogram::FactoryGet(
      "MonitorHistogram2", 1, 1000, 10, base::HistogramBase::kNoFlags);
  histogram2->Add(50);
  base::Value::List diff = monitor.GetDiff();
  ASSERT_EQ(diff.size(), 0ull);
}

TEST_F(HistogramsMonitorTest, CaseInsensitiveQuery) {
  base::StatisticsRecorder::ForgetHistogramForTesting("MonitorHistogram1");
  base::StatisticsRecorder::ForgetHistogramForTesting("MonitorHistogram2");

  base::HistogramBase* histogram1 = base::Histogram::FactoryGet(
      "MonitorHistogram1", 1, 1000, 10, base::HistogramBase::kNoFlags);
  histogram1->Add(30);

  HistogramsMonitor monitor;
  monitor.StartMonitoring(/*query=*/"histogram1");

  base::HistogramBase* histogram2 = base::Histogram::FactoryGet(
      "MonitorHistogram2", 1, 1000, 10, base::HistogramBase::kNoFlags);
  histogram2->Add(50);

  // The query shouldn't match "MonitorHistogram2".
  base::Value::List diff = monitor.GetDiff();
  ASSERT_EQ(diff.size(), 0ull);

  histogram1->Add(10);

  // The query should match "MonitorHistogram1", since it's case insensitive.
  diff = monitor.GetDiff();
  ASSERT_EQ(diff.size(), 1ull);
  std::string* header2 = diff[0].GetDict().FindString("header");
  EXPECT_EQ(*header2,
            "Histogram: MonitorHistogram1 recorded 1 samples, mean = 10.0");
}

}  // namespace content