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.
5 #include "components/translate/common/translate_metrics.h"
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"
15 using base::HistogramBase;
16 using base::HistogramSamples;
17 using base::SampleCountIterator;
18 using base::StatisticsRecorder;
19 using base::TimeTicks;
26 class MetricsRecorder {
28 explicit MetricsRecorder(const char* key) : key_(key) {
29 StatisticsRecorder::Initialize();
31 HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_);
33 base_samples_ = histogram->SnapshotSamples();
36 void CheckLanguage(translate::MetricsNameIndex index,
37 int expected_not_provided,
39 int expected_invalid) {
40 ASSERT_EQ(translate::GetMetricsName(index), key_);
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));
52 void CheckLanguageVerification(int expected_cld_disabled,
53 int expected_cld_only,
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),
65 expected_cld_disabled,
66 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISABLED));
69 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_ONLY));
72 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_UNKNOWN));
75 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_AGREE));
77 expected_cld_disagree,
78 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISAGREE));
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));
87 void CheckScheme(int expected_http, int expected_https, int expected_others) {
88 ASSERT_EQ(translate::GetMetricsName(translate::UMA_PAGE_SCHEME), key_);
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));
98 void CheckTotalCount(int count) {
100 EXPECT_EQ(count, GetTotalCount());
103 void CheckValueInLogs(double value) {
105 ASSERT_TRUE(samples_.get());
106 for (scoped_ptr<SampleCountIterator> i = samples_->Iterator(); !i->Done();
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)
118 HistogramBase::Count GetCount(HistogramBase::Sample value) {
120 return GetCountWithoutSnapshot(value);
125 HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_);
128 samples_ = histogram->SnapshotSamples();
131 HistogramBase::Count GetCountWithoutSnapshot(HistogramBase::Sample value) {
134 HistogramBase::Count count = samples_->GetCount(value);
135 if (!base_samples_.get())
137 return count - base_samples_->GetCount(value);
140 HistogramBase::Count GetTotalCount() {
143 HistogramBase::Count count = samples_->TotalCount();
144 if (!base_samples_.get())
146 return count - base_samples_->TotalCount();
150 scoped_ptr<HistogramSamples> base_samples_;
151 scoped_ptr<HistogramSamples> samples_;
153 DISALLOW_COPY_AND_ASSIGN(MetricsRecorder);
158 TEST(TranslateMetricsTest, ReportContentLanguage) {
159 MetricsRecorder recorder(
160 translate::GetMetricsName(translate::UMA_CONTENT_LANGUAGE));
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);
171 TEST(TranslateMetricsTest, ReportHtmlLang) {
172 MetricsRecorder recorder(translate::GetMetricsName(translate::UMA_HTML_LANG));
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);
183 TEST(TranslateMetricsTest, ReportLanguageVerification) {
184 MetricsRecorder recorder(
185 translate::GetMetricsName(translate::UMA_LANGUAGE_VERIFICATION));
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);
211 TEST(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);
220 TEST(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);
229 TEST(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);
238 TEST(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);
249 TEST(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);
261 TEST(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));
275 TEST(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);