spellcheck_host_metrics_unittest.cc revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "chrome/browser/spellchecker/spellcheck_host_metrics.h"
6
7#include "base/basictypes.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/message_loop.h"
10#include "base/metrics/histogram.h"
11#include "base/metrics/histogram_samples.h"
12#include "base/metrics/statistics_recorder.h"
13#include "base/utf_string_conversions.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16using base::HistogramBase;
17using base::HistogramSamples;
18using base::StatisticsRecorder;
19
20class SpellcheckHostMetricsTest : public testing::Test {
21 public:
22  SpellcheckHostMetricsTest() : loop_(MessageLoop::TYPE_DEFAULT) {
23  }
24
25  virtual void SetUp() OVERRIDE {
26    base::StatisticsRecorder::Initialize();
27    metrics_.reset(new SpellCheckHostMetrics);
28  }
29
30  SpellCheckHostMetrics* metrics() { return metrics_.get(); }
31  void RecordWordCountsForTesting() { metrics_->RecordWordCounts(); }
32
33 private:
34   MessageLoop loop_;
35   scoped_ptr<SpellCheckHostMetrics> metrics_;
36};
37
38TEST_F(SpellcheckHostMetricsTest, RecordEnabledStats) {
39  scoped_ptr<HistogramSamples> baseline;
40  HistogramBase* histogram =
41      StatisticsRecorder::FindHistogram("SpellCheck.Enabled");
42  if (histogram)
43    baseline = histogram->SnapshotSamples();
44
45  metrics()->RecordEnabledStats(false);
46
47  histogram =
48      StatisticsRecorder::FindHistogram("SpellCheck.Enabled");
49  ASSERT_TRUE(histogram != NULL);
50  scoped_ptr<HistogramSamples> samples(histogram->SnapshotSamples());
51  if (baseline.get())
52    samples->Subtract(*baseline);
53  EXPECT_EQ(1, samples->GetCount(0));
54  EXPECT_EQ(0, samples->GetCount(1));
55
56  baseline.reset(samples.release());
57
58  metrics()->RecordEnabledStats(true);
59
60  histogram =
61      StatisticsRecorder::FindHistogram("SpellCheck.Enabled");
62  ASSERT_TRUE(histogram != NULL);
63  samples = histogram->SnapshotSamples();
64  samples->Subtract(*baseline);
65  EXPECT_EQ(0, samples->GetCount(0));
66  EXPECT_EQ(1, samples->GetCount(1));
67}
68
69TEST_F(SpellcheckHostMetricsTest, CustomWordStats) {
70  SpellCheckHostMetrics::RecordCustomWordCountStats(123);
71
72  HistogramBase* histogram =
73      StatisticsRecorder::FindHistogram("SpellCheck.CustomWords");
74  ASSERT_TRUE(histogram != NULL);
75  scoped_ptr<HistogramSamples> baseline = histogram->SnapshotSamples();
76
77  SpellCheckHostMetrics::RecordCustomWordCountStats(23);
78  histogram =
79      StatisticsRecorder::FindHistogram("SpellCheck.CustomWords");
80  ASSERT_TRUE(histogram != NULL);
81  scoped_ptr<HistogramSamples> samples = histogram->SnapshotSamples();
82
83  samples->Subtract(*baseline);
84  EXPECT_EQ(23,samples->sum());
85}
86
87TEST_F(SpellcheckHostMetricsTest, RecordWordCountsDiscardsDuplicates) {
88  // This test ensures that RecordWordCounts only records metrics if they
89  // have changed from the last invocation.
90  const char* histogramName[] = {
91    "SpellCheck.CheckedWords",
92    "SpellCheck.MisspelledWords",
93    "SpellCheck.ReplacedWords",
94    "SpellCheck.UniqueWords",
95    "SpellCheck.ShownSuggestions"
96  };
97
98  // Ensure all histograms exist.
99  metrics()->RecordCheckedWordStats(string16(ASCIIToUTF16("test")), false);
100  RecordWordCountsForTesting();
101
102  // Get baselines for all affected histograms.
103  scoped_ptr<HistogramSamples> baselines[arraysize(histogramName)];
104  for (size_t i = 0; i < arraysize(histogramName); ++i) {
105    HistogramBase* histogram =
106        StatisticsRecorder::FindHistogram(histogramName[i]);
107    if (histogram)
108      baselines[i] = histogram->SnapshotSamples();
109  }
110
111  // Nothing changed, so this invocation should not affect any histograms.
112  RecordWordCountsForTesting();
113
114  // Get samples for all affected histograms.
115  scoped_ptr<HistogramSamples> samples[arraysize(histogramName)];
116  for (size_t i = 0; i < arraysize(histogramName); ++i) {
117    HistogramBase* histogram =
118        StatisticsRecorder::FindHistogram(histogramName[i]);
119    ASSERT_TRUE(histogram != NULL);
120    samples[i] = histogram->SnapshotSamples();
121    if (baselines[i].get())
122      samples[i]->Subtract(*baselines[i]);
123
124    EXPECT_EQ(0, samples[i]->TotalCount());
125  }
126}
127
128TEST_F(SpellcheckHostMetricsTest, RecordSpellingServiceStats) {
129  const char kMetricName[] = "SpellCheck.SpellingService.Enabled";
130  scoped_ptr<HistogramSamples> baseline;
131  HistogramBase* histogram = StatisticsRecorder::FindHistogram(kMetricName);
132  if (histogram)
133    baseline = histogram->SnapshotSamples();
134
135  metrics()->RecordSpellingServiceStats(false);
136
137  histogram =
138      StatisticsRecorder::FindHistogram(kMetricName);
139  ASSERT_TRUE(histogram != NULL);
140  scoped_ptr<HistogramSamples> samples(histogram->SnapshotSamples());
141  if (baseline.get())
142    samples->Subtract(*baseline);
143  EXPECT_EQ(1, samples->GetCount(0));
144  EXPECT_EQ(0, samples->GetCount(1));
145
146  baseline.reset(samples.release());
147
148  metrics()->RecordSpellingServiceStats(true);
149
150  histogram =
151      StatisticsRecorder::FindHistogram(kMetricName);
152  ASSERT_TRUE(histogram != NULL);
153  samples = histogram->SnapshotSamples();
154  samples->Subtract(*baseline);
155  EXPECT_EQ(0, samples->GetCount(0));
156  EXPECT_EQ(1, samples->GetCount(1));
157}
158