• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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