1// Copyright 2014 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 "components/translate/core/browser/translate_browser_metrics.h"
6
7#include "base/basictypes.h"
8#include "base/memory/scoped_ptr.h"
9#include "base/metrics/histogram.h"
10#include "base/metrics/histogram_samples.h"
11#include "base/metrics/statistics_recorder.h"
12#include "testing/gtest/include/gtest/gtest.h"
13#include "testing/platform_test.h"
14
15using base::HistogramBase;
16using base::HistogramSamples;
17using base::StatisticsRecorder;
18
19namespace {
20
21class MetricsRecorder {
22 public:
23  explicit MetricsRecorder(const char* key) : key_(key) {
24    StatisticsRecorder::Initialize();
25
26    HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_);
27    if (histogram)
28      base_samples_ = histogram->SnapshotSamples();
29  }
30
31  void CheckInitiationStatus(int expected_disabled_by_prefs,
32                             int expected_disabled_by_switch,
33                             int expected_disabled_by_config,
34                             int expected_language_is_not_supported,
35                             int expected_mime_type_is_not_supported,
36                             int expected_url_is_not_supported,
37                             int expected_similar_languages,
38                             int expected_accept_languages,
39                             int expected_auto_by_config,
40                             int expected_auto_by_link,
41                             int expected_show_infobar) {
42    Snapshot();
43
44    EXPECT_EQ(expected_disabled_by_prefs,
45              GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
46                                          INITIATION_STATUS_DISABLED_BY_PREFS));
47    EXPECT_EQ(
48        expected_disabled_by_switch,
49        GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
50                                    INITIATION_STATUS_DISABLED_BY_SWITCH));
51    EXPECT_EQ(
52        expected_disabled_by_config,
53        GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
54                                    INITIATION_STATUS_DISABLED_BY_CONFIG));
55    EXPECT_EQ(expected_language_is_not_supported,
56              GetCountWithoutSnapshot(
57                  translate::TranslateBrowserMetrics::
58                      INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED));
59    EXPECT_EQ(expected_mime_type_is_not_supported,
60              GetCountWithoutSnapshot(
61                  translate::TranslateBrowserMetrics::
62                      INITIATION_STATUS_MIME_TYPE_IS_NOT_SUPPORTED));
63    EXPECT_EQ(
64        expected_url_is_not_supported,
65        GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
66                                    INITIATION_STATUS_URL_IS_NOT_SUPPORTED));
67    EXPECT_EQ(expected_similar_languages,
68              GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
69                                          INITIATION_STATUS_SIMILAR_LANGUAGES));
70    EXPECT_EQ(expected_accept_languages,
71              GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
72                                          INITIATION_STATUS_ACCEPT_LANGUAGES));
73    EXPECT_EQ(expected_auto_by_config,
74              GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
75                                          INITIATION_STATUS_AUTO_BY_CONFIG));
76    EXPECT_EQ(expected_auto_by_link,
77              GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
78                                          INITIATION_STATUS_AUTO_BY_LINK));
79    EXPECT_EQ(expected_show_infobar,
80              GetCountWithoutSnapshot(translate::TranslateBrowserMetrics::
81                                          INITIATION_STATUS_SHOW_INFOBAR));
82  }
83
84  HistogramBase::Count GetTotalCount() {
85    Snapshot();
86    if (!samples_.get())
87      return 0;
88    HistogramBase::Count count = samples_->TotalCount();
89    if (!base_samples_.get())
90      return count;
91    return count - base_samples_->TotalCount();
92  }
93
94  HistogramBase::Count GetCount(HistogramBase::Sample value) {
95    Snapshot();
96    return GetCountWithoutSnapshot(value);
97  }
98
99 private:
100  void Snapshot() {
101    HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_);
102    if (!histogram)
103      return;
104    samples_ = histogram->SnapshotSamples();
105  }
106
107  HistogramBase::Count GetCountWithoutSnapshot(HistogramBase::Sample value) {
108    if (!samples_.get())
109      return 0;
110    HistogramBase::Count count = samples_->GetCount(value);
111    if (!base_samples_.get())
112      return count;
113    return count - base_samples_->GetCount(value);
114  }
115
116  std::string key_;
117  scoped_ptr<HistogramSamples> base_samples_;
118  scoped_ptr<HistogramSamples> samples_;
119
120  DISALLOW_COPY_AND_ASSIGN(MetricsRecorder);
121};
122
123}  // namespace
124
125TEST(TranslateBrowserMetricsTest, ReportInitiationStatus) {
126  MetricsRecorder recorder(translate::TranslateBrowserMetrics::GetMetricsName(
127      translate::TranslateBrowserMetrics::UMA_INITIATION_STATUS));
128
129  recorder.CheckInitiationStatus(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
130  translate::TranslateBrowserMetrics::ReportInitiationStatus(
131      translate::TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_PREFS);
132  recorder.CheckInitiationStatus(1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
133  translate::TranslateBrowserMetrics::ReportInitiationStatus(
134      translate::TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_SWITCH);
135  recorder.CheckInitiationStatus(1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0);
136  translate::TranslateBrowserMetrics::ReportInitiationStatus(
137      translate::TranslateBrowserMetrics::INITIATION_STATUS_DISABLED_BY_CONFIG);
138  recorder.CheckInitiationStatus(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0);
139  translate::TranslateBrowserMetrics::ReportInitiationStatus(
140      translate::TranslateBrowserMetrics::
141          INITIATION_STATUS_LANGUAGE_IS_NOT_SUPPORTED);
142  recorder.CheckInitiationStatus(1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0);
143  translate::TranslateBrowserMetrics::ReportInitiationStatus(
144      translate::TranslateBrowserMetrics::
145          INITIATION_STATUS_MIME_TYPE_IS_NOT_SUPPORTED);
146  recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0);
147  translate::TranslateBrowserMetrics::ReportInitiationStatus(
148      translate::TranslateBrowserMetrics::
149          INITIATION_STATUS_URL_IS_NOT_SUPPORTED);
150  recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0);
151  translate::TranslateBrowserMetrics::ReportInitiationStatus(
152      translate::TranslateBrowserMetrics::INITIATION_STATUS_SIMILAR_LANGUAGES);
153  recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0);
154  translate::TranslateBrowserMetrics::ReportInitiationStatus(
155      translate::TranslateBrowserMetrics::INITIATION_STATUS_ACCEPT_LANGUAGES);
156  recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0);
157  translate::TranslateBrowserMetrics::ReportInitiationStatus(
158      translate::TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_CONFIG);
159  recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0);
160  translate::TranslateBrowserMetrics::ReportInitiationStatus(
161      translate::TranslateBrowserMetrics::INITIATION_STATUS_AUTO_BY_LINK);
162  recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0);
163  translate::TranslateBrowserMetrics::ReportInitiationStatus(
164      translate::TranslateBrowserMetrics::INITIATION_STATUS_SHOW_INFOBAR);
165  recorder.CheckInitiationStatus(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1);
166}
167
168TEST(TranslateBrowserMetricsTest, ReportLanguageDetectionError) {
169  MetricsRecorder recorder(translate::TranslateBrowserMetrics::GetMetricsName(
170      translate::TranslateBrowserMetrics::UMA_LANGUAGE_DETECTION_ERROR));
171  EXPECT_EQ(0, recorder.GetTotalCount());
172  translate::TranslateBrowserMetrics::ReportLanguageDetectionError();
173  EXPECT_EQ(1, recorder.GetTotalCount());
174
175}
176
177
178TEST(TranslateBrowserMetricsTest, ReportedLocalesOnDisabledByPrefs) {
179  const int ENGLISH = 25966;
180
181  MetricsRecorder recorder(translate::TranslateBrowserMetrics::GetMetricsName(
182      translate::TranslateBrowserMetrics::UMA_LOCALES_ON_DISABLED_BY_PREFS));
183  EXPECT_EQ(0, recorder.GetTotalCount());
184  translate::TranslateBrowserMetrics::ReportLocalesOnDisabledByPrefs("en");
185  EXPECT_EQ(1, recorder.GetCount(ENGLISH));
186}
187
188TEST(TranslateBrowserMetricsTest, ReportedUndisplayableLanguage) {
189  const int ENGLISH = 25966;
190
191  MetricsRecorder recorder(translate::TranslateBrowserMetrics::GetMetricsName(
192      translate::TranslateBrowserMetrics::UMA_UNDISPLAYABLE_LANGUAGE));
193  EXPECT_EQ(0, recorder.GetTotalCount());
194  translate::TranslateBrowserMetrics::ReportUndisplayableLanguage("en");
195  EXPECT_EQ(1, recorder.GetCount(ENGLISH));
196}
197
198TEST(TranslateBrowserMetricsTest, ReportedUnsupportedLanguageAtInitiation) {
199  const int ENGLISH = 25966;
200
201  MetricsRecorder recorder(translate::TranslateBrowserMetrics::GetMetricsName(
202      translate::TranslateBrowserMetrics::
203          UMA_UNSUPPORTED_LANGUAGE_AT_INITIATION));
204  EXPECT_EQ(0, recorder.GetTotalCount());
205  translate::TranslateBrowserMetrics::ReportUnsupportedLanguageAtInitiation(
206      "en");
207  EXPECT_EQ(1, recorder.GetCount(ENGLISH));
208}
209