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. 4 5 #include "components/translate/core/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 translate { 22 23 namespace { 24 25 const int kTrue = 1; 26 const int kFalse = 0; 27 28 class MetricsRecorder { 29 public: 30 explicit MetricsRecorder(const char* key) : key_(key) { 31 StatisticsRecorder::Initialize(); 32 33 HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_); 34 if (histogram) 35 base_samples_ = histogram->SnapshotSamples(); 36 } 37 38 void CheckLanguage(translate::MetricsNameIndex index, 39 int expected_not_provided, 40 int expected_valid, 41 int expected_invalid) { 42 ASSERT_EQ(translate::GetMetricsName(index), key_); 43 44 Snapshot(); 45 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)); 52 } 53 54 void CheckLanguageVerification(int expected_cld_disabled, 55 int expected_cld_only, 56 int expected_unknown, 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), 62 key_); 63 64 Snapshot(); 65 66 EXPECT_EQ( 67 expected_cld_disabled, 68 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISABLED)); 69 EXPECT_EQ( 70 expected_cld_only, 71 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_ONLY)); 72 EXPECT_EQ( 73 expected_unknown, 74 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_UNKNOWN)); 75 EXPECT_EQ( 76 expected_cld_agree, 77 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_AGREE)); 78 EXPECT_EQ( 79 expected_cld_disagree, 80 GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISAGREE)); 81 EXPECT_EQ( 82 expected_trust_cld, 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)); 87 } 88 89 void CheckScheme(int expected_http, int expected_https, int expected_others) { 90 ASSERT_EQ(translate::GetMetricsName(translate::UMA_PAGE_SCHEME), key_); 91 92 Snapshot(); 93 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)); 98 } 99 100 void CheckTotalCount(int count) { 101 Snapshot(); 102 EXPECT_EQ(count, GetTotalCount()); 103 } 104 105 void CheckValueInLogs(double value) { 106 Snapshot(); 107 ASSERT_TRUE(samples_.get()); 108 for (scoped_ptr<SampleCountIterator> i = samples_->Iterator(); !i->Done(); 109 i->Next()) { 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) 115 return; 116 } 117 EXPECT_FALSE(true); 118 } 119 120 HistogramBase::Count GetCount(HistogramBase::Sample value) { 121 Snapshot(); 122 return GetCountWithoutSnapshot(value); 123 } 124 125 private: 126 void Snapshot() { 127 HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_); 128 if (!histogram) 129 return; 130 samples_ = histogram->SnapshotSamples(); 131 } 132 133 HistogramBase::Count GetCountWithoutSnapshot(HistogramBase::Sample value) { 134 if (!samples_.get()) 135 return 0; 136 HistogramBase::Count count = samples_->GetCount(value); 137 if (!base_samples_.get()) 138 return count; 139 return count - base_samples_->GetCount(value); 140 } 141 142 HistogramBase::Count GetTotalCount() { 143 if (!samples_.get()) 144 return 0; 145 HistogramBase::Count count = samples_->TotalCount(); 146 if (!base_samples_.get()) 147 return count; 148 return count - base_samples_->TotalCount(); 149 } 150 151 std::string key_; 152 scoped_ptr<HistogramSamples> base_samples_; 153 scoped_ptr<HistogramSamples> samples_; 154 155 DISALLOW_COPY_AND_ASSIGN(MetricsRecorder); 156 }; 157 158 } // namespace 159 160 TEST(TranslateMetricsTest, ReportContentLanguage) { 161 MetricsRecorder recorder( 162 translate::GetMetricsName(translate::UMA_CONTENT_LANGUAGE)); 163 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); 171 } 172 173 TEST(TranslateMetricsTest, ReportHtmlLang) { 174 MetricsRecorder recorder(translate::GetMetricsName(translate::UMA_HTML_LANG)); 175 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); 183 } 184 185 TEST(TranslateMetricsTest, ReportLanguageVerification) { 186 MetricsRecorder recorder( 187 translate::GetMetricsName(translate::UMA_LANGUAGE_VERIFICATION)); 188 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); 211 } 212 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); 220 } 221 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); 229 } 230 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); 238 } 239 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); 249 } 250 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); 261 } 262 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)); 275 } 276 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); 286 } 287 288 } // namespace translate 289