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 15using base::HistogramBase; 16using base::HistogramSamples; 17using base::SampleCountIterator; 18using base::StatisticsRecorder; 19using base::TimeTicks; 20 21namespace { 22 23const int kTrue = 1; 24const int kFalse = 0; 25 26class MetricsRecorder { 27 public: 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 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 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 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 98 void CheckTotalCount(int count) { 99 Snapshot(); 100 EXPECT_EQ(count, GetTotalCount()); 101 } 102 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 118 HistogramBase::Count GetCount(HistogramBase::Sample value) { 119 Snapshot(); 120 return GetCountWithoutSnapshot(value); 121 } 122 123 private: 124 void Snapshot() { 125 HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_); 126 if (!histogram) 127 return; 128 samples_ = histogram->SnapshotSamples(); 129 } 130 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 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 158TEST(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 171TEST(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 183TEST(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 211TEST(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 220TEST(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 229TEST(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 238TEST(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 249TEST(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 261TEST(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 275TEST(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