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

Side by Side Diff: content/browser/tracing/background_tracing_manager_browsertest.cc

Issue 1089253003: Re-land first pass BackgroundTracingManager. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Split config into separate headers and build fix. Created 5 years, 7 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
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/bind.h"
6 #include "content/public/browser/background_tracing_manager.h"
7 #include "content/public/browser/background_tracing_preemptive_config.h"
8 #include "content/public/browser/background_tracing_reactive_config.h"
9 #include "content/public/browser/background_tracing_upload_sink.h"
10 #include "content/public/test/content_browser_test.h"
11 #include "content/public/test/content_browser_test_utils.h"
12 #include "content/public/test/test_utils.h"
13
14 namespace content {
15
16 class BackgroundTracingManagerBrowserTest : public ContentBrowserTest {
17 public:
18 BackgroundTracingManagerBrowserTest() {}
19
20 private:
21 DISALLOW_COPY_AND_ASSIGN(BackgroundTracingManagerBrowserTest);
22 };
23
24 class BackgroundTracingManagerTestSink : public BackgroundTracingUploadSink {
25 public:
26 BackgroundTracingManagerTestSink(const base::Closure& callback)
27 : callback_(callback), receive_count_(0) {}
28
29 void Upload(const std::string& file_contents,
30 base::Callback<void()> done_callback) override {
31 receive_count_ += 1;
32
33 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
34 base::Bind(done_callback));
35 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
36 base::Bind(callback_));
37 }
38
39 bool RequiresAnonymizedData() const override { return true; }
40
41 int get_receive_count() const { return receive_count_; }
42
43 private:
44 ~BackgroundTracingManagerTestSink() override {}
45
46 base::Closure callback_;
47 int receive_count_;
48 };
49
50 void StartedFinalizingCallback(base::Closure callback,
51 bool expected,
52 bool value) {
53 EXPECT_EQ(expected, value);
54 if (!callback.is_null())
55 callback.Run();
56 }
57
58 scoped_refptr<BackgroundTracingPreemptiveConfig> CreatePreemptiveConfig() {
59 scoped_refptr<BackgroundTracingPreemptiveConfig> config =
60 new BackgroundTracingPreemptiveConfig();
61
62 BackgroundTracingPreemptiveConfig::MonitoringRule rule;
63 rule.type =
64 BackgroundTracingPreemptiveConfig::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED;
65 rule.named_trigger_info.trigger_name = "test";
66
67 config->configs.push_back(rule);
68
69 return config;
70 }
71
72 void SetupBackgroundTracingManager() {
73 content::BackgroundTracingManager::GetInstance()
74 ->InvalidateTriggerHandlesForTesting();
75 }
76
77 void DisableScenarioWhenIdle() {
78 BackgroundTracingManager::GetInstance()->SetActiveScenario(NULL, NULL);
79 }
80
81 // This tests that the endpoint receives the final trace data.
82 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
83 ReceiveTraceFinalContentsOnTrigger) {
84 {
85 SetupBackgroundTracingManager();
86
87 base::RunLoop run_loop;
88 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
89 new BackgroundTracingManagerTestSink(run_loop.QuitClosure());
90
91 scoped_refptr<BackgroundTracingPreemptiveConfig> config =
92 CreatePreemptiveConfig();
93
94 BackgroundTracingManager::TriggerHandle handle =
95 BackgroundTracingManager::GetInstance()->RegisterTriggerType("test");
96
97 BackgroundTracingManager::GetInstance()->SetActiveScenario(config,
98 endpoint);
99
100 BackgroundTracingManager::GetInstance()->WhenIdle(
101 base::Bind(&DisableScenarioWhenIdle));
102
103 BackgroundTracingManager::GetInstance()->DidTriggerHappen(
104 handle, base::Bind(&StartedFinalizingCallback, base::Closure(), true));
105
106 run_loop.Run();
107
108 EXPECT_TRUE(endpoint->get_receive_count() == 1);
109 }
110 }
111
112 // This tests triggering more than once still only gathers once.
113 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
114 CallTriggersMoreThanOnceOnlyGatherOnce) {
115 {
116 SetupBackgroundTracingManager();
117
118 base::RunLoop run_loop;
119 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
120 new BackgroundTracingManagerTestSink(run_loop.QuitClosure());
121
122 scoped_refptr<content::BackgroundTracingPreemptiveConfig> config =
123 CreatePreemptiveConfig();
124
125 content::BackgroundTracingManager::TriggerHandle handle =
126 content::BackgroundTracingManager::GetInstance()->RegisterTriggerType(
127 "test");
128
129 BackgroundTracingManager::GetInstance()->SetActiveScenario(config,
130 endpoint);
131
132 BackgroundTracingManager::GetInstance()->WhenIdle(
133 base::Bind(&DisableScenarioWhenIdle));
134
135 BackgroundTracingManager::GetInstance()->DidTriggerHappen(
136 handle, base::Bind(&StartedFinalizingCallback, base::Closure(), true));
137 BackgroundTracingManager::GetInstance()->DidTriggerHappen(
138 handle, base::Bind(&StartedFinalizingCallback, base::Closure(), false));
139
140 run_loop.Run();
141
142 EXPECT_TRUE(endpoint->get_receive_count() == 1);
143 }
144 }
145
146 // This tests multiple triggers still only gathers once.
147 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
148 CallMultipleTriggersOnlyGatherOnce) {
149 {
150 SetupBackgroundTracingManager();
151
152 base::RunLoop run_loop;
153 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
154 new BackgroundTracingManagerTestSink(run_loop.QuitClosure());
155
156 scoped_refptr<BackgroundTracingPreemptiveConfig> config =
157 new BackgroundTracingPreemptiveConfig();
158
159 BackgroundTracingPreemptiveConfig::MonitoringRule rule;
160 rule.type =
161 BackgroundTracingPreemptiveConfig::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED;
162 rule.named_trigger_info.trigger_name = "test1";
163 config->configs.push_back(rule);
164
165 rule.named_trigger_info.trigger_name = "test2";
166 config->configs.push_back(rule);
167
168 BackgroundTracingManager::TriggerHandle handle1 =
169 BackgroundTracingManager::GetInstance()->RegisterTriggerType("test1");
170 BackgroundTracingManager::TriggerHandle handle2 =
171 BackgroundTracingManager::GetInstance()->RegisterTriggerType("test2");
172
173 BackgroundTracingManager::GetInstance()->SetActiveScenario(config,
174 endpoint);
175
176 BackgroundTracingManager::GetInstance()->WhenIdle(
177 base::Bind(&DisableScenarioWhenIdle));
178
179 BackgroundTracingManager::GetInstance()->DidTriggerHappen(
180 handle1, base::Bind(&StartedFinalizingCallback, base::Closure(), true));
181 BackgroundTracingManager::GetInstance()->DidTriggerHappen(
182 handle2,
183 base::Bind(&StartedFinalizingCallback, base::Closure(), false));
184
185 run_loop.Run();
186
187 EXPECT_TRUE(endpoint->get_receive_count() == 1);
188 }
189 }
190
191 // This tests that you can't trigger without a scenario set.
192 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
193 CannotTriggerWithoutScenarioSet) {
194 {
195 SetupBackgroundTracingManager();
196
197 base::RunLoop run_loop;
198 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
199 new BackgroundTracingManagerTestSink(base::Closure());
200
201 scoped_refptr<content::BackgroundTracingPreemptiveConfig> config =
202 CreatePreemptiveConfig();
203
204 content::BackgroundTracingManager::TriggerHandle handle =
205 content::BackgroundTracingManager::GetInstance()->RegisterTriggerType(
206 "test");
207
208 BackgroundTracingManager::GetInstance()->DidTriggerHappen(
209 handle,
210 base::Bind(&StartedFinalizingCallback, run_loop.QuitClosure(), false));
211
212 run_loop.Run();
213
214 EXPECT_TRUE(endpoint->get_receive_count() == 0);
215 }
216 }
217
218 // This tests that no trace is triggered with a handle that isn't specified
219 // in the config.
220 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
221 DoesNotTriggerWithWrongHandle) {
222 {
223 SetupBackgroundTracingManager();
224
225 base::RunLoop run_loop;
226 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
227 new BackgroundTracingManagerTestSink(base::Closure());
228
229 scoped_refptr<content::BackgroundTracingPreemptiveConfig> config =
230 CreatePreemptiveConfig();
231
232 content::BackgroundTracingManager::TriggerHandle handle =
233 content::BackgroundTracingManager::GetInstance()->RegisterTriggerType(
234 "does_not_exist");
235
236 BackgroundTracingManager::GetInstance()->SetActiveScenario(config,
237 endpoint);
238
239 BackgroundTracingManager::GetInstance()->WhenIdle(
240 base::Bind(&DisableScenarioWhenIdle));
241
242 BackgroundTracingManager::GetInstance()->DidTriggerHappen(
243 handle,
244 base::Bind(&StartedFinalizingCallback, run_loop.QuitClosure(), false));
245
246 run_loop.Run();
247
248 EXPECT_TRUE(endpoint->get_receive_count() == 0);
249 }
250 }
251
252 // This tests that no trace is triggered with an invalid handle.
253 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
254 DoesNotTriggerWithInvalidHandle) {
255 {
256 SetupBackgroundTracingManager();
257
258 base::RunLoop run_loop;
259 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
260 new BackgroundTracingManagerTestSink(base::Closure());
261
262 scoped_refptr<content::BackgroundTracingPreemptiveConfig> config =
263 CreatePreemptiveConfig();
264
265 content::BackgroundTracingManager::TriggerHandle handle =
266 content::BackgroundTracingManager::GetInstance()->RegisterTriggerType(
267 "test");
268
269 content::BackgroundTracingManager::GetInstance()
270 ->InvalidateTriggerHandlesForTesting();
271
272 BackgroundTracingManager::GetInstance()->SetActiveScenario(config,
273 endpoint);
274
275 BackgroundTracingManager::GetInstance()->WhenIdle(
276 base::Bind(&DisableScenarioWhenIdle));
277
278 BackgroundTracingManager::GetInstance()->DidTriggerHappen(
279 handle,
280 base::Bind(&StartedFinalizingCallback, run_loop.QuitClosure(), false));
281
282 run_loop.Run();
283
284 EXPECT_TRUE(endpoint->get_receive_count() == 0);
285 }
286 }
287
288 // This tests that reactive mode configs will fail.
289 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
290 DoesNotAllowPreemptiveConfigThatsNotManual) {
291 {
292 SetupBackgroundTracingManager();
293
294 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
295 new BackgroundTracingManagerTestSink(base::Closure());
296
297 scoped_refptr<content::BackgroundTracingPreemptiveConfig> config =
298 new content::BackgroundTracingPreemptiveConfig();
299
300 BackgroundTracingPreemptiveConfig::MonitoringRule rule;
301 rule.type = BackgroundTracingPreemptiveConfig::
302 MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE;
303 rule.histogram_trigger_info.histogram_name_to_trigger_on = "fake";
304 rule.histogram_trigger_info.histogram_bin_to_trigger_on = 0;
305 config->configs.push_back(rule);
306
307 bool result = BackgroundTracingManager::GetInstance()->SetActiveScenario(
308 config, endpoint);
309
310 EXPECT_FALSE(result);
311 }
312 }
313
314 // This tests that reactive mode configs will fail.
315 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
316 DoesNotAllowReactiveConfig) {
317 {
318 SetupBackgroundTracingManager();
319
320 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
321 new BackgroundTracingManagerTestSink(base::Closure());
322
323 scoped_refptr<content::BackgroundTracingReactiveConfig> config =
324 new content::BackgroundTracingReactiveConfig();
325
326 bool result = BackgroundTracingManager::GetInstance()->SetActiveScenario(
327 config, endpoint);
328
329 EXPECT_FALSE(result);
330 }
331 }
332
333 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698