1// Copyright 2013 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/common/translate_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::SampleCountIterator;
18using base::StatisticsRecorder;
19using base::TimeTicks;
20
21namespace {
22
23const int kTrue = 1;
24const int kFalse = 0;
25
26class MetricsRecorder {
27 public:
28  explicit MetricsRecorder(const char* key) : key_(key) {
29    StatisticsRecorder::Initialize();
30
31    HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_);
32    if (histogram)
33      base_samples_ = histogram->SnapshotSamples();
34  }
35
36  void CheckLanguage(translate::MetricsNameIndex index,
37                     int expected_not_provided,
38                     int expected_valid,
39                     int expected_invalid) {
40    ASSERT_EQ(translate::GetMetricsName(index), key_);
41
42    Snapshot();
43
44    EXPECT_EQ(expected_not_provided,
45              GetCountWithoutSnapshot(translate::LANGUAGE_NOT_PROVIDED));
46    EXPECT_EQ(expected_valid,
47              GetCountWithoutSnapshot(translate::LANGUAGE_VALID));
48    EXPECT_EQ(expected_invalid,
49              GetCountWithoutSnapshot(translate::LANGUAGE_INVALID));
50  }
51
52  void CheckLanguageVerification(int expected_cld_disabled,
53                                 int expected_cld_only,
54                                 int expected_unknown,
55                                 int expected_cld_agree,
56                                 int expected_cld_disagree,
57                                 int expected_trust_cld,
58                                 int expected_cld_complement_sub_code) {
59    ASSERT_EQ(translate::GetMetricsName(translate::UMA_LANGUAGE_VERIFICATION),
60              key_);
61
62    Snapshot();
63
64    EXPECT_EQ(
65        expected_cld_disabled,
66        GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISABLED));
67    EXPECT_EQ(
68        expected_cld_only,
69        GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_ONLY));
70    EXPECT_EQ(
71        expected_unknown,
72        GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_UNKNOWN));
73    EXPECT_EQ(
74        expected_cld_agree,
75        GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_AGREE));
76    EXPECT_EQ(
77        expected_cld_disagree,
78        GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISAGREE));
79    EXPECT_EQ(
80        expected_trust_cld,
81        GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_TRUST_CLD));
82    EXPECT_EQ(expected_cld_complement_sub_code,
83              GetCountWithoutSnapshot(
84                  translate::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE));
85  }
86
87  void CheckScheme(int expected_http, int expected_https, int expected_others) {
88    ASSERT_EQ(translate::GetMetricsName(translate::UMA_PAGE_SCHEME), key_);
89
90    Snapshot();
91
92    EXPECT_EQ(expected_http, GetCountWithoutSnapshot(translate::SCHEME_HTTP));
93    EXPECT_EQ(expected_https, GetCountWithoutSnapshot(translate::SCHEME_HTTPS));
94    EXPECT_EQ(expected_others,
95              GetCountWithoutSnapshot(translate::SCHEME_OTHERS));
96  }
97
98  void CheckTotalCount(int count) {
99    Snapshot();
100    EXPECT_EQ(count, GetTotalCount());
101  }
102
103  void CheckValueInLogs(double value) {
104    Snapshot();
105    ASSERT_TRUE(samples_.get());
106    for (scoped_ptr<SampleCountIterator> i = samples_->Iterator(); !i->Done();
107         i->Next()) {
108      HistogramBase::Sample min;
109      HistogramBase::Sample max;
110      HistogramBase::Count count;
111      i->Get(&min, &max, &count);
112      if (min <= value && value <= max && count >= 1)
113        return;
114    }
115    EXPECT_FALSE(true);
116  }
117
118  HistogramBase::Count GetCount(HistogramBase::Sample value) {
119    Snapshot();
120    return GetCountWithoutSnapshot(value);
121  }
122
123 private:
124  void Snapshot() {
125    HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_);
126    if (!histogram)
127      return;
128    samples_ = histogram->SnapshotSamples();
129  }
130
131  HistogramBase::Count GetCountWithoutSnapshot(HistogramBase::Sample value) {
132    if (!samples_.get())
133      return 0;
134    HistogramBase::Count count = samples_->GetCount(value);
135    if (!base_samples_.get())
136      return count;
137    return count - base_samples_->GetCount(value);
138  }
139
140  HistogramBase::Count GetTotalCount() {
141    if (!samples_.get())
142      return 0;
143    HistogramBase::Count count = samples_->TotalCount();
144    if (!base_samples_.get())
145      return count;
146    return count - base_samples_->TotalCount();
147  }
148
149  std::string key_;
150  scoped_ptr<HistogramSamples> base_samples_;
151  scoped_ptr<HistogramSamples> samples_;
152
153  DISALLOW_COPY_AND_ASSIGN(MetricsRecorder);
154};
155
156}  // namespace
157
158TEST(TranslateMetricsTest, ReportContentLanguage) {
159  MetricsRecorder recorder(
160      translate::GetMetricsName(translate::UMA_CONTENT_LANGUAGE));
161
162  recorder.CheckLanguage(translate::UMA_CONTENT_LANGUAGE, 0, 0, 0);
163  translate::ReportContentLanguage(std::string(), std::string());
164  recorder.CheckLanguage(translate::UMA_CONTENT_LANGUAGE, 1, 0, 0);
165  translate::ReportContentLanguage("ja_JP", "ja-JP");
166  recorder.CheckLanguage(translate::UMA_CONTENT_LANGUAGE, 1, 0, 1);
167  translate::ReportContentLanguage("en", "en");
168  recorder.CheckLanguage(translate::UMA_CONTENT_LANGUAGE, 1, 1, 1);
169}
170
171TEST(TranslateMetricsTest, ReportHtmlLang) {
172  MetricsRecorder recorder(translate::GetMetricsName(translate::UMA_HTML_LANG));
173
174  recorder.CheckLanguage(translate::UMA_HTML_LANG, 0, 0, 0);
175  translate::ReportHtmlLang(std::string(), std::string());
176  recorder.CheckLanguage(translate::UMA_HTML_LANG, 1, 0, 0);
177  translate::ReportHtmlLang("ja_JP", "ja-JP");
178  recorder.CheckLanguage(translate::UMA_HTML_LANG, 1, 0, 1);
179  translate::ReportHtmlLang("en", "en");
180  recorder.CheckLanguage(translate::UMA_HTML_LANG, 1, 1, 1);
181}
182
183TEST(TranslateMetricsTest, ReportLanguageVerification) {
184  MetricsRecorder recorder(
185      translate::GetMetricsName(translate::UMA_LANGUAGE_VERIFICATION));
186
187  recorder.CheckLanguageVerification(0, 0, 0, 0, 0, 0, 0);
188  translate::ReportLanguageVerification(
189      translate::LANGUAGE_VERIFICATION_CLD_DISABLED);
190  recorder.CheckLanguageVerification(1, 0, 0, 0, 0, 0, 0);
191  translate::ReportLanguageVerification(
192      translate::LANGUAGE_VERIFICATION_CLD_ONLY);
193  recorder.CheckLanguageVerification(1, 1, 0, 0, 0, 0, 0);
194  translate::ReportLanguageVerification(
195      translate::LANGUAGE_VERIFICATION_UNKNOWN);
196  recorder.CheckLanguageVerification(1, 1, 1, 0, 0, 0, 0);
197  translate::ReportLanguageVerification(
198      translate::LANGUAGE_VERIFICATION_CLD_AGREE);
199  recorder.CheckLanguageVerification(1, 1, 1, 1, 0, 0, 0);
200  translate::ReportLanguageVerification(
201      translate::LANGUAGE_VERIFICATION_CLD_DISAGREE);
202  recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 0, 0);
203  translate::ReportLanguageVerification(
204      translate::LANGUAGE_VERIFICATION_TRUST_CLD);
205  recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 0);
206  translate::ReportLanguageVerification(
207      translate::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE);
208  recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 1);
209}
210
211TEST(TranslateMetricsTest, ReportTimeToBeReady) {
212  MetricsRecorder recorder(
213      translate::GetMetricsName(translate::UMA_TIME_TO_BE_READY));
214  recorder.CheckTotalCount(0);
215  translate::ReportTimeToBeReady(3.14);
216  recorder.CheckValueInLogs(3.14);
217  recorder.CheckTotalCount(1);
218}
219
220TEST(TranslateMetricsTest, ReportTimeToLoad) {
221  MetricsRecorder recorder(
222      translate::GetMetricsName(translate::UMA_TIME_TO_LOAD));
223  recorder.CheckTotalCount(0);
224  translate::ReportTimeToLoad(573.0);
225  recorder.CheckValueInLogs(573.0);
226  recorder.CheckTotalCount(1);
227}
228
229TEST(TranslateMetricsTest, ReportTimeToTranslate) {
230  MetricsRecorder recorder(
231      translate::GetMetricsName(translate::UMA_TIME_TO_TRANSLATE));
232  recorder.CheckTotalCount(0);
233  translate::ReportTimeToTranslate(4649.0);
234  recorder.CheckValueInLogs(4649.0);
235  recorder.CheckTotalCount(1);
236}
237
238TEST(TranslateMetricsTest, ReportUserActionDuration) {
239  MetricsRecorder recorder(
240      translate::GetMetricsName(translate::UMA_USER_ACTION_DURATION));
241  recorder.CheckTotalCount(0);
242  TimeTicks begin = TimeTicks::Now();
243  TimeTicks end = begin + base::TimeDelta::FromSeconds(3776);
244  translate::ReportUserActionDuration(begin, end);
245  recorder.CheckValueInLogs(3776000.0);
246  recorder.CheckTotalCount(1);
247}
248
249TEST(TranslateMetricsTest, ReportPageScheme) {
250  MetricsRecorder recorder(
251      translate::GetMetricsName(translate::UMA_PAGE_SCHEME));
252  recorder.CheckScheme(0, 0, 0);
253  translate::ReportPageScheme("http");
254  recorder.CheckScheme(1, 0, 0);
255  translate::ReportPageScheme("https");
256  recorder.CheckScheme(1, 1, 0);
257  translate::ReportPageScheme("ftp");
258  recorder.CheckScheme(1, 1, 1);
259}
260
261TEST(TranslateMetricsTest, ReportSimilarLanguageMatch) {
262  MetricsRecorder recorder(
263      translate::GetMetricsName(translate::UMA_SIMILAR_LANGUAGE_MATCH));
264  recorder.CheckTotalCount(0);
265  EXPECT_EQ(0, recorder.GetCount(kTrue));
266  EXPECT_EQ(0, recorder.GetCount(kFalse));
267  translate::ReportSimilarLanguageMatch(true);
268  EXPECT_EQ(1, recorder.GetCount(kTrue));
269  EXPECT_EQ(0, recorder.GetCount(kFalse));
270  translate::ReportSimilarLanguageMatch(false);
271  EXPECT_EQ(1, recorder.GetCount(kTrue));
272  EXPECT_EQ(1, recorder.GetCount(kFalse));
273}
274
275TEST(TranslateMetricsTest, ReportLanguageDetectionTime) {
276  MetricsRecorder recorder(
277      translate::GetMetricsName(translate::UMA_LANGUAGE_DETECTION));
278  recorder.CheckTotalCount(0);
279  TimeTicks begin = TimeTicks::Now();
280  TimeTicks end = begin + base::TimeDelta::FromMicroseconds(9009);
281  translate::ReportLanguageDetectionTime(begin, end);
282  recorder.CheckValueInLogs(9.009);
283  recorder.CheckTotalCount(1);
284}
285