Index: chrome/browser/metrics/subprocess_metrics_provider_unittest.cc |
diff --git a/chrome/browser/metrics/subprocess_metrics_provider_unittest.cc b/chrome/browser/metrics/subprocess_metrics_provider_unittest.cc |
deleted file mode 100644 |
index 3eadb2e50727dccb9c0b7efd2fad10aa9cb91f61..0000000000000000000000000000000000000000 |
--- a/chrome/browser/metrics/subprocess_metrics_provider_unittest.cc |
+++ /dev/null |
@@ -1,214 +0,0 @@ |
-// Copyright 2016 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/browser/metrics/subprocess_metrics_provider.h" |
- |
-#include <memory> |
- |
-#include "base/memory/ptr_util.h" |
-#include "base/memory/shared_memory.h" |
-#include "base/metrics/histogram.h" |
-#include "base/metrics/histogram_flattener.h" |
-#include "base/metrics/histogram_snapshot_manager.h" |
-#include "base/metrics/persistent_histogram_allocator.h" |
-#include "base/metrics/persistent_memory_allocator.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace { |
- |
-const uint32_t TEST_MEMORY_SIZE = 64 << 10; // 64 KiB |
- |
-class HistogramFlattenerDeltaRecorder : public base::HistogramFlattener { |
- public: |
- HistogramFlattenerDeltaRecorder() {} |
- |
- void RecordDelta(const base::HistogramBase& histogram, |
- const base::HistogramSamples& snapshot) override { |
- recorded_delta_histogram_names_.push_back(histogram.histogram_name()); |
- } |
- |
- void InconsistencyDetected( |
- base::HistogramBase::Inconsistency problem) override { |
- ASSERT_TRUE(false); |
- } |
- |
- void UniqueInconsistencyDetected( |
- base::HistogramBase::Inconsistency problem) override { |
- ASSERT_TRUE(false); |
- } |
- |
- void InconsistencyDetectedInLoggedCount(int amount) override { |
- ASSERT_TRUE(false); |
- } |
- |
- std::vector<std::string> GetRecordedDeltaHistogramNames() { |
- return recorded_delta_histogram_names_; |
- } |
- |
- private: |
- std::vector<std::string> recorded_delta_histogram_names_; |
- |
- DISALLOW_COPY_AND_ASSIGN(HistogramFlattenerDeltaRecorder); |
-}; |
- |
-} // namespace |
- |
-class SubprocessMetricsProviderTest : public testing::Test { |
- protected: |
- SubprocessMetricsProviderTest() { |
- // Get this first so it isn't created inside a persistent allocator. |
- base::PersistentHistogramAllocator::GetCreateHistogramResultHistogram(); |
- |
- // RecordHistogramSnapshots needs to be called beause it uses a histogram |
- // macro which caches a pointer to a histogram. If not done before setting |
- // a persistent global allocator, then it would point into memory that |
- // will go away. The easiest way to call it is through an existing utility |
- // method. |
- GetSnapshotHistogramCount(); |
- |
- // Create some shared-memory to pass between global allocator and provider. |
- std::unique_ptr<base::SharedMemory> shmem(new base::SharedMemory()); |
- DCHECK(shmem->CreateAndMapAnonymous(TEST_MEMORY_SIZE)); |
- |
- // Keep a weak-pointer to the shared memory since it will be hidden once |
- // made part of the global histogram allocator. |
- shared_memory_ = shmem.get(); |
- |
- // Use the shared memory for all histograms created by this process. |
- base::GlobalHistogramAllocator::CreateWithSharedMemory( |
- std::move(shmem), TEST_MEMORY_SIZE, 0, ""); |
- |
- // Enable metrics reporting by default. |
- provider_.OnRecordingEnabled(); |
- } |
- |
- ~SubprocessMetricsProviderTest() override { |
- base::GlobalHistogramAllocator::ReleaseForTesting(); |
- } |
- |
- SubprocessMetricsProvider* provider() { return &provider_; } |
- |
- base::SharedMemory* shared_memory() { return shared_memory_; } |
- |
- std::unique_ptr<base::PersistentHistogramAllocator> GetDuplicateAllocator() { |
- base::SharedMemoryHandle memory_handle; |
- DCHECK(shared_memory_->ShareToProcess(base::GetCurrentProcessHandle(), |
- &memory_handle)); |
- |
- std::unique_ptr<base::SharedMemory> shmem( |
- new base::SharedMemory(memory_handle, /*readonly=*/false)); |
- DCHECK(shmem->Map(TEST_MEMORY_SIZE)); |
- |
- return WrapUnique(new base::PersistentHistogramAllocator( |
- WrapUnique(new base::SharedPersistentMemoryAllocator( |
- std::move(shmem), 0, "", false)))); |
- } |
- |
- size_t GetSnapshotHistogramCount() { |
- HistogramFlattenerDeltaRecorder flattener; |
- base::HistogramSnapshotManager snapshot_manager(&flattener); |
- snapshot_manager.StartDeltas(); |
- provider_.RecordHistogramSnapshots(&snapshot_manager); |
- snapshot_manager.FinishDeltas(); |
- return flattener.GetRecordedDeltaHistogramNames().size(); |
- } |
- |
- void EnableRecording() { provider_.OnRecordingEnabled(); } |
- void DisableRecording() { provider_.OnRecordingDisabled(); } |
- |
- void RegisterSubprocessAllocator( |
- int id, |
- std::unique_ptr<base::PersistentHistogramAllocator> allocator) { |
- provider_.RegisterSubprocessAllocator(id, std::move(allocator)); |
- } |
- |
- void DeregisterSubprocessAllocator(int id) { |
- provider_.DeregisterSubprocessAllocator(id); |
- } |
- |
- private: |
- SubprocessMetricsProvider provider_; |
- base::SharedMemory* shared_memory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(SubprocessMetricsProviderTest); |
-}; |
- |
-TEST_F(SubprocessMetricsProviderTest, SnapshotMetrics) { |
- base::HistogramBase* foo = base::Histogram::FactoryGet("foo", 1, 100, 10, 0); |
- base::HistogramBase* bar = base::Histogram::FactoryGet("bar", 1, 100, 10, 0); |
- foo->Add(42); |
- bar->Add(84); |
- |
- // Register an allocator that duplicates the global allocator. |
- RegisterSubprocessAllocator(123, GetDuplicateAllocator()); |
- |
- // Recording should find the two histograms created in persistent memory. |
- EXPECT_EQ(2U, GetSnapshotHistogramCount()); |
- |
- // A second run should have nothing to produce. |
- EXPECT_EQ(0U, GetSnapshotHistogramCount()); |
- |
- // Create a new histogram and update existing ones. Should now report 3 items. |
- base::HistogramBase* baz = base::Histogram::FactoryGet("baz", 1, 100, 10, 0); |
- baz->Add(1969); |
- foo->Add(10); |
- bar->Add(20); |
- EXPECT_EQ(3U, GetSnapshotHistogramCount()); |
- |
- // Ensure that deregistering still keeps allocator around for final report. |
- foo->Add(10); |
- bar->Add(20); |
- DeregisterSubprocessAllocator(123); |
- EXPECT_EQ(2U, GetSnapshotHistogramCount()); |
- |
- // Further snapshots should be empty even if things have changed. |
- foo->Add(10); |
- bar->Add(20); |
- EXPECT_EQ(0U, GetSnapshotHistogramCount()); |
-} |
- |
-TEST_F(SubprocessMetricsProviderTest, EnableDisable) { |
- base::HistogramBase* foo = base::Histogram::FactoryGet("foo", 1, 100, 10, 0); |
- base::HistogramBase* bar = base::Histogram::FactoryGet("bar", 1, 100, 10, 0); |
- |
- // Simulate some "normal" operation... |
- RegisterSubprocessAllocator(123, GetDuplicateAllocator()); |
- foo->Add(42); |
- bar->Add(84); |
- EXPECT_EQ(2U, GetSnapshotHistogramCount()); |
- foo->Add(42); |
- bar->Add(84); |
- EXPECT_EQ(2U, GetSnapshotHistogramCount()); |
- |
- // Ensure that disable/enable reporting won't affect "live" allocators. |
- DisableRecording(); |
- EnableRecording(); |
- foo->Add(42); |
- bar->Add(84); |
- EXPECT_EQ(2U, GetSnapshotHistogramCount()); |
- |
- // Ensure that allocators are released when reporting is disabled. |
- DisableRecording(); |
- DeregisterSubprocessAllocator(123); |
- EnableRecording(); |
- foo->Add(42); |
- bar->Add(84); |
- EXPECT_EQ(0U, GetSnapshotHistogramCount()); |
- |
- // Ensure that allocators added when reporting disabled will work if enabled. |
- DisableRecording(); |
- RegisterSubprocessAllocator(123, GetDuplicateAllocator()); |
- EnableRecording(); |
- foo->Add(42); |
- bar->Add(84); |
- EXPECT_EQ(2U, GetSnapshotHistogramCount()); |
- |
- // Ensure that last-chance allocators are released if reporting is disabled. |
- DeregisterSubprocessAllocator(123); |
- DisableRecording(); |
- EnableRecording(); |
- foo->Add(42); |
- bar->Add(84); |
- EXPECT_EQ(0U, GetSnapshotHistogramCount()); |
-} |