| Index: base/metrics/statistics_recorder_unittest.cc
|
| diff --git a/base/metrics/statistics_recorder_unittest.cc b/base/metrics/statistics_recorder_unittest.cc
|
| index d26df6901bad53d83ae06477cd5be557a3222d73..b18c5803893864259862f3b4bf116ebaf5739665 100644
|
| --- a/base/metrics/statistics_recorder_unittest.cc
|
| +++ b/base/metrics/statistics_recorder_unittest.cc
|
| @@ -4,9 +4,11 @@
|
|
|
| #include <vector>
|
|
|
| +#include "base/bind.h"
|
| #include "base/json/json_reader.h"
|
| #include "base/memory/scoped_ptr.h"
|
| -#include "base/metrics/histogram.h"
|
| +#include "base/metrics/histogram_macros.h"
|
| +#include "base/metrics/sparse_histogram.h"
|
| #include "base/metrics/statistics_recorder.h"
|
| #include "base/values.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
| @@ -312,4 +314,178 @@ TEST_F(StatisticsRecorderTest, ToJSON) {
|
| EXPECT_TRUE(json.empty());
|
| }
|
|
|
| +namespace {
|
| +
|
| +// CallbackCheckWrapper is simply a convenient way to check and store that
|
| +// a callback was actually run.
|
| +struct CallbackCheckWrapper {
|
| + CallbackCheckWrapper() : called(false), last_histogram_value(0) {}
|
| +
|
| + void OnHistogramChanged(base::HistogramBase::Sample histogram_value) {
|
| + called = true;
|
| + last_histogram_value = histogram_value;
|
| + }
|
| +
|
| + bool called;
|
| + base::HistogramBase::Sample last_histogram_value;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +// Check that you can't overwrite the callback with another.
|
| +TEST_F(StatisticsRecorderTest, SetCallbackFailsWithoutHistogramTest) {
|
| + CallbackCheckWrapper callback_wrapper;
|
| +
|
| + bool result = base::StatisticsRecorder::SetCallback(
|
| + "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| + EXPECT_TRUE(result);
|
| +
|
| + result = base::StatisticsRecorder::SetCallback(
|
| + "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| + EXPECT_FALSE(result);
|
| +}
|
| +
|
| +// Check that you can't overwrite the callback with another.
|
| +TEST_F(StatisticsRecorderTest, SetCallbackFailsWithHistogramTest) {
|
| + HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10,
|
| + HistogramBase::kNoFlags);
|
| + EXPECT_TRUE(histogram);
|
| +
|
| + CallbackCheckWrapper callback_wrapper;
|
| +
|
| + bool result = base::StatisticsRecorder::SetCallback(
|
| + "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| + EXPECT_TRUE(result);
|
| + EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
|
| + base::HistogramBase::kCallbackExists);
|
| +
|
| + result = base::StatisticsRecorder::SetCallback(
|
| + "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| + EXPECT_FALSE(result);
|
| + EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
|
| + base::HistogramBase::kCallbackExists);
|
| +
|
| + histogram->Add(1);
|
| +
|
| + EXPECT_TRUE(callback_wrapper.called);
|
| +}
|
| +
|
| +// Check that you can't overwrite the callback with another.
|
| +TEST_F(StatisticsRecorderTest, ClearCallbackSuceedsWithHistogramTest) {
|
| + HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10,
|
| + HistogramBase::kNoFlags);
|
| + EXPECT_TRUE(histogram);
|
| +
|
| + CallbackCheckWrapper callback_wrapper;
|
| +
|
| + bool result = base::StatisticsRecorder::SetCallback(
|
| + "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| + EXPECT_TRUE(result);
|
| + EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists,
|
| + base::HistogramBase::kCallbackExists);
|
| +
|
| + base::StatisticsRecorder::ClearCallback("TestHistogram");
|
| + EXPECT_EQ(histogram->flags() & base::HistogramBase::kCallbackExists, 0);
|
| +
|
| + histogram->Add(1);
|
| +
|
| + EXPECT_FALSE(callback_wrapper.called);
|
| +}
|
| +
|
| +// Check that callback is used.
|
| +TEST_F(StatisticsRecorderTest, CallbackUsedTest) {
|
| + {
|
| + HistogramBase* histogram = Histogram::FactoryGet(
|
| + "TestHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
|
| + EXPECT_TRUE(histogram);
|
| +
|
| + CallbackCheckWrapper callback_wrapper;
|
| +
|
| + base::StatisticsRecorder::SetCallback(
|
| + "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| +
|
| + histogram->Add(1);
|
| +
|
| + EXPECT_TRUE(callback_wrapper.called);
|
| + EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
|
| + }
|
| +
|
| + {
|
| + HistogramBase* linear_histogram = LinearHistogram::FactoryGet(
|
| + "TestLinearHistogram", 1, 1000, 10, HistogramBase::kNoFlags);
|
| +
|
| + CallbackCheckWrapper callback_wrapper;
|
| +
|
| + base::StatisticsRecorder::SetCallback(
|
| + "TestLinearHistogram",
|
| + base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| +
|
| + linear_histogram->Add(1);
|
| +
|
| + EXPECT_TRUE(callback_wrapper.called);
|
| + EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
|
| + }
|
| +
|
| + {
|
| + std::vector<int> custom_ranges;
|
| + custom_ranges.push_back(1);
|
| + custom_ranges.push_back(5);
|
| + HistogramBase* custom_histogram = CustomHistogram::FactoryGet(
|
| + "TestCustomHistogram", custom_ranges, HistogramBase::kNoFlags);
|
| +
|
| + CallbackCheckWrapper callback_wrapper;
|
| +
|
| + base::StatisticsRecorder::SetCallback(
|
| + "TestCustomHistogram",
|
| + base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| +
|
| + custom_histogram->Add(1);
|
| +
|
| + EXPECT_TRUE(callback_wrapper.called);
|
| + EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
|
| + }
|
| +
|
| + {
|
| + HistogramBase* custom_histogram = SparseHistogram::FactoryGet(
|
| + "TestSparseHistogram", HistogramBase::kNoFlags);
|
| +
|
| + CallbackCheckWrapper callback_wrapper;
|
| +
|
| + base::StatisticsRecorder::SetCallback(
|
| + "TestSparseHistogram",
|
| + base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| +
|
| + custom_histogram->Add(1);
|
| +
|
| + EXPECT_TRUE(callback_wrapper.called);
|
| + EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
|
| + }
|
| +}
|
| +
|
| +// Check that setting a callback before the histogram exists works.
|
| +TEST_F(StatisticsRecorderTest, CallbackUsedBeforeHistogramCreatedTest) {
|
| + CallbackCheckWrapper callback_wrapper;
|
| +
|
| + base::StatisticsRecorder::SetCallback(
|
| + "TestHistogram", base::Bind(&CallbackCheckWrapper::OnHistogramChanged,
|
| + base::Unretained(&callback_wrapper)));
|
| +
|
| + HistogramBase* histogram = Histogram::FactoryGet("TestHistogram", 1, 1000, 10,
|
| + HistogramBase::kNoFlags);
|
| + EXPECT_TRUE(histogram);
|
| + histogram->Add(1);
|
| +
|
| + EXPECT_TRUE(callback_wrapper.called);
|
| + EXPECT_EQ(callback_wrapper.last_histogram_value, 1);
|
| +}
|
| +
|
| } // namespace base
|
|
|