Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(60)

Side by Side Diff: base/trace_event/memory_dump_manager_unittest.cc

Issue 1618703004: [MemoryInfra] Support dump providers running on SequencedTaskRunner (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixes. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « base/trace_event/memory_dump_manager.cc ('k') | base/trace_event/memory_dump_provider.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/trace_event/memory_dump_manager.h" 5 #include "base/trace_event/memory_dump_manager.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/bind_helpers.h" 11 #include "base/bind_helpers.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/message_loop/message_loop.h" 13 #include "base/message_loop/message_loop.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "base/synchronization/waitable_event.h" 16 #include "base/synchronization/waitable_event.h"
17 #include "base/test/test_io_thread.h" 17 #include "base/test/test_io_thread.h"
18 #include "base/test/trace_event_analyzer.h" 18 #include "base/test/trace_event_analyzer.h"
19 #include "base/thread_task_runner_handle.h" 19 #include "base/thread_task_runner_handle.h"
20 #include "base/threading/platform_thread.h" 20 #include "base/threading/platform_thread.h"
21 #include "base/threading/sequenced_worker_pool.h"
21 #include "base/threading/thread.h" 22 #include "base/threading/thread.h"
22 #include "base/trace_event/memory_dump_provider.h" 23 #include "base/trace_event/memory_dump_provider.h"
23 #include "base/trace_event/process_memory_dump.h" 24 #include "base/trace_event/process_memory_dump.h"
24 #include "base/trace_event/trace_buffer.h" 25 #include "base/trace_event/trace_buffer.h"
25 #include "base/trace_event/trace_config_memory_test_util.h" 26 #include "base/trace_event/trace_config_memory_test_util.h"
26 #include "testing/gmock/include/gmock/gmock.h" 27 #include "testing/gmock/include/gmock/gmock.h"
27 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
28 29
29 using testing::_; 30 using testing::_;
30 using testing::AnyNumber; 31 using testing::AnyNumber;
(...skipping 11 matching lines...) Expand all
42 } 43 }
43 44
44 MATCHER(IsLightDump, "") { 45 MATCHER(IsLightDump, "") {
45 return arg.level_of_detail == MemoryDumpLevelOfDetail::LIGHT; 46 return arg.level_of_detail == MemoryDumpLevelOfDetail::LIGHT;
46 } 47 }
47 48
48 namespace { 49 namespace {
49 50
50 void RegisterDumpProvider( 51 void RegisterDumpProvider(
51 MemoryDumpProvider* mdp, 52 MemoryDumpProvider* mdp,
53 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
54 const MemoryDumpProvider::Options& options,
55 bool dumps_on_single_thread_task_runner) {
56 MemoryDumpManager* mdm = MemoryDumpManager::GetInstance();
57 mdm->set_dumper_registrations_ignored_for_testing(false);
58 const char* kMDPName = "TestDumpProvider";
59 if (dumps_on_single_thread_task_runner) {
60 scoped_refptr<base::SingleThreadTaskRunner> single_thread_task_runner =
61 static_cast<base::SingleThreadTaskRunner*>(task_runner.get());
62 mdm->RegisterDumpProvider(mdp, kMDPName,
63 std::move(single_thread_task_runner), options);
64 } else {
65 mdm->RegisterDumpProviderWithSequencedTaskRunner(mdp, kMDPName, task_runner,
66 options);
67 }
68 mdm->set_dumper_registrations_ignored_for_testing(true);
69 }
70
71 void RegisterDumpProvider(
72 MemoryDumpProvider* mdp,
52 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, 73 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
53 const MemoryDumpProvider::Options& options) { 74 const MemoryDumpProvider::Options& options) {
54 MemoryDumpManager* mdm = MemoryDumpManager::GetInstance(); 75 RegisterDumpProvider(mdp, task_runner, options,
55 mdm->set_dumper_registrations_ignored_for_testing(false); 76 true /* dumps_on_single_thread_task_runner */);
56 mdm->RegisterDumpProvider(mdp, "TestDumpProvider", task_runner, options);
57 mdm->set_dumper_registrations_ignored_for_testing(true);
58 } 77 }
59 78
60 void RegisterDumpProvider(MemoryDumpProvider* mdp) { 79 void RegisterDumpProvider(MemoryDumpProvider* mdp) {
61 RegisterDumpProvider(mdp, nullptr, MemoryDumpProvider::Options()); 80 RegisterDumpProvider(mdp, nullptr, MemoryDumpProvider::Options());
62 } 81 }
63 82
83 void RegisterDumpProviderWithSequencedTaskRunner(
84 MemoryDumpProvider* mdp,
85 const scoped_refptr<base::SequencedTaskRunner>& task_runner,
86 const MemoryDumpProvider::Options& options) {
87 RegisterDumpProvider(mdp, task_runner, options,
88 false /* dumps_on_single_thread_task_runner */);
89 }
90
64 void OnTraceDataCollected(Closure quit_closure, 91 void OnTraceDataCollected(Closure quit_closure,
65 trace_event::TraceResultBuffer* buffer, 92 trace_event::TraceResultBuffer* buffer,
66 const scoped_refptr<RefCountedString>& json, 93 const scoped_refptr<RefCountedString>& json,
67 bool has_more_events) { 94 bool has_more_events) {
68 buffer->AddFragment(json->data()); 95 buffer->AddFragment(json->data());
69 if (!has_more_events) 96 if (!has_more_events)
70 quit_closure.Run(); 97 quit_closure.Run();
71 } 98 }
72 99
73 } // namespace 100 } // namespace
(...skipping 29 matching lines...) Expand all
103 130
104 MockMemoryDumpProvider() : enable_mock_destructor(false) {} 131 MockMemoryDumpProvider() : enable_mock_destructor(false) {}
105 ~MockMemoryDumpProvider() override { 132 ~MockMemoryDumpProvider() override {
106 if (enable_mock_destructor) 133 if (enable_mock_destructor)
107 Destructor(); 134 Destructor();
108 } 135 }
109 136
110 bool enable_mock_destructor; 137 bool enable_mock_destructor;
111 }; 138 };
112 139
140 class TestSequencedTaskRunner : public SequencedTaskRunner {
141 public:
142 TestSequencedTaskRunner()
143 : worker_pool_(
144 new SequencedWorkerPool(2 /* max_threads */, "Test Task Runner")),
145 enabled_(true),
146 num_of_post_tasks_(0) {}
147
148 void set_enabled(bool value) { enabled_ = value; }
149 unsigned no_of_post_tasks() const { return num_of_post_tasks_; }
150
151 bool PostNonNestableDelayedTask(const tracked_objects::Location& from_here,
152 const Closure& task,
153 TimeDelta delay) override {
154 NOTREACHED();
155 return false;
156 }
157
158 bool PostDelayedTask(const tracked_objects::Location& from_here,
159 const Closure& task,
160 TimeDelta delay) override {
161 num_of_post_tasks_++;
162 if (enabled_)
163 return worker_pool_->PostSequencedWorkerTask(token_, from_here, task);
164 return false;
165 }
166
167 bool RunsTasksOnCurrentThread() const override {
168 return worker_pool_->IsRunningSequenceOnCurrentThread(token_);
169 }
170
171 private:
172 ~TestSequencedTaskRunner() override {}
173
174 scoped_refptr<SequencedWorkerPool> worker_pool_;
175 const SequencedWorkerPool::SequenceToken token_;
176 bool enabled_;
177 unsigned num_of_post_tasks_;
178 };
179
113 class MemoryDumpManagerTest : public testing::Test { 180 class MemoryDumpManagerTest : public testing::Test {
114 public: 181 public:
115 MemoryDumpManagerTest() : testing::Test(), kDefaultOptions() {} 182 MemoryDumpManagerTest() : testing::Test(), kDefaultOptions() {}
116 183
117 void SetUp() override { 184 void SetUp() override {
118 last_callback_success_ = false; 185 last_callback_success_ = false;
119 message_loop_.reset(new MessageLoop()); 186 message_loop_.reset(new MessageLoop());
120 mdm_.reset(new MemoryDumpManager()); 187 mdm_.reset(new MemoryDumpManager());
121 MemoryDumpManager::SetInstanceForTesting(mdm_.get()); 188 MemoryDumpManager::SetInstanceForTesting(mdm_.get());
122 ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance()); 189 ASSERT_EQ(mdm_.get(), MemoryDumpManager::GetInstance());
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
434 run_loop.Run(); 501 run_loop.Run();
435 } 502 }
436 mdps.pop_back(); 503 mdps.pop_back();
437 threads.back()->Stop(); 504 threads.back()->Stop();
438 threads.pop_back(); 505 threads.pop_back();
439 } 506 }
440 507
441 DisableTracing(); 508 DisableTracing();
442 } 509 }
443 510
511 // Check that the memory dump calls are always posted on task runner for
512 // SequencedTaskRunner case and that the dump provider gets disabled when
513 // PostTask fails, but the dump still succeeds.
514 TEST_F(MemoryDumpManagerTest, PostTaskForSequencedTaskRunner) {
515 InitializeMemoryDumpManager(false /* is_coordinator */);
516 std::vector<MockMemoryDumpProvider> mdps(3);
517 scoped_refptr<TestSequencedTaskRunner> task_runner1(
518 make_scoped_refptr(new TestSequencedTaskRunner()));
519 scoped_refptr<TestSequencedTaskRunner> task_runner2(
520 make_scoped_refptr(new TestSequencedTaskRunner()));
521 RegisterDumpProviderWithSequencedTaskRunner(&mdps[0], task_runner1,
522 kDefaultOptions);
523 RegisterDumpProviderWithSequencedTaskRunner(&mdps[1], task_runner2,
524 kDefaultOptions);
525 RegisterDumpProviderWithSequencedTaskRunner(&mdps[2], task_runner2,
526 kDefaultOptions);
527 // |mdps[0]| should be disabled permanently after first dump.
528 EXPECT_CALL(mdps[0], OnMemoryDump(_, _)).Times(0);
529 EXPECT_CALL(mdps[1], OnMemoryDump(_, _)).Times(2);
530 EXPECT_CALL(mdps[2], OnMemoryDump(_, _)).Times(2);
531 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2);
532
533 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
534
535 task_runner1->set_enabled(false);
536 last_callback_success_ = false;
537 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
538 MemoryDumpLevelOfDetail::DETAILED);
539 // Tasks should be individually posted even if |mdps[1]| and |mdps[2]| belong
540 // to same task runner.
541 EXPECT_EQ(1u, task_runner1->no_of_post_tasks());
542 EXPECT_EQ(2u, task_runner2->no_of_post_tasks());
543 EXPECT_TRUE(last_callback_success_);
544
545 task_runner1->set_enabled(true);
546 last_callback_success_ = false;
547 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
548 MemoryDumpLevelOfDetail::DETAILED);
549 EXPECT_EQ(2u, task_runner1->no_of_post_tasks());
550 EXPECT_EQ(4u, task_runner2->no_of_post_tasks());
551 EXPECT_TRUE(last_callback_success_);
552 DisableTracing();
553 }
554
444 // Checks that providers get disabled after 3 consecutive failures, but not 555 // Checks that providers get disabled after 3 consecutive failures, but not
445 // otherwise (e.g., if interleaved). 556 // otherwise (e.g., if interleaved).
446 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) { 557 TEST_F(MemoryDumpManagerTest, DisableFailingDumpers) {
447 InitializeMemoryDumpManager(false /* is_coordinator */); 558 InitializeMemoryDumpManager(false /* is_coordinator */);
448 MockMemoryDumpProvider mdp1; 559 MockMemoryDumpProvider mdp1;
449 MockMemoryDumpProvider mdp2; 560 MockMemoryDumpProvider mdp2;
450 561
451 RegisterDumpProvider(&mdp1); 562 RegisterDumpProvider(&mdp1);
452 RegisterDumpProvider(&mdp2); 563 RegisterDumpProvider(&mdp2);
453 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); 564 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory);
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2); 1084 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(2);
974 for (int i = 0; i < 2; ++i) { 1085 for (int i = 0; i < 2; ++i) {
975 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED, 1086 RequestGlobalDumpAndWait(MemoryDumpType::EXPLICITLY_TRIGGERED,
976 MemoryDumpLevelOfDetail::DETAILED); 1087 MemoryDumpLevelOfDetail::DETAILED);
977 } 1088 }
978 DisableTracing(); 1089 DisableTracing();
979 } 1090 }
980 1091
981 } // namespace trace_event 1092 } // namespace trace_event
982 } // namespace base 1093 } // namespace base
OLDNEW
« no previous file with comments | « base/trace_event/memory_dump_manager.cc ('k') | base/trace_event/memory_dump_provider.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698