Create ForTesting method rather than declaring a dozen "friend" classes.
BUG=546019
Review-Url: https://codereview.chromium.org/2036643004
Cr-Commit-Position: refs/heads/master@{#397749}
CrOS-Libchrome-Original-Commit: 9e3835ccbdd5f3065f77c1890b7535a11ded39a2
diff --git a/base/metrics/histogram_base_unittest.cc b/base/metrics/histogram_base_unittest.cc
index 5ce39ca..1eb8fd4 100644
--- a/base/metrics/histogram_base_unittest.cc
+++ b/base/metrics/histogram_base_unittest.cc
@@ -29,7 +29,7 @@
// It is necessary to fully destruct any existing StatisticsRecorder
// before creating a new one.
statistics_recorder_.reset();
- statistics_recorder_.reset(new StatisticsRecorder());
+ statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
}
HistogramBase* GetCreationReportHistogram(const std::string& name) {
diff --git a/base/metrics/histogram_delta_serialization_unittest.cc b/base/metrics/histogram_delta_serialization_unittest.cc
index 80a7009..719bc70 100644
--- a/base/metrics/histogram_delta_serialization_unittest.cc
+++ b/base/metrics/histogram_delta_serialization_unittest.cc
@@ -14,7 +14,8 @@
namespace base {
TEST(HistogramDeltaSerializationTest, DeserializeHistogramAndAddSamples) {
- StatisticsRecorder statistic_recorder;
+ std::unique_ptr<StatisticsRecorder> statistic_recorder(
+ StatisticsRecorder::CreateTemporaryForTesting());
HistogramDeltaSerialization serializer("HistogramDeltaSerializationTest");
std::vector<std::string> deltas;
// Nothing was changed yet.
diff --git a/base/metrics/histogram_snapshot_manager_unittest.cc b/base/metrics/histogram_snapshot_manager_unittest.cc
index 8ec03da..6d53c86 100644
--- a/base/metrics/histogram_snapshot_manager_unittest.cc
+++ b/base/metrics/histogram_snapshot_manager_unittest.cc
@@ -68,11 +68,12 @@
class HistogramSnapshotManagerTest : public testing::Test {
protected:
HistogramSnapshotManagerTest()
- : histogram_snapshot_manager_(&histogram_flattener_delta_recorder_) {}
+ : statistics_recorder_(StatisticsRecorder::CreateTemporaryForTesting()),
+ histogram_snapshot_manager_(&histogram_flattener_delta_recorder_) {}
~HistogramSnapshotManagerTest() override {}
- StatisticsRecorder statistics_recorder_;
+ std::unique_ptr<StatisticsRecorder> statistics_recorder_;
HistogramFlattenerDeltaRecorder histogram_flattener_delta_recorder_;
HistogramSnapshotManager histogram_snapshot_manager_;
};
diff --git a/base/metrics/histogram_unittest.cc b/base/metrics/histogram_unittest.cc
index 668ac1b..5c2ca68 100644
--- a/base/metrics/histogram_unittest.cc
+++ b/base/metrics/histogram_unittest.cc
@@ -56,7 +56,7 @@
void InitializeStatisticsRecorder() {
DCHECK(!statistics_recorder_);
- statistics_recorder_.reset(new StatisticsRecorder());
+ statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
}
void UninitializeStatisticsRecorder() {
diff --git a/base/metrics/persistent_histogram_allocator_unittest.cc b/base/metrics/persistent_histogram_allocator_unittest.cc
index a8743d2..eee6756 100644
--- a/base/metrics/persistent_histogram_allocator_unittest.cc
+++ b/base/metrics/persistent_histogram_allocator_unittest.cc
@@ -18,7 +18,10 @@
protected:
const int32_t kAllocatorMemorySize = 64 << 10; // 64 KiB
- PersistentHistogramAllocatorTest() { CreatePersistentHistogramAllocator(); }
+ PersistentHistogramAllocatorTest()
+ : statistics_recorder_(StatisticsRecorder::CreateTemporaryForTesting()) {
+ CreatePersistentHistogramAllocator();
+ }
~PersistentHistogramAllocatorTest() override {
DestroyPersistentHistogramAllocator();
}
@@ -40,11 +43,7 @@
GlobalHistogramAllocator::ReleaseForTesting();
}
- std::unique_ptr<StatisticsRecorder> CreateLocalStatisticsRecorder() {
- return WrapUnique(new StatisticsRecorder());
- }
-
- StatisticsRecorder statistics_recorder_;
+ std::unique_ptr<StatisticsRecorder> statistics_recorder_;
std::unique_ptr<char[]> allocator_memory_;
PersistentMemoryAllocator* allocator_ = nullptr;
@@ -133,7 +132,7 @@
// Create a local StatisticsRecorder in which the newly created histogram
// will be recorded.
std::unique_ptr<StatisticsRecorder> local_sr =
- CreateLocalStatisticsRecorder();
+ StatisticsRecorder::CreateTemporaryForTesting();
EXPECT_EQ(0U, StatisticsRecorder::GetHistogramCount());
HistogramBase* histogram = LinearHistogram::FactoryGet(
diff --git a/base/metrics/sparse_histogram_unittest.cc b/base/metrics/sparse_histogram_unittest.cc
index fbff977..eab7790 100644
--- a/base/metrics/sparse_histogram_unittest.cc
+++ b/base/metrics/sparse_histogram_unittest.cc
@@ -48,7 +48,7 @@
void InitializeStatisticsRecorder() {
DCHECK(!statistics_recorder_);
- statistics_recorder_.reset(new StatisticsRecorder());
+ statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
}
void UninitializeStatisticsRecorder() {
diff --git a/base/metrics/statistics_recorder.cc b/base/metrics/statistics_recorder.cc
index 4eecdda..151955a 100644
--- a/base/metrics/statistics_recorder.cc
+++ b/base/metrics/statistics_recorder.cc
@@ -10,6 +10,7 @@
#include "base/debug/leak_annotations.h"
#include "base/json/string_escape.h"
#include "base/logging.h"
+#include "base/memory/ptr_util.h"
#include "base/metrics/histogram.h"
#include "base/metrics/metrics_hashes.h"
#include "base/metrics/persistent_histogram_allocator.h"
@@ -421,6 +422,12 @@
}
// static
+std::unique_ptr<StatisticsRecorder>
+StatisticsRecorder::CreateTemporaryForTesting() {
+ return WrapUnique(new StatisticsRecorder());
+}
+
+// static
void StatisticsRecorder::UninitializeForTesting() {
// Stop now if it's never been initialized.
if (lock_ == NULL || histograms_ == NULL)
diff --git a/base/metrics/statistics_recorder.h b/base/metrics/statistics_recorder.h
index f40bb4e..002758e 100644
--- a/base/metrics/statistics_recorder.h
+++ b/base/metrics/statistics_recorder.h
@@ -172,7 +172,15 @@
// memory is being released.
static void ForgetHistogramForTesting(base::StringPiece name);
- // Reset any global instance of the statistics-recorder that was created
+ // Creates a local StatisticsRecorder object for testing purposes. All new
+ // histograms will be registered in it until it is destructed or pushed
+ // aside for the lifetime of yet another SR object. The destruction of the
+ // returned object will re-activate the previous one. Always release SR
+ // objects in the opposite order to which they're created.
+ static std::unique_ptr<StatisticsRecorder> CreateTemporaryForTesting()
+ WARN_UNUSED_RESULT;
+
+ // Resets any global instance of the statistics-recorder that was created
// by a call to Initialize().
static void UninitializeForTesting();
@@ -187,17 +195,6 @@
typedef std::map<uint32_t, std::list<const BucketRanges*>*> RangesMap;
friend struct DefaultLazyInstanceTraits<StatisticsRecorder>;
- friend class ::SubprocessMetricsProviderTest;
- friend class HistogramBaseTest;
- friend class HistogramSnapshotManagerTest;
- friend class HistogramTest;
- friend class JsonPrefStoreTest;
- friend class PersistentHistogramAllocatorTest;
- friend class SharedHistogramTest;
- friend class SparseHistogramTest;
- friend class StatisticsRecorderTest;
- FRIEND_TEST_ALL_PREFIXES(HistogramDeltaSerializationTest,
- DeserializeHistogramAndAddSamples);
// Imports histograms from global persistent memory. The global lock must
// not be held during this call.
diff --git a/base/metrics/statistics_recorder_unittest.cc b/base/metrics/statistics_recorder_unittest.cc
index 813fbd1..95125b8 100644
--- a/base/metrics/statistics_recorder_unittest.cc
+++ b/base/metrics/statistics_recorder_unittest.cc
@@ -47,7 +47,7 @@
void InitializeStatisticsRecorder() {
DCHECK(!statistics_recorder_);
StatisticsRecorder::UninitializeForTesting();
- statistics_recorder_.reset(new StatisticsRecorder());
+ statistics_recorder_ = StatisticsRecorder::CreateTemporaryForTesting();
}
void UninitializeStatisticsRecorder() {