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() {