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.
5 #include "components/translate/core/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
;
28 class MetricsRecorder
{
30 explicit MetricsRecorder(const char* key
) : key_(key
) {
31 StatisticsRecorder::Initialize();
33 HistogramBase
* histogram
= StatisticsRecorder::FindHistogram(key_
);
35 base_samples_
= histogram
->SnapshotSamples();
38 void CheckLanguage(translate::MetricsNameIndex index
,
39 int expected_not_provided
,
41 int expected_invalid
) {
42 ASSERT_EQ(translate::GetMetricsName(index
), key_
);
46 EXPECT_EQ(expected_not_provided
,
47 GetCountWithoutSnapshot(translate::LANGUAGE_NOT_PROVIDED
));
48 EXPECT_EQ(expected_valid
,
49 GetCountWithoutSnapshot(translate::LANGUAGE_VALID
));
50 EXPECT_EQ(expected_invalid
,
51 GetCountWithoutSnapshot(translate::LANGUAGE_INVALID
));
54 void CheckLanguageVerification(int expected_cld_disabled
,
55 int expected_cld_only
,
57 int expected_cld_agree
,
58 int expected_cld_disagree
,
59 int expected_trust_cld
,
60 int expected_cld_complement_sub_code
) {
61 ASSERT_EQ(translate::GetMetricsName(translate::UMA_LANGUAGE_VERIFICATION
),
67 expected_cld_disabled
,
68 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISABLED
));
71 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_ONLY
));
74 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_UNKNOWN
));
77 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_AGREE
));
79 expected_cld_disagree
,
80 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISAGREE
));
83 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_TRUST_CLD
));
84 EXPECT_EQ(expected_cld_complement_sub_code
,
85 GetCountWithoutSnapshot(
86 translate::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE
));
89 void CheckScheme(int expected_http
, int expected_https
, int expected_others
) {
90 ASSERT_EQ(translate::GetMetricsName(translate::UMA_PAGE_SCHEME
), key_
);
94 EXPECT_EQ(expected_http
, GetCountWithoutSnapshot(translate::SCHEME_HTTP
));
95 EXPECT_EQ(expected_https
, GetCountWithoutSnapshot(translate::SCHEME_HTTPS
));
96 EXPECT_EQ(expected_others
,
97 GetCountWithoutSnapshot(translate::SCHEME_OTHERS
));
100 void CheckTotalCount(int count
) {
102 EXPECT_EQ(count
, GetTotalCount());
105 void CheckValueInLogs(double value
) {
107 ASSERT_TRUE(samples_
.get());
108 for (scoped_ptr
<SampleCountIterator
> i
= samples_
->Iterator(); !i
->Done();
110 HistogramBase::Sample min
;
111 HistogramBase::Sample max
;
112 HistogramBase::Count count
;
113 i
->Get(&min
, &max
, &count
);
114 if (min
<= value
&& value
<= max
&& count
>= 1)
120 HistogramBase::Count
GetCount(HistogramBase::Sample value
) {
122 return GetCountWithoutSnapshot(value
);
127 HistogramBase
* histogram
= StatisticsRecorder::FindHistogram(key_
);
130 samples_
= histogram
->SnapshotSamples();
133 HistogramBase::Count
GetCountWithoutSnapshot(HistogramBase::Sample value
) {
136 HistogramBase::Count count
= samples_
->GetCount(value
);
137 if (!base_samples_
.get())
139 return count
- base_samples_
->GetCount(value
);
142 HistogramBase::Count
GetTotalCount() {
145 HistogramBase::Count count
= samples_
->TotalCount();
146 if (!base_samples_
.get())
148 return count
- base_samples_
->TotalCount();
152 scoped_ptr
<HistogramSamples
> base_samples_
;
153 scoped_ptr
<HistogramSamples
> samples_
;
155 DISALLOW_COPY_AND_ASSIGN(MetricsRecorder
);
160 TEST(TranslateMetricsTest
, ReportContentLanguage
) {
161 MetricsRecorder
recorder(
162 translate::GetMetricsName(translate::UMA_CONTENT_LANGUAGE
));
164 recorder
.CheckLanguage(translate::UMA_CONTENT_LANGUAGE
, 0, 0, 0);
165 translate::ReportContentLanguage(std::string(), std::string());
166 recorder
.CheckLanguage(translate::UMA_CONTENT_LANGUAGE
, 1, 0, 0);
167 translate::ReportContentLanguage("ja_JP", "ja-JP");
168 recorder
.CheckLanguage(translate::UMA_CONTENT_LANGUAGE
, 1, 0, 1);
169 translate::ReportContentLanguage("en", "en");
170 recorder
.CheckLanguage(translate::UMA_CONTENT_LANGUAGE
, 1, 1, 1);
173 TEST(TranslateMetricsTest
, ReportHtmlLang
) {
174 MetricsRecorder
recorder(translate::GetMetricsName(translate::UMA_HTML_LANG
));
176 recorder
.CheckLanguage(translate::UMA_HTML_LANG
, 0, 0, 0);
177 translate::ReportHtmlLang(std::string(), std::string());
178 recorder
.CheckLanguage(translate::UMA_HTML_LANG
, 1, 0, 0);
179 translate::ReportHtmlLang("ja_JP", "ja-JP");
180 recorder
.CheckLanguage(translate::UMA_HTML_LANG
, 1, 0, 1);
181 translate::ReportHtmlLang("en", "en");
182 recorder
.CheckLanguage(translate::UMA_HTML_LANG
, 1, 1, 1);
185 TEST(TranslateMetricsTest
, ReportLanguageVerification
) {
186 MetricsRecorder
recorder(
187 translate::GetMetricsName(translate::UMA_LANGUAGE_VERIFICATION
));
189 recorder
.CheckLanguageVerification(0, 0, 0, 0, 0, 0, 0);
190 translate::ReportLanguageVerification(
191 translate::LANGUAGE_VERIFICATION_CLD_DISABLED
);
192 recorder
.CheckLanguageVerification(1, 0, 0, 0, 0, 0, 0);
193 translate::ReportLanguageVerification(
194 translate::LANGUAGE_VERIFICATION_CLD_ONLY
);
195 recorder
.CheckLanguageVerification(1, 1, 0, 0, 0, 0, 0);
196 translate::ReportLanguageVerification(
197 translate::LANGUAGE_VERIFICATION_UNKNOWN
);
198 recorder
.CheckLanguageVerification(1, 1, 1, 0, 0, 0, 0);
199 translate::ReportLanguageVerification(
200 translate::LANGUAGE_VERIFICATION_CLD_AGREE
);
201 recorder
.CheckLanguageVerification(1, 1, 1, 1, 0, 0, 0);
202 translate::ReportLanguageVerification(
203 translate::LANGUAGE_VERIFICATION_CLD_DISAGREE
);
204 recorder
.CheckLanguageVerification(1, 1, 1, 1, 1, 0, 0);
205 translate::ReportLanguageVerification(
206 translate::LANGUAGE_VERIFICATION_TRUST_CLD
);
207 recorder
.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 0);
208 translate::ReportLanguageVerification(
209 translate::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE
);
210 recorder
.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 1);
213 TEST(TranslateMetricsTest
, ReportTimeToBeReady
) {
214 MetricsRecorder
recorder(
215 translate::GetMetricsName(translate::UMA_TIME_TO_BE_READY
));
216 recorder
.CheckTotalCount(0);
217 translate::ReportTimeToBeReady(3.14);
218 recorder
.CheckValueInLogs(3.14);
219 recorder
.CheckTotalCount(1);
222 TEST(TranslateMetricsTest
, ReportTimeToLoad
) {
223 MetricsRecorder
recorder(
224 translate::GetMetricsName(translate::UMA_TIME_TO_LOAD
));
225 recorder
.CheckTotalCount(0);
226 translate::ReportTimeToLoad(573.0);
227 recorder
.CheckValueInLogs(573.0);
228 recorder
.CheckTotalCount(1);
231 TEST(TranslateMetricsTest
, ReportTimeToTranslate
) {
232 MetricsRecorder
recorder(
233 translate::GetMetricsName(translate::UMA_TIME_TO_TRANSLATE
));
234 recorder
.CheckTotalCount(0);
235 translate::ReportTimeToTranslate(4649.0);
236 recorder
.CheckValueInLogs(4649.0);
237 recorder
.CheckTotalCount(1);
240 TEST(TranslateMetricsTest
, ReportUserActionDuration
) {
241 MetricsRecorder
recorder(
242 translate::GetMetricsName(translate::UMA_USER_ACTION_DURATION
));
243 recorder
.CheckTotalCount(0);
244 TimeTicks begin
= TimeTicks::Now();
245 TimeTicks end
= begin
+ base::TimeDelta::FromSeconds(3776);
246 translate::ReportUserActionDuration(begin
, end
);
247 recorder
.CheckValueInLogs(3776000.0);
248 recorder
.CheckTotalCount(1);
251 TEST(TranslateMetricsTest
, ReportPageScheme
) {
252 MetricsRecorder
recorder(
253 translate::GetMetricsName(translate::UMA_PAGE_SCHEME
));
254 recorder
.CheckScheme(0, 0, 0);
255 translate::ReportPageScheme("http");
256 recorder
.CheckScheme(1, 0, 0);
257 translate::ReportPageScheme("https");
258 recorder
.CheckScheme(1, 1, 0);
259 translate::ReportPageScheme("ftp");
260 recorder
.CheckScheme(1, 1, 1);
263 TEST(TranslateMetricsTest
, ReportSimilarLanguageMatch
) {
264 MetricsRecorder
recorder(
265 translate::GetMetricsName(translate::UMA_SIMILAR_LANGUAGE_MATCH
));
266 recorder
.CheckTotalCount(0);
267 EXPECT_EQ(0, recorder
.GetCount(kTrue
));
268 EXPECT_EQ(0, recorder
.GetCount(kFalse
));
269 translate::ReportSimilarLanguageMatch(true);
270 EXPECT_EQ(1, recorder
.GetCount(kTrue
));
271 EXPECT_EQ(0, recorder
.GetCount(kFalse
));
272 translate::ReportSimilarLanguageMatch(false);
273 EXPECT_EQ(1, recorder
.GetCount(kTrue
));
274 EXPECT_EQ(1, recorder
.GetCount(kFalse
));
277 TEST(TranslateMetricsTest
, ReportLanguageDetectionTime
) {
278 MetricsRecorder
recorder(
279 translate::GetMetricsName(translate::UMA_LANGUAGE_DETECTION
));
280 recorder
.CheckTotalCount(0);
281 TimeTicks begin
= TimeTicks::Now();
282 TimeTicks end
= begin
+ base::TimeDelta::FromMicroseconds(9009);
283 translate::ReportLanguageDetectionTime(begin
, end
);
284 recorder
.CheckValueInLogs(9.009);
285 recorder
.CheckTotalCount(1);
288 } // namespace translate