Home | History | Annotate | Download | only in translate
      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 "chrome/common/translate/translate_common_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:
     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(TranslateCommonMetrics::MetricsNameIndex index,
     37                      int expected_not_provided,
     38                      int expected_valid,
     39                      int expected_invalid) {
     40     ASSERT_EQ(TranslateCommonMetrics::GetMetricsName(index), key_);
     41 
     42     Snapshot();
     43 
     44     EXPECT_EQ(expected_not_provided,
     45               GetCountWithoutSnapshot(
     46                   TranslateCommonMetrics::LANGUAGE_NOT_PROVIDED));
     47     EXPECT_EQ(expected_valid,
     48               GetCountWithoutSnapshot(
     49                   TranslateCommonMetrics::LANGUAGE_VALID));
     50     EXPECT_EQ(expected_invalid,
     51               GetCountWithoutSnapshot(
     52                   TranslateCommonMetrics::LANGUAGE_INVALID));
     53   }
     54 
     55   void CheckLanguageVerification(int expected_cld_disabled,
     56                                  int expected_cld_only,
     57                                  int expected_unknown,
     58                                  int expected_cld_agree,
     59                                  int expected_cld_disagree,
     60                                  int expected_trust_cld,
     61                                  int expected_cld_complement_sub_code) {
     62     ASSERT_EQ(TranslateCommonMetrics::GetMetricsName(
     63         TranslateCommonMetrics::UMA_LANGUAGE_VERIFICATION), key_);
     64 
     65     Snapshot();
     66 
     67     EXPECT_EQ(
     68         expected_cld_disabled,
     69         GetCountWithoutSnapshot(
     70             TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_DISABLED));
     71     EXPECT_EQ(
     72         expected_cld_only,
     73         GetCountWithoutSnapshot(
     74             TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_ONLY));
     75     EXPECT_EQ(
     76         expected_unknown,
     77         GetCountWithoutSnapshot(
     78             TranslateCommonMetrics::LANGUAGE_VERIFICATION_UNKNOWN));
     79     EXPECT_EQ(
     80         expected_cld_agree,
     81         GetCountWithoutSnapshot(
     82             TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_AGREE));
     83     EXPECT_EQ(
     84         expected_cld_disagree,
     85         GetCountWithoutSnapshot(
     86             TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_DISAGREE));
     87     EXPECT_EQ(
     88         expected_trust_cld,
     89         GetCountWithoutSnapshot(
     90             TranslateCommonMetrics::LANGUAGE_VERIFICATION_TRUST_CLD));
     91     EXPECT_EQ(
     92         expected_cld_complement_sub_code,
     93         GetCountWithoutSnapshot(
     94             TranslateCommonMetrics::
     95             LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE));
     96   }
     97 
     98   void CheckScheme(int expected_http, int expected_https, int expected_others) {
     99     ASSERT_EQ(TranslateCommonMetrics::GetMetricsName(
    100         TranslateCommonMetrics::UMA_PAGE_SCHEME), key_);
    101 
    102     Snapshot();
    103 
    104     EXPECT_EQ(expected_http,
    105               GetCountWithoutSnapshot(TranslateCommonMetrics::SCHEME_HTTP));
    106     EXPECT_EQ(expected_https,
    107               GetCountWithoutSnapshot(TranslateCommonMetrics::SCHEME_HTTPS));
    108     EXPECT_EQ(expected_others,
    109               GetCountWithoutSnapshot(TranslateCommonMetrics::SCHEME_OTHERS));
    110   }
    111 
    112   void CheckTotalCount(int count) {
    113     Snapshot();
    114     EXPECT_EQ(count, GetTotalCount());
    115   }
    116 
    117   void CheckValueInLogs(double value) {
    118     Snapshot();
    119     ASSERT_TRUE(samples_.get());
    120     for (scoped_ptr<SampleCountIterator> i = samples_->Iterator();
    121          !i->Done();
    122          i->Next()) {
    123       HistogramBase::Sample min;
    124       HistogramBase::Sample max;
    125       HistogramBase::Count count;
    126       i->Get(&min, &max, &count);
    127       if (min <= value && value <= max && count >= 1)
    128         return;
    129     }
    130     EXPECT_FALSE(true);
    131   }
    132 
    133   HistogramBase::Count GetCount(HistogramBase::Sample value) {
    134     Snapshot();
    135     return GetCountWithoutSnapshot(value);
    136   }
    137 
    138  private:
    139   void Snapshot() {
    140     HistogramBase* histogram = StatisticsRecorder::FindHistogram(key_);
    141     if (!histogram)
    142       return;
    143     samples_ = histogram->SnapshotSamples();
    144   }
    145 
    146   HistogramBase::Count GetCountWithoutSnapshot(HistogramBase::Sample value) {
    147     if (!samples_.get())
    148       return 0;
    149     HistogramBase::Count count = samples_->GetCount(value);
    150     if (!base_samples_.get())
    151       return count;
    152     return count - base_samples_->GetCount(value);
    153   }
    154 
    155   HistogramBase::Count GetTotalCount() {
    156     if (!samples_.get())
    157       return 0;
    158     HistogramBase::Count count = samples_->TotalCount();
    159     if (!base_samples_.get())
    160       return count;
    161     return count - base_samples_->TotalCount();
    162   }
    163 
    164   std::string key_;
    165   scoped_ptr<HistogramSamples> base_samples_;
    166   scoped_ptr<HistogramSamples> samples_;
    167 
    168   DISALLOW_COPY_AND_ASSIGN(MetricsRecorder);
    169 };
    170 
    171 }  // namespace
    172 
    173 TEST(TranslateCommonMetricsTest, ReportContentLanguage) {
    174   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    175       TranslateCommonMetrics::UMA_CONTENT_LANGUAGE));
    176 
    177   recorder.CheckLanguage(TranslateCommonMetrics::UMA_CONTENT_LANGUAGE, 0, 0, 0);
    178   TranslateCommonMetrics::ReportContentLanguage(std::string(), std::string());
    179   recorder.CheckLanguage(TranslateCommonMetrics::UMA_CONTENT_LANGUAGE, 1, 0, 0);
    180   TranslateCommonMetrics::ReportContentLanguage("ja_JP", "ja-JP");
    181   recorder.CheckLanguage(TranslateCommonMetrics::UMA_CONTENT_LANGUAGE, 1, 0, 1);
    182   TranslateCommonMetrics::ReportContentLanguage("en", "en");
    183   recorder.CheckLanguage(TranslateCommonMetrics::UMA_CONTENT_LANGUAGE, 1, 1, 1);
    184 }
    185 
    186 TEST(TranslateCommonMetricsTest, ReportHtmlLang) {
    187   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    188       TranslateCommonMetrics::UMA_HTML_LANG));
    189 
    190   recorder.CheckLanguage(TranslateCommonMetrics::UMA_HTML_LANG, 0, 0, 0);
    191   TranslateCommonMetrics::ReportHtmlLang(std::string(), std::string());
    192   recorder.CheckLanguage(TranslateCommonMetrics::UMA_HTML_LANG, 1, 0, 0);
    193   TranslateCommonMetrics::ReportHtmlLang("ja_JP", "ja-JP");
    194   recorder.CheckLanguage(TranslateCommonMetrics::UMA_HTML_LANG, 1, 0, 1);
    195   TranslateCommonMetrics::ReportHtmlLang("en", "en");
    196   recorder.CheckLanguage(TranslateCommonMetrics::UMA_HTML_LANG, 1, 1, 1);
    197 }
    198 
    199 TEST(TranslateCommonMetricsTest, ReportLanguageVerification) {
    200   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    201       TranslateCommonMetrics::UMA_LANGUAGE_VERIFICATION));
    202 
    203   recorder.CheckLanguageVerification(0, 0, 0, 0, 0, 0, 0);
    204   TranslateCommonMetrics::ReportLanguageVerification(
    205       TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_DISABLED);
    206   recorder.CheckLanguageVerification(1, 0, 0, 0, 0, 0, 0);
    207   TranslateCommonMetrics::ReportLanguageVerification(
    208       TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_ONLY);
    209   recorder.CheckLanguageVerification(1, 1, 0, 0, 0, 0, 0);
    210   TranslateCommonMetrics::ReportLanguageVerification(
    211       TranslateCommonMetrics::LANGUAGE_VERIFICATION_UNKNOWN);
    212   recorder.CheckLanguageVerification(1, 1, 1, 0, 0, 0, 0);
    213   TranslateCommonMetrics::ReportLanguageVerification(
    214       TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_AGREE);
    215   recorder.CheckLanguageVerification(1, 1, 1, 1, 0, 0, 0);
    216   TranslateCommonMetrics::ReportLanguageVerification(
    217       TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_DISAGREE);
    218   recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 0, 0);
    219   TranslateCommonMetrics::ReportLanguageVerification(
    220       TranslateCommonMetrics::LANGUAGE_VERIFICATION_TRUST_CLD);
    221   recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 0);
    222   TranslateCommonMetrics::ReportLanguageVerification(
    223       TranslateCommonMetrics::LANGUAGE_VERIFICATION_CLD_COMPLEMENT_SUB_CODE);
    224   recorder.CheckLanguageVerification(1, 1, 1, 1, 1, 1, 1);
    225 }
    226 
    227 TEST(TranslateCommonMetricsTest, ReportTimeToBeReady) {
    228   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    229       TranslateCommonMetrics::UMA_TIME_TO_BE_READY));
    230   recorder.CheckTotalCount(0);
    231   TranslateCommonMetrics::ReportTimeToBeReady(3.14);
    232   recorder.CheckValueInLogs(3.14);
    233   recorder.CheckTotalCount(1);
    234 }
    235 
    236 TEST(TranslateCommonMetricsTest, ReportTimeToLoad) {
    237   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    238       TranslateCommonMetrics::UMA_TIME_TO_LOAD));
    239   recorder.CheckTotalCount(0);
    240   TranslateCommonMetrics::ReportTimeToLoad(573.0);
    241   recorder.CheckValueInLogs(573.0);
    242   recorder.CheckTotalCount(1);
    243 }
    244 
    245 TEST(TranslateCommonMetricsTest, ReportTimeToTranslate) {
    246   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    247       TranslateCommonMetrics::UMA_TIME_TO_TRANSLATE));
    248   recorder.CheckTotalCount(0);
    249   TranslateCommonMetrics::ReportTimeToTranslate(4649.0);
    250   recorder.CheckValueInLogs(4649.0);
    251   recorder.CheckTotalCount(1);
    252 }
    253 
    254 TEST(TranslateCommonMetricsTest, ReportUserActionDuration) {
    255   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    256       TranslateCommonMetrics::UMA_USER_ACTION_DURATION));
    257   recorder.CheckTotalCount(0);
    258   TimeTicks begin = TimeTicks::Now();
    259   TimeTicks end = begin + base::TimeDelta::FromSeconds(3776);
    260   TranslateCommonMetrics::ReportUserActionDuration(begin, end);
    261   recorder.CheckValueInLogs(3776000.0);
    262   recorder.CheckTotalCount(1);
    263 }
    264 
    265 TEST(TranslateCommonMetricsTest, ReportPageScheme) {
    266   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    267       TranslateCommonMetrics::UMA_PAGE_SCHEME));
    268   recorder.CheckScheme(0, 0, 0);
    269   TranslateCommonMetrics::ReportPageScheme("http");
    270   recorder.CheckScheme(1, 0, 0);
    271   TranslateCommonMetrics::ReportPageScheme("https");
    272   recorder.CheckScheme(1, 1, 0);
    273   TranslateCommonMetrics::ReportPageScheme("ftp");
    274   recorder.CheckScheme(1, 1, 1);
    275 }
    276 
    277 TEST(TranslateCommonMetricsTest, ReportSimilarLanguageMatch) {
    278   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    279       TranslateCommonMetrics::UMA_SIMILAR_LANGUAGE_MATCH));
    280   recorder.CheckTotalCount(0);
    281   EXPECT_EQ(0, recorder.GetCount(kTrue));
    282   EXPECT_EQ(0, recorder.GetCount(kFalse));
    283   TranslateCommonMetrics::ReportSimilarLanguageMatch(true);
    284   EXPECT_EQ(1, recorder.GetCount(kTrue));
    285   EXPECT_EQ(0, recorder.GetCount(kFalse));
    286   TranslateCommonMetrics::ReportSimilarLanguageMatch(false);
    287   EXPECT_EQ(1, recorder.GetCount(kTrue));
    288   EXPECT_EQ(1, recorder.GetCount(kFalse));
    289 }
    290 
    291 TEST(TranslateCommonMetricsTest, ReportLanguageDetectionTime) {
    292   MetricsRecorder recorder(TranslateCommonMetrics::GetMetricsName(
    293       TranslateCommonMetrics::UMA_LANGUAGE_DETECTION));
    294   recorder.CheckTotalCount(0);
    295   TimeTicks begin = TimeTicks::Now();
    296   TimeTicks end = begin + base::TimeDelta::FromMicroseconds(9009);
    297   TranslateCommonMetrics::ReportLanguageDetectionTime(begin, end);
    298   recorder.CheckValueInLogs(9.009);
    299   recorder.CheckTotalCount(1);
    300 }
    301