OLD | NEW |
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 "base/bind_helpers.h" | 7 #include "base/bind_helpers.h" |
8 #include "base/memory/scoped_vector.h" | 8 #include "base/memory/scoped_vector.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/test/test_io_thread.h" | 12 #include "base/test/test_io_thread.h" |
13 #include "base/thread_task_runner_handle.h" | 13 #include "base/thread_task_runner_handle.h" |
14 #include "base/threading/thread.h" | 14 #include "base/threading/thread.h" |
15 #include "base/trace_event/memory_dump_provider.h" | 15 #include "base/trace_event/memory_dump_provider.h" |
16 #include "base/trace_event/process_memory_dump.h" | 16 #include "base/trace_event/process_memory_dump.h" |
17 #include "base/trace_event/trace_config_memory_test_util.h" | 17 #include "base/trace_event/trace_config_memory_test_util.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 18 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
20 | 20 |
21 using testing::_; | 21 using testing::_; |
22 using testing::AnyNumber; | 22 using testing::AnyNumber; |
23 using testing::AtMost; | 23 using testing::AtMost; |
24 using testing::Between; | 24 using testing::Between; |
25 using testing::Invoke; | 25 using testing::Invoke; |
26 using testing::Return; | 26 using testing::Return; |
27 | 27 |
28 namespace base { | 28 namespace base { |
29 namespace trace_event { | 29 namespace trace_event { |
30 namespace { | |
31 MemoryDumpArgs g_high_detail_args = {MemoryDumpArgs::LevelOfDetail::HIGH}; | |
32 MemoryDumpArgs g_low_detail_args = {MemoryDumpArgs::LevelOfDetail::LOW}; | |
33 } // namespace | |
34 | 30 |
35 // GTest matchers for MemoryDumpRequestArgs arguments. | 31 // GTest matchers for MemoryDumpRequestArgs arguments. |
36 MATCHER(IsHighDetail, "") { | 32 MATCHER(IsDetailedDump, "") { |
37 return arg.level_of_detail == MemoryDumpArgs::LevelOfDetail::HIGH; | 33 return arg.level_of_detail == MemoryDumpLevelOfDetail::DETAILED; |
38 } | 34 } |
39 | 35 |
40 MATCHER(IsLowDetail, "") { | 36 MATCHER(IsLightDump, "") { |
41 return arg.level_of_detail == MemoryDumpArgs::LevelOfDetail::LOW; | 37 return arg.level_of_detail == MemoryDumpLevelOfDetail::LIGHT; |
42 } | |
43 | |
44 // GTest matchers for MemoryDumpArgs arguments. | |
45 MATCHER(IsHighDetailArgs, "") { | |
46 return arg.dump_args.level_of_detail == MemoryDumpArgs::LevelOfDetail::HIGH; | |
47 } | |
48 | |
49 MATCHER(IsLowDetailArgs, "") { | |
50 return arg.dump_args.level_of_detail == MemoryDumpArgs::LevelOfDetail::LOW; | |
51 } | 38 } |
52 | 39 |
53 // Testing MemoryDumpManagerDelegate which, by default, short-circuits dump | 40 // Testing MemoryDumpManagerDelegate which, by default, short-circuits dump |
54 // requests locally to the MemoryDumpManager instead of performing IPC dances. | 41 // requests locally to the MemoryDumpManager instead of performing IPC dances. |
55 class MemoryDumpManagerDelegateForTesting : public MemoryDumpManagerDelegate { | 42 class MemoryDumpManagerDelegateForTesting : public MemoryDumpManagerDelegate { |
56 public: | 43 public: |
57 MemoryDumpManagerDelegateForTesting() { | 44 MemoryDumpManagerDelegateForTesting() { |
58 ON_CALL(*this, RequestGlobalMemoryDump(_, _)) | 45 ON_CALL(*this, RequestGlobalMemoryDump(_, _)) |
59 .WillByDefault(Invoke( | 46 .WillByDefault(Invoke( |
60 this, &MemoryDumpManagerDelegateForTesting::CreateProcessDump)); | 47 this, &MemoryDumpManagerDelegateForTesting::CreateProcessDump)); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 TEST_F(MemoryDumpManagerTest, SingleDumper) { | 131 TEST_F(MemoryDumpManagerTest, SingleDumper) { |
145 InitializeMemoryDumpManager(false /* is_coordinator */); | 132 InitializeMemoryDumpManager(false /* is_coordinator */); |
146 MockMemoryDumpProvider mdp; | 133 MockMemoryDumpProvider mdp; |
147 mdm_->RegisterDumpProvider(&mdp); | 134 mdm_->RegisterDumpProvider(&mdp); |
148 | 135 |
149 // Check that the dumper is not called if the memory category is not enabled. | 136 // Check that the dumper is not called if the memory category is not enabled. |
150 EnableTracingWithLegacyCategories("foobar-but-not-memory"); | 137 EnableTracingWithLegacyCategories("foobar-but-not-memory"); |
151 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 138 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
152 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 139 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
153 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 140 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
154 g_high_detail_args); | 141 MemoryDumpLevelOfDetail::DETAILED); |
155 DisableTracing(); | 142 DisableTracing(); |
156 | 143 |
157 // Now repeat enabling the memory category and check that the dumper is | 144 // Now repeat enabling the memory category and check that the dumper is |
158 // invoked this time. | 145 // invoked this time. |
159 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 146 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
160 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(3); | 147 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(3); |
161 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); | 148 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(3).WillRepeatedly(Return(true)); |
162 for (int i = 0; i < 3; ++i) | 149 for (int i = 0; i < 3; ++i) |
163 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 150 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
164 g_high_detail_args); | 151 MemoryDumpLevelOfDetail::DETAILED); |
165 DisableTracing(); | 152 DisableTracing(); |
166 | 153 |
167 mdm_->UnregisterDumpProvider(&mdp); | 154 mdm_->UnregisterDumpProvider(&mdp); |
168 | 155 |
169 // Finally check the unregister logic: the delegate will be invoked but not | 156 // Finally check the unregister logic: the delegate will be invoked but not |
170 // the dump provider, as it has been unregistered. | 157 // the dump provider, as it has been unregistered. |
171 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 158 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
172 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 159 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
173 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 160 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
174 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 161 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
175 g_high_detail_args); | 162 MemoryDumpLevelOfDetail::DETAILED); |
176 TraceLog::GetInstance()->SetDisabled(); | 163 TraceLog::GetInstance()->SetDisabled(); |
177 } | 164 } |
178 | 165 |
179 // Checks that requesting dumps with high level of detail actually propagates | 166 // Checks that requesting dumps with high level of detail actually propagates |
180 // the level of the detail properly to OnMemoryDump() call on dump providers. | 167 // the level of the detail properly to OnMemoryDump() call on dump providers. |
181 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { | 168 TEST_F(MemoryDumpManagerTest, CheckMemoryDumpArgs) { |
182 InitializeMemoryDumpManager(false /* is_coordinator */); | 169 InitializeMemoryDumpManager(false /* is_coordinator */); |
183 MockMemoryDumpProvider mdp; | 170 MockMemoryDumpProvider mdp; |
184 | 171 |
185 mdm_->RegisterDumpProvider(&mdp); | 172 mdm_->RegisterDumpProvider(&mdp); |
186 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 173 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
187 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 174 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
188 EXPECT_CALL(mdp, OnMemoryDump(IsHighDetail(), _)).WillOnce(Return(true)); | 175 EXPECT_CALL(mdp, OnMemoryDump(IsDetailedDump(), _)).WillOnce(Return(true)); |
189 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 176 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
190 g_high_detail_args); | 177 MemoryDumpLevelOfDetail::DETAILED); |
191 DisableTracing(); | 178 DisableTracing(); |
192 mdm_->UnregisterDumpProvider(&mdp); | 179 mdm_->UnregisterDumpProvider(&mdp); |
193 | 180 |
194 // Check that requesting dumps with low level of detail actually propagates to | 181 // Check that requesting dumps with low level of detail actually propagates to |
195 // OnMemoryDump() call on dump providers. | 182 // OnMemoryDump() call on dump providers. |
196 mdm_->RegisterDumpProvider(&mdp); | 183 mdm_->RegisterDumpProvider(&mdp); |
197 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 184 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
198 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 185 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
199 EXPECT_CALL(mdp, OnMemoryDump(IsLowDetail(), _)).WillOnce(Return(true)); | 186 EXPECT_CALL(mdp, OnMemoryDump(IsLightDump(), _)).WillOnce(Return(true)); |
200 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 187 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
201 g_low_detail_args); | 188 MemoryDumpLevelOfDetail::LIGHT); |
202 DisableTracing(); | 189 DisableTracing(); |
203 mdm_->UnregisterDumpProvider(&mdp); | 190 mdm_->UnregisterDumpProvider(&mdp); |
204 } | 191 } |
205 | 192 |
206 // Checks that the SharedSessionState object is acqually shared over time. | 193 // Checks that the SharedSessionState object is acqually shared over time. |
207 TEST_F(MemoryDumpManagerTest, SharedSessionState) { | 194 TEST_F(MemoryDumpManagerTest, SharedSessionState) { |
208 InitializeMemoryDumpManager(false /* is_coordinator */); | 195 InitializeMemoryDumpManager(false /* is_coordinator */); |
209 MockMemoryDumpProvider mdp1; | 196 MockMemoryDumpProvider mdp1; |
210 MockMemoryDumpProvider mdp2; | 197 MockMemoryDumpProvider mdp2; |
211 mdm_->RegisterDumpProvider(&mdp1); | 198 mdm_->RegisterDumpProvider(&mdp1); |
(...skipping 12 matching lines...) Expand all Loading... |
224 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 211 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
225 .Times(2) | 212 .Times(2) |
226 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, | 213 .WillRepeatedly(Invoke([session_state](const MemoryDumpArgs&, |
227 ProcessMemoryDump* pmd) -> bool { | 214 ProcessMemoryDump* pmd) -> bool { |
228 EXPECT_EQ(session_state, pmd->session_state().get()); | 215 EXPECT_EQ(session_state, pmd->session_state().get()); |
229 return true; | 216 return true; |
230 })); | 217 })); |
231 | 218 |
232 for (int i = 0; i < 2; ++i) | 219 for (int i = 0; i < 2; ++i) |
233 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 220 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
234 g_high_detail_args); | 221 MemoryDumpLevelOfDetail::DETAILED); |
235 | 222 |
236 DisableTracing(); | 223 DisableTracing(); |
237 } | 224 } |
238 | 225 |
239 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. | 226 // Checks that the (Un)RegisterDumpProvider logic behaves sanely. |
240 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { | 227 TEST_F(MemoryDumpManagerTest, MultipleDumpers) { |
241 InitializeMemoryDumpManager(false /* is_coordinator */); | 228 InitializeMemoryDumpManager(false /* is_coordinator */); |
242 MockMemoryDumpProvider mdp1; | 229 MockMemoryDumpProvider mdp1; |
243 MockMemoryDumpProvider mdp2; | 230 MockMemoryDumpProvider mdp2; |
244 | 231 |
245 // Enable only mdp1. | 232 // Enable only mdp1. |
246 mdm_->RegisterDumpProvider(&mdp1); | 233 mdm_->RegisterDumpProvider(&mdp1); |
247 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 234 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
248 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 235 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
249 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 236 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
250 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); | 237 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).Times(0); |
251 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 238 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
252 g_high_detail_args); | 239 MemoryDumpLevelOfDetail::DETAILED); |
253 DisableTracing(); | 240 DisableTracing(); |
254 | 241 |
255 // Invert: enable mdp1 and disable mdp2. | 242 // Invert: enable mdp1 and disable mdp2. |
256 mdm_->UnregisterDumpProvider(&mdp1); | 243 mdm_->UnregisterDumpProvider(&mdp1); |
257 mdm_->RegisterDumpProvider(&mdp2); | 244 mdm_->RegisterDumpProvider(&mdp2); |
258 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 245 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
259 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 246 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
260 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 247 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
261 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 248 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
262 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 249 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
263 g_high_detail_args); | 250 MemoryDumpLevelOfDetail::DETAILED); |
264 DisableTracing(); | 251 DisableTracing(); |
265 | 252 |
266 // Enable both mdp1 and mdp2. | 253 // Enable both mdp1 and mdp2. |
267 mdm_->RegisterDumpProvider(&mdp1); | 254 mdm_->RegisterDumpProvider(&mdp1); |
268 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 255 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
269 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 256 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
270 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); | 257 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).WillOnce(Return(true)); |
271 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); | 258 EXPECT_CALL(mdp2, OnMemoryDump(_, _)).WillOnce(Return(true)); |
272 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 259 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
273 g_high_detail_args); | 260 MemoryDumpLevelOfDetail::DETAILED); |
274 DisableTracing(); | 261 DisableTracing(); |
275 } | 262 } |
276 | 263 |
277 // Checks that the dump provider invocations depend only on the current | 264 // Checks that the dump provider invocations depend only on the current |
278 // registration state and not on previous registrations and dumps. | 265 // registration state and not on previous registrations and dumps. |
279 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { | 266 TEST_F(MemoryDumpManagerTest, RegistrationConsistency) { |
280 InitializeMemoryDumpManager(false /* is_coordinator */); | 267 InitializeMemoryDumpManager(false /* is_coordinator */); |
281 MockMemoryDumpProvider mdp; | 268 MockMemoryDumpProvider mdp; |
282 | 269 |
283 mdm_->RegisterDumpProvider(&mdp); | 270 mdm_->RegisterDumpProvider(&mdp); |
284 | 271 |
285 { | 272 { |
286 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 273 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
287 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 274 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
288 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 275 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
289 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 276 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
290 g_high_detail_args); | 277 MemoryDumpLevelOfDetail::DETAILED); |
291 DisableTracing(); | 278 DisableTracing(); |
292 } | 279 } |
293 | 280 |
294 mdm_->UnregisterDumpProvider(&mdp); | 281 mdm_->UnregisterDumpProvider(&mdp); |
295 | 282 |
296 { | 283 { |
297 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 284 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
298 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 285 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
299 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 286 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
300 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 287 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
301 g_high_detail_args); | 288 MemoryDumpLevelOfDetail::DETAILED); |
302 DisableTracing(); | 289 DisableTracing(); |
303 } | 290 } |
304 | 291 |
305 mdm_->RegisterDumpProvider(&mdp); | 292 mdm_->RegisterDumpProvider(&mdp); |
306 mdm_->UnregisterDumpProvider(&mdp); | 293 mdm_->UnregisterDumpProvider(&mdp); |
307 | 294 |
308 { | 295 { |
309 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 296 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
310 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 297 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
311 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 298 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
312 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 299 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
313 g_high_detail_args); | 300 MemoryDumpLevelOfDetail::DETAILED); |
314 DisableTracing(); | 301 DisableTracing(); |
315 } | 302 } |
316 | 303 |
317 mdm_->RegisterDumpProvider(&mdp); | 304 mdm_->RegisterDumpProvider(&mdp); |
318 mdm_->UnregisterDumpProvider(&mdp); | 305 mdm_->UnregisterDumpProvider(&mdp); |
319 mdm_->RegisterDumpProvider(&mdp); | 306 mdm_->RegisterDumpProvider(&mdp); |
320 | 307 |
321 { | 308 { |
322 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 309 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
323 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); | 310 EXPECT_CALL(mdp, OnMemoryDump(_, _)).WillOnce(Return(true)); |
324 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 311 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
325 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 312 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
326 g_high_detail_args); | 313 MemoryDumpLevelOfDetail::DETAILED); |
327 DisableTracing(); | 314 DisableTracing(); |
328 } | 315 } |
329 } | 316 } |
330 | 317 |
331 // Checks that the MemoryDumpManager respects the thread affinity when a | 318 // Checks that the MemoryDumpManager respects the thread affinity when a |
332 // MemoryDumpProvider specifies a task_runner(). The test starts creating 8 | 319 // MemoryDumpProvider specifies a task_runner(). The test starts creating 8 |
333 // threads and registering a MemoryDumpProvider on each of them. At each | 320 // threads and registering a MemoryDumpProvider on each of them. At each |
334 // iteration, one thread is removed, to check the live unregistration logic. | 321 // iteration, one thread is removed, to check the live unregistration logic. |
335 TEST_F(MemoryDumpManagerTest, RespectTaskRunnerAffinity) { | 322 TEST_F(MemoryDumpManagerTest, RespectTaskRunnerAffinity) { |
336 InitializeMemoryDumpManager(false /* is_coordinator */); | 323 InitializeMemoryDumpManager(false /* is_coordinator */); |
(...skipping 26 matching lines...) Expand all Loading... |
363 | 350 |
364 while (!threads.empty()) { | 351 while (!threads.empty()) { |
365 last_callback_success_ = false; | 352 last_callback_success_ = false; |
366 { | 353 { |
367 RunLoop run_loop; | 354 RunLoop run_loop; |
368 MemoryDumpCallback callback = | 355 MemoryDumpCallback callback = |
369 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), | 356 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), |
370 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); | 357 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); |
371 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 358 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
372 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 359 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
373 g_high_detail_args, callback); | 360 MemoryDumpLevelOfDetail::DETAILED, callback); |
374 // This nested message loop (|run_loop|) will quit if and only if the | 361 // This nested message loop (|run_loop|) will quit if and only if the |
375 // |callback| passed to RequestGlobalDump() is invoked. | 362 // |callback| passed to RequestGlobalDump() is invoked. |
376 run_loop.Run(); | 363 run_loop.Run(); |
377 } | 364 } |
378 EXPECT_TRUE(last_callback_success_); | 365 EXPECT_TRUE(last_callback_success_); |
379 | 366 |
380 // Unregister a MDP and destroy one thread at each iteration to check the | 367 // Unregister a MDP and destroy one thread at each iteration to check the |
381 // live unregistration logic. The unregistration needs to happen on the same | 368 // live unregistration logic. The unregistration needs to happen on the same |
382 // thread the MDP belongs to. | 369 // thread the MDP belongs to. |
383 { | 370 { |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 405 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
419 .WillOnce(Return(false)) | 406 .WillOnce(Return(false)) |
420 .WillOnce(Return(true)) | 407 .WillOnce(Return(true)) |
421 .WillOnce(Return(false)) | 408 .WillOnce(Return(false)) |
422 .WillOnce(Return(false)) | 409 .WillOnce(Return(false)) |
423 .WillOnce(Return(true)) | 410 .WillOnce(Return(true)) |
424 .WillOnce(Return(false)); | 411 .WillOnce(Return(false)); |
425 | 412 |
426 for (int i = 0; i < kNumDumps; i++) { | 413 for (int i = 0; i < kNumDumps; i++) { |
427 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 414 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
428 g_high_detail_args); | 415 MemoryDumpLevelOfDetail::DETAILED); |
429 } | 416 } |
430 | 417 |
431 DisableTracing(); | 418 DisableTracing(); |
432 } | 419 } |
433 | 420 |
434 // Sneakily registers an extra memory dump provider while an existing one is | 421 // Sneakily registers an extra memory dump provider while an existing one is |
435 // dumping and expect it to take part in the already active tracing session. | 422 // dumping and expect it to take part in the already active tracing session. |
436 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { | 423 TEST_F(MemoryDumpManagerTest, RegisterDumperWhileDumping) { |
437 InitializeMemoryDumpManager(false /* is_coordinator */); | 424 InitializeMemoryDumpManager(false /* is_coordinator */); |
438 MockMemoryDumpProvider mdp1; | 425 MockMemoryDumpProvider mdp1; |
(...skipping 15 matching lines...) Expand all Loading... |
454 .WillRepeatedly(Return(true)); | 441 .WillRepeatedly(Return(true)); |
455 | 442 |
456 // Depending on the insertion order (before or after mdp1), mdp2 might be | 443 // Depending on the insertion order (before or after mdp1), mdp2 might be |
457 // called also immediately after it gets registered. | 444 // called also immediately after it gets registered. |
458 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 445 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
459 .Times(Between(2, 3)) | 446 .Times(Between(2, 3)) |
460 .WillRepeatedly(Return(true)); | 447 .WillRepeatedly(Return(true)); |
461 | 448 |
462 for (int i = 0; i < 4; i++) { | 449 for (int i = 0; i < 4; i++) { |
463 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 450 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
464 g_high_detail_args); | 451 MemoryDumpLevelOfDetail::DETAILED); |
465 } | 452 } |
466 | 453 |
467 DisableTracing(); | 454 DisableTracing(); |
468 } | 455 } |
469 | 456 |
470 // Like RegisterDumperWhileDumping, but unregister the dump provider instead. | 457 // Like RegisterDumperWhileDumping, but unregister the dump provider instead. |
471 TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { | 458 TEST_F(MemoryDumpManagerTest, UnregisterDumperWhileDumping) { |
472 InitializeMemoryDumpManager(false /* is_coordinator */); | 459 InitializeMemoryDumpManager(false /* is_coordinator */); |
473 MockMemoryDumpProvider mdp1; | 460 MockMemoryDumpProvider mdp1; |
474 MockMemoryDumpProvider mdp2; | 461 MockMemoryDumpProvider mdp2; |
(...skipping 15 matching lines...) Expand all Loading... |
490 .WillRepeatedly(Return(true)); | 477 .WillRepeatedly(Return(true)); |
491 | 478 |
492 // Depending on the insertion order (before or after mdp1), mdp2 might have | 479 // Depending on the insertion order (before or after mdp1), mdp2 might have |
493 // been already called when UnregisterDumpProvider happens. | 480 // been already called when UnregisterDumpProvider happens. |
494 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) | 481 EXPECT_CALL(mdp2, OnMemoryDump(_, _)) |
495 .Times(Between(1, 2)) | 482 .Times(Between(1, 2)) |
496 .WillRepeatedly(Return(true)); | 483 .WillRepeatedly(Return(true)); |
497 | 484 |
498 for (int i = 0; i < 4; i++) { | 485 for (int i = 0; i < 4; i++) { |
499 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 486 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
500 g_high_detail_args); | 487 MemoryDumpLevelOfDetail::DETAILED); |
501 } | 488 } |
502 | 489 |
503 DisableTracing(); | 490 DisableTracing(); |
504 } | 491 } |
505 | 492 |
506 // Checks that the dump does not abort when unregistering a provider while | 493 // Checks that the dump does not abort when unregistering a provider while |
507 // dumping from a different thread than the dumping thread. | 494 // dumping from a different thread than the dumping thread. |
508 TEST_F(MemoryDumpManagerTest, UnregisterDumperFromThreadWhileDumping) { | 495 TEST_F(MemoryDumpManagerTest, UnregisterDumperFromThreadWhileDumping) { |
509 InitializeMemoryDumpManager(false /* is_coordinator */); | 496 InitializeMemoryDumpManager(false /* is_coordinator */); |
510 ScopedVector<TestIOThread> threads; | 497 ScopedVector<TestIOThread> threads; |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 | 530 |
544 last_callback_success_ = false; | 531 last_callback_success_ = false; |
545 MemoryDumpCallback callback = | 532 MemoryDumpCallback callback = |
546 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), | 533 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), |
547 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); | 534 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); |
548 | 535 |
549 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 536 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
550 | 537 |
551 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 538 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
552 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 539 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
553 g_high_detail_args, callback); | 540 MemoryDumpLevelOfDetail::DETAILED, callback); |
554 | 541 |
555 run_loop.Run(); | 542 run_loop.Run(); |
556 | 543 |
557 ASSERT_EQ(1, on_memory_dump_call_count); | 544 ASSERT_EQ(1, on_memory_dump_call_count); |
558 ASSERT_EQ(true, last_callback_success_); | 545 ASSERT_EQ(true, last_callback_success_); |
559 | 546 |
560 DisableTracing(); | 547 DisableTracing(); |
561 } | 548 } |
562 | 549 |
563 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when | 550 // Checks that a NACK callback is invoked if RequestGlobalDump() is called when |
564 // tracing is not enabled. | 551 // tracing is not enabled. |
565 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { | 552 TEST_F(MemoryDumpManagerTest, CallbackCalledOnFailure) { |
566 InitializeMemoryDumpManager(false /* is_coordinator */); | 553 InitializeMemoryDumpManager(false /* is_coordinator */); |
567 MockMemoryDumpProvider mdp1; | 554 MockMemoryDumpProvider mdp1; |
568 mdm_->RegisterDumpProvider(&mdp1); | 555 mdm_->RegisterDumpProvider(&mdp1); |
569 | 556 |
570 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 557 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
571 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); | 558 EXPECT_CALL(mdp1, OnMemoryDump(_, _)).Times(0); |
572 | 559 |
573 last_callback_success_ = true; | 560 last_callback_success_ = true; |
574 { | 561 { |
575 RunLoop run_loop; | 562 RunLoop run_loop; |
576 MemoryDumpCallback callback = | 563 MemoryDumpCallback callback = |
577 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), | 564 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), |
578 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); | 565 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); |
579 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 566 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
580 g_high_detail_args, callback); | 567 MemoryDumpLevelOfDetail::DETAILED, callback); |
581 run_loop.Run(); | 568 run_loop.Run(); |
582 } | 569 } |
583 EXPECT_FALSE(last_callback_success_); | 570 EXPECT_FALSE(last_callback_success_); |
584 } | 571 } |
585 | 572 |
586 // Checks that is the MemoryDumpManager is initialized after tracing already | 573 // Checks that is the MemoryDumpManager is initialized after tracing already |
587 // began, it will still late-join the party (real use case: startup tracing). | 574 // began, it will still late-join the party (real use case: startup tracing). |
588 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { | 575 TEST_F(MemoryDumpManagerTest, InitializedAfterStartOfTracing) { |
589 MockMemoryDumpProvider mdp; | 576 MockMemoryDumpProvider mdp; |
590 mdm_->RegisterDumpProvider(&mdp); | 577 mdm_->RegisterDumpProvider(&mdp); |
591 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); | 578 EnableTracingWithLegacyCategories(MemoryDumpManager::kTraceCategory); |
592 | 579 |
593 // First check that a RequestGlobalDump() issued before the MemoryDumpManager | 580 // First check that a RequestGlobalDump() issued before the MemoryDumpManager |
594 // initialization gets NACK-ed cleanly. | 581 // initialization gets NACK-ed cleanly. |
595 { | 582 { |
596 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); | 583 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(0); |
597 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); | 584 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(0); |
598 RunLoop run_loop; | 585 RunLoop run_loop; |
599 MemoryDumpCallback callback = | 586 MemoryDumpCallback callback = |
600 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), | 587 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), |
601 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); | 588 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); |
602 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 589 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
603 g_high_detail_args, callback); | 590 MemoryDumpLevelOfDetail::DETAILED, callback); |
604 run_loop.Run(); | 591 run_loop.Run(); |
605 EXPECT_FALSE(last_callback_success_); | 592 EXPECT_FALSE(last_callback_success_); |
606 } | 593 } |
607 | 594 |
608 // Now late-initialize the MemoryDumpManager and check that the | 595 // Now late-initialize the MemoryDumpManager and check that the |
609 // RequestGlobalDump completes successfully. | 596 // RequestGlobalDump completes successfully. |
610 { | 597 { |
611 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(1); | 598 EXPECT_CALL(mdp, OnMemoryDump(_, _)).Times(1); |
612 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); | 599 EXPECT_CALL(*delegate_, RequestGlobalMemoryDump(_, _)).Times(1); |
613 InitializeMemoryDumpManager(false /* is_coordinator */); | 600 InitializeMemoryDumpManager(false /* is_coordinator */); |
614 RunLoop run_loop; | 601 RunLoop run_loop; |
615 MemoryDumpCallback callback = | 602 MemoryDumpCallback callback = |
616 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), | 603 Bind(&MemoryDumpManagerTest::DumpCallbackAdapter, Unretained(this), |
617 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); | 604 MessageLoop::current()->task_runner(), run_loop.QuitClosure()); |
618 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, | 605 mdm_->RequestGlobalDump(MemoryDumpType::EXPLICITLY_TRIGGERED, |
619 g_high_detail_args, callback); | 606 MemoryDumpLevelOfDetail::DETAILED, callback); |
620 run_loop.Run(); | 607 run_loop.Run(); |
621 EXPECT_TRUE(last_callback_success_); | 608 EXPECT_TRUE(last_callback_success_); |
622 } | 609 } |
623 DisableTracing(); | 610 DisableTracing(); |
624 } | 611 } |
625 | 612 |
626 // This test (and the MemoryDumpManagerTestCoordinator below) crystallizes the | 613 // This test (and the MemoryDumpManagerTestCoordinator below) crystallizes the |
627 // expectations of the chrome://tracing UI and chrome telemetry w.r.t. periodic | 614 // expectations of the chrome://tracing UI and chrome telemetry w.r.t. periodic |
628 // dumps in memory-infra, handling gracefully the transition between the legacy | 615 // dumps in memory-infra, handling gracefully the transition between the legacy |
629 // and the new-style (JSON-based) TraceConfig. | 616 // and the new-style (JSON-based) TraceConfig. |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
686 // process with a fully defined trigger config should cause periodic dumps to | 673 // process with a fully defined trigger config should cause periodic dumps to |
687 // be performed in the correct order. | 674 // be performed in the correct order. |
688 RunLoop run_loop; | 675 RunLoop run_loop; |
689 auto quit_closure = run_loop.QuitClosure(); | 676 auto quit_closure = run_loop.QuitClosure(); |
690 | 677 |
691 const int kHeavyDumpRate = 5; | 678 const int kHeavyDumpRate = 5; |
692 const int kLightDumpPeriodMs = 1; | 679 const int kLightDumpPeriodMs = 1; |
693 const int kHeavyDumpPeriodMs = kHeavyDumpRate * kLightDumpPeriodMs; | 680 const int kHeavyDumpPeriodMs = kHeavyDumpRate * kLightDumpPeriodMs; |
694 // The expected sequence with light=1ms, heavy=5ms is H,L,L,L,L,H,... | 681 // The expected sequence with light=1ms, heavy=5ms is H,L,L,L,L,H,... |
695 testing::InSequence sequence; | 682 testing::InSequence sequence; |
696 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsHighDetailArgs(), _)); | 683 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsDetailedDump(), _)); |
697 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLowDetailArgs(), _)) | 684 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLightDump(), _)) |
698 .Times(kHeavyDumpRate - 1); | 685 .Times(kHeavyDumpRate - 1); |
699 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsHighDetailArgs(), _)); | 686 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsDetailedDump(), _)); |
700 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLowDetailArgs(), _)) | 687 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLightDump(), _)) |
701 .Times(kHeavyDumpRate - 2); | 688 .Times(kHeavyDumpRate - 2); |
702 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLowDetailArgs(), _)) | 689 EXPECT_CALL(delegate, RequestGlobalMemoryDump(IsLightDump(), _)) |
703 .WillOnce(Invoke([quit_closure](const MemoryDumpRequestArgs& args, | 690 .WillOnce(Invoke([quit_closure](const MemoryDumpRequestArgs& args, |
704 const MemoryDumpCallback& callback) { | 691 const MemoryDumpCallback& callback) { |
705 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure); | 692 ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, quit_closure); |
706 })); | 693 })); |
707 | 694 |
708 // Swallow all the final spurious calls until tracing gets disabled. | 695 // Swallow all the final spurious calls until tracing gets disabled. |
709 EXPECT_CALL(delegate, RequestGlobalMemoryDump(_, _)).Times(AnyNumber()); | 696 EXPECT_CALL(delegate, RequestGlobalMemoryDump(_, _)).Times(AnyNumber()); |
710 | 697 |
711 EnableTracingWithTraceConfig( | 698 EnableTracingWithTraceConfig( |
712 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers( | 699 TraceConfigMemoryTestUtil::GetTraceConfig_PeriodicTriggers( |
713 kLightDumpPeriodMs, kHeavyDumpPeriodMs)); | 700 kLightDumpPeriodMs, kHeavyDumpPeriodMs)); |
714 run_loop.Run(); | 701 run_loop.Run(); |
715 DisableTracing(); | 702 DisableTracing(); |
716 } | 703 } |
717 | 704 |
718 } // namespace trace_event | 705 } // namespace trace_event |
719 } // namespace base | 706 } // namespace base |
OLD | NEW |