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
15 using base::HistogramBase;
16 using base::HistogramSamples;
17 using base::SampleCountIterator;
18 using base::StatisticsRecorder;
19 using base::TimeTicks;
20
21 namespace {
22
23 const int kTrue = 1;
24 const int kFalse = 0;
25
26 class MetricsRecorder {
27 public:
MetricsRecorder(const char * key)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
CheckLanguage(translate::MetricsNameIndex index,int expected_not_provided,int expected_valid,int expected_invalid)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
CheckLanguageVerification(int expected_cld_disabled,int expected_cld_only,int expected_unknown,int expected_cld_agree,int expected_cld_disagree,int expected_trust_cld,int expected_cld_complement_sub_code)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
CheckScheme(int expected_http,int expected_https,int expected_others)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
CheckTotalCount(int count)98 void CheckTotalCount(int count) {
99 Snapshot();
100 EXPECT_EQ(count, GetTotalCount());
101 }
102
CheckValueInLogs(double value)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
GetCount(HistogramBase::Sample value)118 HistogramBase::Count GetCount(HistogramBase::Sample value) {
119 Snapshot();
120 return GetCountWithoutSnapshot(value);
121 }
122
123 private:
Snapshot()124 void Snapshot() {
125 HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_);
126 if (!histogram)
127 return;
128 samples_ = histogram->SnapshotSamples();
129 }
130
GetCountWithoutSnapshot(HistogramBase::Sample value)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
GetTotalCount()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
TEST(TranslateMetricsTest,ReportContentLanguage)158 TEST(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
TEST(TranslateMetricsTest,ReportHtmlLang)171 TEST(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
TEST(TranslateMetricsTest,ReportLanguageVerification)183 TEST(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
TEST(TranslateMetricsTest,ReportTimeToBeReady)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);
218 }
219
TEST(TranslateMetricsTest,ReportTimeToLoad)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);
227 }
228
TEST(TranslateMetricsTest,ReportTimeToTranslate)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);
236 }
237
TEST(TranslateMetricsTest,ReportUserActionDuration)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);
247 }
248
TEST(TranslateMetricsTest,ReportPageScheme)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);
259 }
260
TEST(TranslateMetricsTest,ReportSimilarLanguageMatch)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));
273 }
274
TEST(TranslateMetricsTest,ReportLanguageDetectionTime)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);
284 }
285