// Copyright (c) 2012 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 "chrome/test/base/uma_histogram_helper.h"
#include "base/bind.h"
#include "base/metrics/statistics_recorder.h"
#include "base/test/test_timeouts.h"
#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/histogram_fetcher.h"
UMAHistogramHelper::UMAHistogramHelper() {
}
void UMAHistogramHelper::Fetch() {
base::Closure callback = base::Bind(&UMAHistogramHelper::FetchCallback,
base::Unretained(this));
content::FetchHistogramsAsynchronously(
base::MessageLoop::current(),
callback,
// If this call times out, it means that a child process is not
// responding, which is something we should not ignore. The timeout is
// set to be longer than the normal browser test timeout so that it will
// be prempted by the normal timeout.
TestTimeouts::action_max_timeout() * 2);
content::RunMessageLoop();
}
void UMAHistogramHelper::ExpectUniqueSample(
const std::string& name,
base::HistogramBase::Sample sample,
base::HistogramBase::Count expected_count) {
base::HistogramBase* histogram =
base::StatisticsRecorder::FindHistogram(name);
EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram)
<< "Histogram \"" << name << "\" does not exist.";
if (histogram) {
scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
CheckBucketCount(name, sample, expected_count, *samples);
CheckTotalCount(name, expected_count, *samples);
}
}
void UMAHistogramHelper::ExpectTotalCount(
const std::string& name,
base::HistogramBase::Count count) {
base::HistogramBase* histogram =
base::StatisticsRecorder::FindHistogram(name);
EXPECT_NE(static_cast<base::HistogramBase*>(NULL), histogram)
<< "Histogram \"" << name << "\" does not exist.";
if (histogram) {
scoped_ptr<base::HistogramSamples> samples(histogram->SnapshotSamples());
CheckTotalCount(name, count, *samples);
}
}
void UMAHistogramHelper::FetchCallback() {
base::MessageLoopForUI::current()->Quit();
}
void UMAHistogramHelper::CheckBucketCount(
const std::string& name,
base::HistogramBase::Sample sample,
base::HistogramBase::Count expected_count,
base::HistogramSamples& samples) {
EXPECT_EQ(expected_count, samples.GetCount(sample))
<< "Histogram \"" << name
<< "\" does not have the right number of samples (" << expected_count
<< ") in the expected bucket (" << sample << ").";
}
void UMAHistogramHelper::CheckTotalCount(
const std::string& name,
base::HistogramBase::Count expected_count,
base::HistogramSamples& samples) {
EXPECT_EQ(expected_count, samples.TotalCount())
<< "Histogram \"" << name
<< "\" does not have the right total number of samples ("
<< expected_count << ").";
}