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

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: Review changes. 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_ptr<BackgroundTracingPreemptiveConfig> CreatePreemptiveConfig() {
59 scoped_ptr<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.Pass();
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_ptr<BackgroundTracingPreemptiveConfig> config =
92 CreatePreemptiveConfig();
93
94 BackgroundTracingManager::TriggerHandle handle =
95 BackgroundTracingManager::GetInstance()->RegisterTriggerType("test");
96
97 BackgroundTracingManager::GetInstance()->SetActiveScenario(config.Pass(),
98 endpoint);
99
100 BackgroundTracingManager::GetInstance()->WhenIdle(
101 base::Bind(&DisableScenarioWhenIdle));
102
103 BackgroundTracingManager::GetInstance()->TriggerNamedEvent(
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_ptr<BackgroundTracingPreemptiveConfig> config =
123 CreatePreemptiveConfig();
124
125 content::BackgroundTracingManager::TriggerHandle handle =
126 content::BackgroundTracingManager::GetInstance()->RegisterTriggerType(
127 "test");
128
129 BackgroundTracingManager::GetInstance()->SetActiveScenario(config.Pass(),
130 endpoint);
131
132 BackgroundTracingManager::GetInstance()->WhenIdle(
133 base::Bind(&DisableScenarioWhenIdle));
134
135 BackgroundTracingManager::GetInstance()->TriggerNamedEvent(
136 handle, base::Bind(&StartedFinalizingCallback, base::Closure(), true));
137 BackgroundTracingManager::GetInstance()->TriggerNamedEvent(
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_ptr<BackgroundTracingPreemptiveConfig> config =
157 CreatePreemptiveConfig();
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.Pass(),
174 endpoint);
175
176 BackgroundTracingManager::GetInstance()->WhenIdle(
177 base::Bind(&DisableScenarioWhenIdle));
178
179 BackgroundTracingManager::GetInstance()->TriggerNamedEvent(
180 handle1, base::Bind(&StartedFinalizingCallback, base::Closure(), true));
181 BackgroundTracingManager::GetInstance()->TriggerNamedEvent(
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_ptr<BackgroundTracingConfig> config = CreatePreemptiveConfig();
202
203 content::BackgroundTracingManager::TriggerHandle handle =
204 content::BackgroundTracingManager::GetInstance()->RegisterTriggerType(
205 "test");
206
207 BackgroundTracingManager::GetInstance()->TriggerNamedEvent(
208 handle,
209 base::Bind(&StartedFinalizingCallback, run_loop.QuitClosure(), false));
210
211 run_loop.Run();
212
213 EXPECT_TRUE(endpoint->get_receive_count() == 0);
214 }
215 }
216
217 // This tests that no trace is triggered with a handle that isn't specified
218 // in the config.
219 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
220 DoesNotTriggerWithWrongHandle) {
221 {
222 SetupBackgroundTracingManager();
223
224 base::RunLoop run_loop;
225 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
226 new BackgroundTracingManagerTestSink(base::Closure());
227
228 scoped_ptr<BackgroundTracingPreemptiveConfig> config =
229 CreatePreemptiveConfig();
230
231 content::BackgroundTracingManager::TriggerHandle handle =
232 content::BackgroundTracingManager::GetInstance()->RegisterTriggerType(
233 "does_not_exist");
234
235 BackgroundTracingManager::GetInstance()->SetActiveScenario(config.Pass(),
236 endpoint);
237
238 BackgroundTracingManager::GetInstance()->WhenIdle(
239 base::Bind(&DisableScenarioWhenIdle));
240
241 BackgroundTracingManager::GetInstance()->TriggerNamedEvent(
242 handle,
243 base::Bind(&StartedFinalizingCallback, run_loop.QuitClosure(), false));
244
245 run_loop.Run();
246
247 EXPECT_TRUE(endpoint->get_receive_count() == 0);
248 }
249 }
250
251 // This tests that no trace is triggered with an invalid handle.
252 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
253 DoesNotTriggerWithInvalidHandle) {
254 {
255 SetupBackgroundTracingManager();
256
257 base::RunLoop run_loop;
258 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
259 new BackgroundTracingManagerTestSink(base::Closure());
260
261 scoped_ptr<BackgroundTracingPreemptiveConfig> config =
262 CreatePreemptiveConfig();
263
264 content::BackgroundTracingManager::TriggerHandle handle =
265 content::BackgroundTracingManager::GetInstance()->RegisterTriggerType(
266 "test");
267
268 content::BackgroundTracingManager::GetInstance()
269 ->InvalidateTriggerHandlesForTesting();
270
271 BackgroundTracingManager::GetInstance()->SetActiveScenario(config.Pass(),
272 endpoint);
273
274 BackgroundTracingManager::GetInstance()->WhenIdle(
275 base::Bind(&DisableScenarioWhenIdle));
276
277 BackgroundTracingManager::GetInstance()->TriggerNamedEvent(
278 handle,
279 base::Bind(&StartedFinalizingCallback, run_loop.QuitClosure(), false));
280
281 run_loop.Run();
282
283 EXPECT_TRUE(endpoint->get_receive_count() == 0);
284 }
285 }
286
287 // This tests that reactive mode configs will fail.
288 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
289 DoesNotAllowPreemptiveConfigThatsNotManual) {
290 {
291 SetupBackgroundTracingManager();
292
293 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
294 new BackgroundTracingManagerTestSink(base::Closure());
295
296 scoped_ptr<BackgroundTracingPreemptiveConfig> config(
297 new content::BackgroundTracingPreemptiveConfig());
298
299 BackgroundTracingPreemptiveConfig::MonitoringRule rule;
300 rule.type = BackgroundTracingPreemptiveConfig::
301 MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE;
302 rule.histogram_trigger_info.histogram_name_to_trigger_on = "fake";
303 rule.histogram_trigger_info.histogram_bin_to_trigger_on = 0;
304 config->configs.push_back(rule);
305
306 bool result = BackgroundTracingManager::GetInstance()->SetActiveScenario(
307 config.Pass(), endpoint);
308
309 EXPECT_FALSE(result);
310 }
311 }
312
313 // This tests that reactive mode configs will fail.
314 IN_PROC_BROWSER_TEST_F(BackgroundTracingManagerBrowserTest,
315 DoesNotAllowReactiveConfig) {
316 {
317 SetupBackgroundTracingManager();
318
319 scoped_refptr<BackgroundTracingManagerTestSink> endpoint =
320 new BackgroundTracingManagerTestSink(base::Closure());
321
322 scoped_ptr<BackgroundTracingConfig> config(
323 new BackgroundTracingReactiveConfig());
324
325 bool result = BackgroundTracingManager::GetInstance()->SetActiveScenario(
326 config.Pass(), endpoint);
327
328 EXPECT_FALSE(result);
329 }
330 }
331
332 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698