Home | History | Annotate | Download | only in base
      1 // Copyright (c) 2012 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/test/base/uma_histogram_helper.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/metrics/statistics_recorder.h"
      9 #include "base/test/test_timeouts.h"
     10 #include "chrome/test/base/ui_test_utils.h"
     11 #include "content/public/browser/histogram_fetcher.h"
     12 
     13 UMAHistogramHelper::UMAHistogramHelper() {
     14   base::StatisticsRecorder::Initialize();
     15 }
     16 
     17 UMAHistogramHelper::~UMAHistogramHelper() {
     18 }
     19 
     20 void UMAHistogramHelper::PrepareSnapshot(const char* const histogram_names[],
     21                                          size_t num_histograms) {
     22   for (size_t i = 0; i < num_histograms; ++i) {
     23     std::string histogram_name = histogram_names[i];
     24 
     25     base::HistogramBase* histogram =
     26         base::StatisticsRecorder::FindHistogram(histogram_name);
     27     // If there is no histogram present, then don't record a snapshot. The logic
     28     // in the Expect* methods will act to treat no histogram equivalent to
     29     // samples with zeros.
     30     if (histogram) {
     31       histogram_snapshots[histogram_name] =
     32           make_linked_ptr(histogram->SnapshotSamples().release());
     33     }
     34   }
     35 }
     36 
     37 void UMAHistogramHelper::Fetch() {
     38   base::Closure callback = base::Bind(&UMAHistogramHelper::FetchCallback,
     39                                       base::Unretained(this));
     40 
     41   content::FetchHistogramsAsynchronously(
     42       base::MessageLoop::current(),
     43       callback,
     44       // If this call times out, it means that a child process is not
     45       // responding, which is something we should not ignore.  The timeout is
     46       // set to be longer than the normal browser test timeout so that it will
     47       // be prempted by the normal timeout.
     48       TestTimeouts::action_max_timeout() * 2);
     49   content::RunMessageLoop();
     50 }
     51 
     52 void UMAHistogramHelper::ExpectUniqueSample(
     53     const std::string& name,
     54     base::HistogramBase::Sample sample,
     55     base::HistogramBase::Count expected_count) {
     56   base::HistogramBase* histogram =
     57       base::StatisticsRecorder::FindHistogram(name);
     58   EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram)
     59       << "Histogram \"" << name << "\" does not exist.";
     60 
     61   if (histogram) {
     62     scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
     63     CheckBucketCount(name, sample, expected_count, *samples);
     64     CheckTotalCount(name, expected_count, *samples);
     65   }
     66 }
     67 
     68 void UMAHistogramHelper::ExpectBucketCount(
     69     const std::string& name,
     70     base::HistogramBase::Sample sample,
     71     base::HistogramBase::Count expected_count) {
     72   base::HistogramBase* histogram =
     73       base::StatisticsRecorder::FindHistogram(name);
     74   EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram)
     75       << "Histogram \"" << name << "\" does not exist.";
     76 
     77   if (histogram) {
     78     scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
     79     CheckBucketCount(name, sample, expected_count, *samples);
     80   }
     81 }
     82 
     83 void UMAHistogramHelper::ExpectTotalCount(
     84     const std::string& name,
     85     base::HistogramBase::Count count) {
     86   base::HistogramBase* histogram =
     87       base::StatisticsRecorder::FindHistogram(name);
     88   if (histogram) {
     89     scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
     90     CheckTotalCount(name, count, *samples);
     91   } else {
     92     // No histogram means there were zero samples.
     93     EXPECT_EQ(count, 0) << "Histogram \"" << name << "\" does not exist.";
     94   }
     95 }
     96 
     97 void UMAHistogramHelper::FetchCallback() {
     98   base::MessageLoopForUI::current()->Quit();
     99 }
    100 
    101 void UMAHistogramHelper::CheckBucketCount(
    102     const std::string& name,
    103     base::HistogramBase::Sample sample,
    104     base::HistogramBase::Count expected_count,
    105     base::HistogramSamples& samples) {
    106   int actual_count = samples.GetCount(sample);
    107   if (histogram_snapshots.count(name))
    108     actual_count -= histogram_snapshots[name]->GetCount(sample);
    109   EXPECT_EQ(expected_count, actual_count)
    110       << "Histogram \"" << name
    111       << "\" does not have the right number of samples (" << expected_count
    112       << ") in the expected bucket (" << sample << "). It has (" << actual_count
    113       << ").";
    114 }
    115 
    116 void UMAHistogramHelper::CheckTotalCount(
    117     const std::string& name,
    118     base::HistogramBase::Count expected_count,
    119     base::HistogramSamples& samples) {
    120   int actual_count = samples.TotalCount();
    121   if (histogram_snapshots.count(name))
    122     actual_count -= histogram_snapshots[name]->TotalCount();
    123   EXPECT_EQ(expected_count, actual_count)
    124       << "Histogram \"" << name
    125       << "\" does not have the right total number of samples ("
    126       << expected_count << "). It has (" << actual_count << ").";
    127 }
    128