// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/translate/common/translate_metrics.h" #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" #include "base/metrics/histogram.h" #include "base/metrics/histogram_samples.h" #include "base/metrics/statistics_recorder.h" #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" using base::HistogramBase; using base::HistogramSamples; using base::SampleCountIterator; using base::StatisticsRecorder; using base::TimeTicks; namespace { const int kTrue = 1; const int kFalse = 0; class MetricsRecorder { public: explicit MetricsRecorder(const char* key) : key_(key) { StatisticsRecorder::Initialize(); HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_); if (histogram) base_samples_ = histogram->SnapshotSamples(); } void CheckLanguage(translate::MetricsNameIndex index, int expected_not_provided, int expected_valid, int expected_invalid) { ASSERT_EQ(translate::GetMetricsName(index), key_); Snapshot(); EXPECT_EQ(expected_not_provided, GetCountWithoutSnapshot(translate::LANGUAGE_NOT_PROVIDED)); EXPECT_EQ(expected_valid, GetCountWithoutSnapshot(translate::LANGUAGE_VALID)); EXPECT_EQ(expected_invalid, GetCountWithoutSnapshot(translate::LANGUAGE_INVALID)); } void 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) { ASSERT_EQ(translate::GetMetricsName(translate::UMA_LANGUAGE_VERIFICATION), key_); Snapshot(); EXPECT_EQ( expected_cld_disabled, GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISABLED)); EXPECT_EQ( expected_cld_only, GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_ONLY)); EXPECT_EQ( expected_unknown, GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_UNKNOWN)); EXPECT_EQ( expected_cld_agree, GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_AGREE)); EXPECT_EQ( expected_cld_disagree, GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_CLD_DISAGREE)); EXPECT_EQ( expected_trust_cld, GetCountWithoutSnapshot(translate::LANGUAGE_VERIFICATION_TRUST_CLD)); EXPECT_EQ(expected_cld_complement_sub_code, GetCountWithoutSnapshot( translate::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE)); } void CheckScheme(int expected_http, int expected_https, int expected_others) { ASSERT_EQ(translate::GetMetricsName(translate::UMA_PAGE_SCHEME), key_); Snapshot(); EXPECT_EQ(expected_http, GetCountWithoutSnapshot(translate::SCHEME_HTTP)); EXPECT_EQ(expected_https, GetCountWithoutSnapshot(translate::SCHEME_HTTPS)); EXPECT_EQ(expected_others, GetCountWithoutSnapshot(translate::SCHEME_OTHERS)); } void CheckTotalCount(int count) { Snapshot(); EXPECT_EQ(count, GetTotalCount()); } void CheckValueInLogs(double value) { Snapshot(); ASSERT_TRUE(samples_.get()); for (scoped_ptr<SampleCountIterator> i = samples_->Iterator(); !i->Done(); i->Next()) { HistogramBase::Sample min; HistogramBase::Sample max; HistogramBase::Count count; i->Get(&min, &max, &count); if (min <= value && value <= max && count >= 1) return; } EXPECT_FALSE(true); } HistogramBase::Count GetCount(HistogramBase::Sample value) { Snapshot(); return GetCountWithoutSnapshot(value); } private: void Snapshot() { HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_); if (!histogram) return; samples_ = histogram->SnapshotSamples(); } HistogramBase::Count GetCountWithoutSnapshot(HistogramBase::Sample value) { if (!samples_.get()) return 0; HistogramBase::Count count = samples_->GetCount(value); if (!base_samples_.get()) return count; return count - base_samples_->GetCount(value); } HistogramBase::Count GetTotalCount() { if (!samples_.get()) return 0; HistogramBase::Count count = samples_->TotalCount(); if (!base_samples_.get()) return count; return count - base_samples_->TotalCount(); } std::string key_; scoped_ptr<HistogramSamples> base_samples_; scoped_ptr<HistogramSamples> samples_; DISALLOW_COPY_AND_ASSIGN(MetricsRecorder); }; } // namespace TEST(TranslateMetricsTest, ReportContentLanguage) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_CONTENT_LANGUAGE)); recorder.CheckLanguage(translate::UMA_CONTENT_LANGUAGE, 0, 0, 0); translate::ReportContentLanguage(std::string(), std::string()); recorder.CheckLanguage(translate::UMA_CONTENT_LANGUAGE, 1, 0, 0); translate::ReportContentLanguage("ja_JP", "ja-JP"); recorder.CheckLanguage(translate::UMA_CONTENT_LANGUAGE, 1, 0, 1); translate::ReportContentLanguage("en", "en"); recorder.CheckLanguage(translate::UMA_CONTENT_LANGUAGE, 1, 1, 1); } TEST(TranslateMetricsTest, ReportHtmlLang) { MetricsRecorder recorder(translate::GetMetricsName(translate::UMA_HTML_LANG)); recorder.CheckLanguage(translate::UMA_HTML_LANG, 0, 0, 0); translate::ReportHtmlLang(std::string(), std::string()); recorder.CheckLanguage(translate::UMA_HTML_LANG, 1, 0, 0); translate::ReportHtmlLang("ja_JP", "ja-JP"); recorder.CheckLanguage(translate::UMA_HTML_LANG, 1, 0, 1); translate::ReportHtmlLang("en", "en"); recorder.CheckLanguage(translate::UMA_HTML_LANG, 1, 1, 1); } TEST(TranslateMetricsTest, ReportLanguageVerification) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_LANGUAGE_VERIFICATION)); recorder.CheckLanguageVerification(0, 0, 0, 0, 0, 0, 0); translate::ReportLanguageVerification( translate::LANGUAGE_VERIFICATION_CLD_DISABLED); recorder.CheckLanguageVerification(1, 0, 0, 0, 0, 0, 0); translate::ReportLanguageVerification( translate::LANGUAGE_VERIFICATION_CLD_ONLY); recorder.CheckLanguageVerification(1, 1, 0, 0, 0, 0, 0); translate::ReportLanguageVerification( translate::LANGUAGE_VERIFICATION_UNKNOWN); recorder.CheckLanguageVerification(1, 1, 1, 0, 0, 0, 0); translate::ReportLanguageVerification( translate::LANGUAGE_VERIFICATION_CLD_AGREE); recorder.CheckLanguageVerification(1, 1, 1, 1, 0, 0, 0); translate::ReportLanguageVerification( translate::LANGUAGE_VERIFICATION_CLD_DISAGREE); recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 0, 0); translate::ReportLanguageVerification( translate::LANGUAGE_VERIFICATION_TRUST_CLD); recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 0); translate::ReportLanguageVerification( translate::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE); recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 1); } TEST(TranslateMetricsTest, ReportTimeToBeReady) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_TIME_TO_BE_READY)); recorder.CheckTotalCount(0); translate::ReportTimeToBeReady(3.14); recorder.CheckValueInLogs(3.14); recorder.CheckTotalCount(1); } TEST(TranslateMetricsTest, ReportTimeToLoad) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_TIME_TO_LOAD)); recorder.CheckTotalCount(0); translate::ReportTimeToLoad(573.0); recorder.CheckValueInLogs(573.0); recorder.CheckTotalCount(1); } TEST(TranslateMetricsTest, ReportTimeToTranslate) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_TIME_TO_TRANSLATE)); recorder.CheckTotalCount(0); translate::ReportTimeToTranslate(4649.0); recorder.CheckValueInLogs(4649.0); recorder.CheckTotalCount(1); } TEST(TranslateMetricsTest, ReportUserActionDuration) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_USER_ACTION_DURATION)); recorder.CheckTotalCount(0); TimeTicks begin = TimeTicks::Now(); TimeTicks end = begin + base::TimeDelta::FromSeconds(3776); translate::ReportUserActionDuration(begin, end); recorder.CheckValueInLogs(3776000.0); recorder.CheckTotalCount(1); } TEST(TranslateMetricsTest, ReportPageScheme) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_PAGE_SCHEME)); recorder.CheckScheme(0, 0, 0); translate::ReportPageScheme("http"); recorder.CheckScheme(1, 0, 0); translate::ReportPageScheme("https"); recorder.CheckScheme(1, 1, 0); translate::ReportPageScheme("ftp"); recorder.CheckScheme(1, 1, 1); } TEST(TranslateMetricsTest, ReportSimilarLanguageMatch) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_SIMILAR_LANGUAGE_MATCH)); recorder.CheckTotalCount(0); EXPECT_EQ(0, recorder.GetCount(kTrue)); EXPECT_EQ(0, recorder.GetCount(kFalse)); translate::ReportSimilarLanguageMatch(true); EXPECT_EQ(1, recorder.GetCount(kTrue)); EXPECT_EQ(0, recorder.GetCount(kFalse)); translate::ReportSimilarLanguageMatch(false); EXPECT_EQ(1, recorder.GetCount(kTrue)); EXPECT_EQ(1, recorder.GetCount(kFalse)); } TEST(TranslateMetricsTest, ReportLanguageDetectionTime) { MetricsRecorder recorder( translate::GetMetricsName(translate::UMA_LANGUAGE_DETECTION)); recorder.CheckTotalCount(0); TimeTicks begin = TimeTicks::Now(); TimeTicks end = begin + base::TimeDelta::FromMicroseconds(9009); translate::ReportLanguageDetectionTime(begin, end); recorder.CheckValueInLogs(9.009); recorder.CheckTotalCount(1); }