Index: chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc |
diff --git a/chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc b/chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc |
index 173ebe02612d4185a20e5d9a3f6f364494234f22..0bf8c5cb6c2daa21a7c7e95fe5f7db8e3c9d3fda 100644 |
--- a/chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc |
+++ b/chrome/browser/metrics/process_memory_metrics_emitter_browsertest.cc |
@@ -5,14 +5,38 @@ |
#include "chrome/browser/metrics/process_memory_metrics_emitter.h" |
#include "base/message_loop/message_loop.h" |
+#include "base/test/histogram_tester.h" |
+#include "base/trace_event/memory_dump_manager.h" |
+#include "base/trace_event/trace_config_memory_test_util.h" |
#include "chrome/test/base/in_process_browser_test.h" |
+#include "chrome/test/base/tracing.h" |
+#include "chrome/test/base/ui_test_utils.h" |
#include "content/public/test/test_utils.h" |
+#include "url/gurl.h" |
namespace { |
+using base::trace_event::MemoryDumpType; |
+ |
+void RequestGlobalDumpCallback(base::Closure quit_closure, |
+ uint64_t, |
+ bool success) { |
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure); |
+ ASSERT_TRUE(success); |
+} |
+ |
+void OnStartTracingDoneCallback( |
+ base::trace_event::MemoryDumpLevelOfDetail explicit_dump_type, |
+ base::Closure quit_closure) { |
+ base::trace_event::MemoryDumpManager::GetInstance()->RequestGlobalDump( |
+ MemoryDumpType::EXPLICITLY_TRIGGERED, explicit_dump_type, |
+ Bind(&RequestGlobalDumpCallback, quit_closure)); |
+} |
+ |
class ProcessMemoryMetricsEmitterFake : public ProcessMemoryMetricsEmitter { |
public: |
- ProcessMemoryMetricsEmitterFake() {} |
+ explicit ProcessMemoryMetricsEmitterFake(base::RunLoop* run_loop) |
+ : run_loop_(run_loop) {} |
private: |
~ProcessMemoryMetricsEmitterFake() override {} |
@@ -22,12 +46,47 @@ class ProcessMemoryMetricsEmitterFake : public ProcessMemoryMetricsEmitter { |
bool success, |
memory_instrumentation::mojom::GlobalMemoryDumpPtr ptr) override { |
EXPECT_TRUE(success); |
- base::MessageLoop::current()->QuitWhenIdle(); |
+ ProcessMemoryMetricsEmitter::ReceivedMemoryDump(dump_guid, success, |
+ std::move(ptr)); |
+ if (run_loop_) |
+ run_loop_->Quit(); |
} |
+ base::RunLoop* run_loop_; |
+ |
DISALLOW_COPY_AND_ASSIGN(ProcessMemoryMetricsEmitterFake); |
}; |
+void CheckMemoryMetric(const std::string& name, |
+ const base::HistogramTester& histogram_tester, |
+ int count) { |
+ histogram_tester.ExpectTotalCount(name, count); |
+ std::unique_ptr<base::HistogramSamples> samples( |
+ histogram_tester.GetHistogramSamplesSinceCreation(name)); |
+ ASSERT_TRUE(samples); |
+ EXPECT_GT(samples->sum(), 0u) << name; |
+ |
+ // As a sanity check, no memory stat should exceed 1 GB. |
+ int64_t maximum_expected_size = 1ll << 30 * count; |
+ EXPECT_LT(samples->sum(), maximum_expected_size) << name; |
+} |
+ |
+void CheckAllMemoryMetrics(const base::HistogramTester& histogram_tester, |
+ int count) { |
+ CheckMemoryMetric("Memory.Experimental.Browser2.Malloc", histogram_tester, |
+ count); |
+ CheckMemoryMetric("Memory.Experimental.Browser2.Resident", histogram_tester, |
+ count); |
+ CheckMemoryMetric("Memory.Experimental.Renderer2.Malloc", histogram_tester, |
+ count); |
+ CheckMemoryMetric("Memory.Experimental.Renderer2.Resident", histogram_tester, |
+ count); |
+ CheckMemoryMetric("Memory.Experimental.Renderer2.BlinkGC", histogram_tester, |
+ count); |
+ CheckMemoryMetric("Memory.Experimental.Renderer2.V8", histogram_tester, |
+ count); |
+} |
+ |
} // namespace |
class ProcessMemoryMetricsEmitterTest : public InProcessBrowserTest { |
@@ -40,13 +99,69 @@ class ProcessMemoryMetricsEmitterTest : public InProcessBrowserTest { |
}; |
IN_PROC_BROWSER_TEST_F(ProcessMemoryMetricsEmitterTest, FetchAndEmitMetrics) { |
+ base::HistogramTester histogram_tester; |
+ base::RunLoop run_loop; |
+ |
+ // Intentionally let emitter leave scope to check that it correctly keeps |
+ // itself alive. |
+ { |
+ scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter( |
+ new ProcessMemoryMetricsEmitterFake(&run_loop)); |
+ emitter->FetchAndEmitProcessMemoryMetrics(); |
+ } |
+ |
+ run_loop.Run(); |
+ |
+ CheckAllMemoryMetrics(histogram_tester, 1); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ProcessMemoryMetricsEmitterTest, FetchDuringTrace) { |
+ base::HistogramTester histogram_tester; |
+ base::RunLoop run_loop; |
+ |
+ base::trace_event::TraceConfig trace_config( |
+ base::trace_event::TraceConfigMemoryTestUtil:: |
+ GetTraceConfig_EmptyTriggers()); |
+ ASSERT_TRUE(tracing::BeginTracingWithTraceConfig( |
+ trace_config, Bind(&OnStartTracingDoneCallback, |
+ base::trace_event::MemoryDumpLevelOfDetail::DETAILED, |
+ run_loop.QuitClosure()))); |
+ |
// Intentionally let emitter leave scope to check that it correctly keeps |
// itself alive. |
{ |
scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter( |
- new ProcessMemoryMetricsEmitterFake); |
+ new ProcessMemoryMetricsEmitterFake(&run_loop)); |
emitter->FetchAndEmitProcessMemoryMetrics(); |
} |
- content::RunMessageLoop(); |
+ GURL url1("about:blank"); |
+ ui_test_utils::NavigateToURLWithDisposition( |
+ browser(), url1, WindowOpenDisposition::NEW_FOREGROUND_TAB, |
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION); |
+ run_loop.Run(); |
+ |
+ std::string json_events; |
+ ASSERT_TRUE(tracing::EndTracing(&json_events)); |
+ EXPECT_NE(0u, json_events.length()); |
+ |
+ CheckAllMemoryMetrics(histogram_tester, 1); |
+} |
+ |
+IN_PROC_BROWSER_TEST_F(ProcessMemoryMetricsEmitterTest, FetchThreeTimes) { |
+ base::HistogramTester histogram_tester; |
+ base::RunLoop run_loop; |
+ |
+ int count = 3; |
+ for (int i = 0; i < count; ++i) { |
+ // Only the last emitter should stop the run loop. |
+ scoped_refptr<ProcessMemoryMetricsEmitterFake> emitter( |
dcheng
2017/05/13 20:22:37
auto emitter = base::MakeShared<ProcessMemoryMetri
erikchen
2017/05/14 04:49:16
Done.
|
+ new ProcessMemoryMetricsEmitterFake((i == count - 1) ? &run_loop |
+ : nullptr)); |
+ emitter->FetchAndEmitProcessMemoryMetrics(); |
+ } |
+ |
+ run_loop.Run(); |
+ |
+ CheckAllMemoryMetrics(histogram_tester, count); |
} |