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

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

Issue 1162623002: Implement FromDict/IntoDict for BackgroundTracingConfig. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 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/json/json_reader.h"
6 #include "base/json/json_writer.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/values.h"
9 #include "content/public/browser/background_tracing_preemptive_config.h"
10 #include "content/public/browser/background_tracing_reactive_config.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 namespace content {
14
15 class BackgroundTracingConfigTest : public testing::Test {};
16
17 scoped_ptr<BackgroundTracingConfig> ReadFromJSONString(
18 const std::string& json_text) {
19 scoped_ptr<base::Value> json_value(base::JSONReader::Read(json_text));
20
21 base::DictionaryValue* dict = NULL;
22 if (json_value)
23 json_value->GetAsDictionary(&dict);
24
25 return content::BackgroundTracingConfig::FromDict(dict);
26 }
27
28 scoped_ptr<BackgroundTracingPreemptiveConfig> ReadPreemptiveFromJSONString(
29 const std::string& json_text) {
30 return make_scoped_ptr(static_cast<BackgroundTracingPreemptiveConfig*>(
31 ReadFromJSONString(json_text).release()));
32 }
33
34 scoped_ptr<BackgroundTracingReactiveConfig> ReadReactiveFromJSONString(
35 const std::string& json_text) {
36 return make_scoped_ptr(static_cast<BackgroundTracingReactiveConfig*>(
37 ReadFromJSONString(json_text).release()));
38 }
39
40 std::string ConfigToString(const BackgroundTracingConfig* config) {
41 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
42
43 BackgroundTracingConfig::IntoDict(config, dict.get());
44
45 std::string results;
46 if (base::JSONWriter::Write(*dict.get(), &results))
47 return results;
48 return "";
49 }
50
51 TEST_F(BackgroundTracingConfigTest, ConfigFromInvalidString) {
52 // The config string needs to be a properly formatted JSON dictionary.
53 EXPECT_FALSE(ReadFromJSONString(""));
54 EXPECT_FALSE(ReadFromJSONString("Invalid JSON."));
55 EXPECT_FALSE(ReadFromJSONString("[\"Invalid\"]"));
56
57 // Missing or invalid mode
58 EXPECT_FALSE(ReadFromJSONString("{}"));
59 EXPECT_FALSE(ReadFromJSONString("{\"mode\":\"invalid\"}"));
60 }
61
62 TEST_F(BackgroundTracingConfigTest, PreemptiveConfigFromInvalidString) {
63 // Missing or invalid category
64 EXPECT_FALSE(ReadFromJSONString("{\"mode\":\"preemptive\"}"));
65 EXPECT_FALSE(ReadFromJSONString(
66 "{\"mode\":\"preemptive\", \"category\": \"invalid\"}"));
67
68 // Missing or invalid configs
69 EXPECT_FALSE(ReadFromJSONString(
70 "{\"mode\":\"preemptive\", \"category\": \"benchmark\"}"));
71 EXPECT_FALSE(ReadFromJSONString(
72 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
73 "\"configs\": \"\"}"));
74 EXPECT_FALSE(ReadFromJSONString(
75 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
76 "\"configs\": {}}"));
77
78 // Invalid config entries
79 EXPECT_FALSE(ReadFromJSONString(
80 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
81 "\"configs\": [{}]}"));
82 EXPECT_FALSE(ReadFromJSONString(
83 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
84 "\"configs\": [\"invalid\"]}"));
85 EXPECT_FALSE(ReadFromJSONString(
86 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
87 "\"configs\": [[]]}"));
88 EXPECT_FALSE(ReadFromJSONString(
89 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
90 "\"configs\": [{\"rule\": \"invalid\"}]}"));
91
92 // Missing or invalid keys for a named trigger.
93 EXPECT_FALSE(ReadFromJSONString(
94 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
95 "\"configs\": [{\"rule\": \"monitor_named\"}]}"));
96 // EXPECT_FALSE(ReadFromJSONString(
97 // "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
98 // "\"configs\": [{\"rule\": \"monitor_named\", \"trigger_name\":
99 // \"foo\"}]}"));
100 }
101
102 TEST_F(BackgroundTracingConfigTest, ReactiveConfigFromInvalidString) {
103 // Missing or invalid configs
104 EXPECT_FALSE(ReadFromJSONString("{\"mode\":\"reactive\"}"));
105 EXPECT_FALSE(
106 ReadFromJSONString("{\"mode\":\"reactive\", \"configs\": \"invalid\"}"));
107 EXPECT_FALSE(ReadFromJSONString("{\"mode\":\"reactive\", \"configs\": {}}"));
108
109 // Invalid config entries
110 EXPECT_FALSE(
111 ReadFromJSONString("{\"mode\":\"reactive\", \"configs\": [{}]}"));
112 EXPECT_FALSE(ReadFromJSONString(
113 "{\"mode\":\"reactive\", \"configs\": [\"invalid\"]}"));
114
115 // Invalid tracing rule type
116 EXPECT_FALSE(ReadFromJSONString(
117 "{\"mode\":\"reactive\","
118 "\"configs\": [{\"rule\": []}]}"));
119 EXPECT_FALSE(ReadFromJSONString(
120 "{\"mode\":\"reactive\","
121 "\"configs\": [{\"rule\": \"\"}]}"));
122 EXPECT_FALSE(ReadFromJSONString(
123 "{\"mode\":\"reactive\","
124 "\"configs\": [{\"rule\": "
125 "\"trace_on_trigger_or_10s_or_trigger_or_full\"}]}"));
126
127 EXPECT_FALSE(ReadFromJSONString(
128 "{\"mode\":\"reactive\","
129 "\"configs\": [{\"rule\": "
130 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": []}]}"));
131 EXPECT_FALSE(ReadFromJSONString(
132 "{\"mode\":\"reactive\","
133 "\"configs\": [{\"rule\": "
134 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": \"\"}]}"));
135 EXPECT_FALSE(ReadFromJSONString(
136 "{\"mode\":\"reactive\","
137 "\"configs\": [{\"rule\": "
138 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": "
139 "\"benchmark\"}]}"));
140
141 EXPECT_FALSE(ReadFromJSONString(
142 "{\"mode\":\"reactive\","
143 "\"configs\": [{\"rule\": "
144 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": "
145 "\"benchmark\", \"trigger_name\": []}]}"));
146 EXPECT_FALSE(ReadFromJSONString(
147 "{\"mode\":\"reactive\","
148 "\"configs\": [{\"rule\": "
149 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": "
150 "\"benchmark\", \"trigger_name\": 0}]}"));
151 }
152
153 TEST_F(BackgroundTracingConfigTest, PreemptiveConfigFromValidString) {
154 scoped_ptr<BackgroundTracingPreemptiveConfig> config;
155
156 config = ReadPreemptiveFromJSONString(
157 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
158 "\"configs\": []}");
159 EXPECT_TRUE(config);
160 EXPECT_EQ(config->mode, BackgroundTracingConfig::PREEMPTIVE_TRACING_MODE);
161 EXPECT_EQ(config->category_preset, BackgroundTracingConfig::BENCHMARK);
162 EXPECT_EQ(config->configs.size(), 0u);
163
164 config = ReadPreemptiveFromJSONString(
165 "{\"mode\":\"preemptive\", \"category\": \"benchmark-deep\","
166 "\"configs\": []}");
167 EXPECT_TRUE(config);
168 EXPECT_EQ(config->mode, BackgroundTracingConfig::PREEMPTIVE_TRACING_MODE);
169 EXPECT_EQ(config->category_preset, BackgroundTracingConfig::BENCHMARK_DEEP);
170 EXPECT_EQ(config->configs.size(), 0u);
171
172 config = ReadPreemptiveFromJSONString(
173 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
174 "\"configs\": [{\"rule\": \"monitor_named\", \"trigger_name\":"
175 "\"foo\"}]}");
176 EXPECT_TRUE(config);
177 EXPECT_EQ(config->mode, BackgroundTracingConfig::PREEMPTIVE_TRACING_MODE);
178 EXPECT_EQ(config->category_preset, BackgroundTracingConfig::BENCHMARK);
179 EXPECT_EQ(config->configs.size(), 1u);
180 EXPECT_EQ(
181 config->configs[0].type,
182 BackgroundTracingPreemptiveConfig::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED);
183 EXPECT_EQ(config->configs[0].named_trigger_info.trigger_name, "foo");
184
185 config = ReadPreemptiveFromJSONString(
186 "{\"mode\":\"preemptive\", \"category\": \"benchmark\","
187 "\"configs\": [{\"rule\": \"monitor_named\", \"trigger_name\":"
188 "\"foo1\"}, {\"rule\": \"monitor_named\", \"trigger_name\":"
189 "\"foo2\"}]}");
190 EXPECT_TRUE(config);
191 EXPECT_EQ(config->mode, BackgroundTracingConfig::PREEMPTIVE_TRACING_MODE);
192 EXPECT_EQ(config->category_preset, BackgroundTracingConfig::BENCHMARK);
193 EXPECT_EQ(config->configs.size(), 2u);
194 EXPECT_EQ(
195 config->configs[0].type,
196 BackgroundTracingPreemptiveConfig::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED);
197 EXPECT_EQ(config->configs[0].named_trigger_info.trigger_name, "foo1");
198 EXPECT_EQ(
199 config->configs[1].type,
200 BackgroundTracingPreemptiveConfig::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED);
201 EXPECT_EQ(config->configs[1].named_trigger_info.trigger_name, "foo2");
202 }
203
204 TEST_F(BackgroundTracingConfigTest, ReactiveConfigFromValidString) {
205 scoped_ptr<BackgroundTracingReactiveConfig> config;
206
207 config =
208 ReadReactiveFromJSONString("{\"mode\":\"reactive\", \"configs\": []}");
209 EXPECT_TRUE(config);
210 EXPECT_EQ(config->mode, BackgroundTracingConfig::REACTIVE_TRACING_MODE);
211 EXPECT_EQ(config->configs.size(), 0u);
212
213 config = ReadReactiveFromJSONString(
214 "{\"mode\":\"reactive\","
215 "\"configs\": [{\"rule\": "
216 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": "
217 "\"benchmark\", \"trigger_name\": \"foo\"}]}");
218 EXPECT_TRUE(config);
219 EXPECT_EQ(config->mode, BackgroundTracingConfig::REACTIVE_TRACING_MODE);
220 EXPECT_EQ(config->configs.size(), 1u);
221 EXPECT_EQ(config->configs[0].type,
222 BackgroundTracingReactiveConfig::
223 TRACE_ON_MANUAL_TRIGGER_UNTIL_10S_OR_NEXT_TRIGGER_OR_FULL);
224 EXPECT_EQ(config->configs[0].trigger_name, "foo");
225 EXPECT_EQ(config->configs[0].category_preset,
226 BackgroundTracingConfig::BENCHMARK);
227
228 config = ReadReactiveFromJSONString(
229 "{\"mode\":\"reactive\","
230 "\"configs\": [{\"rule\": "
231 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": "
232 "\"benchmark-deep\", \"trigger_name\": \"foo\"}]}");
233 EXPECT_TRUE(config);
234 EXPECT_EQ(config->mode, BackgroundTracingConfig::REACTIVE_TRACING_MODE);
235 EXPECT_EQ(config->configs.size(), 1u);
236 EXPECT_EQ(config->configs[0].type,
237 BackgroundTracingReactiveConfig::
238 TRACE_ON_MANUAL_TRIGGER_UNTIL_10S_OR_NEXT_TRIGGER_OR_FULL);
239 EXPECT_EQ(config->configs[0].trigger_name, "foo");
240 EXPECT_EQ(config->configs[0].category_preset,
241 BackgroundTracingConfig::BENCHMARK_DEEP);
242
243 config = ReadReactiveFromJSONString(
244 "{\"mode\":\"reactive\","
245 "\"configs\": [{\"rule\": "
246 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": "
247 "\"benchmark-deep\", \"trigger_name\": \"foo1\"},"
248 "{\"rule\": "
249 "\"trace_on_trigger_or_10s_or_trigger_or_full\", \"category\": "
250 "\"benchmark-deep\", \"trigger_name\": \"foo2\"}]}");
251 EXPECT_TRUE(config);
252 EXPECT_EQ(config->mode, BackgroundTracingConfig::REACTIVE_TRACING_MODE);
253 EXPECT_EQ(config->configs.size(), 2u);
254 EXPECT_EQ(config->configs[0].type,
255 BackgroundTracingReactiveConfig::
256 TRACE_ON_MANUAL_TRIGGER_UNTIL_10S_OR_NEXT_TRIGGER_OR_FULL);
257 EXPECT_EQ(config->configs[0].trigger_name, "foo1");
258 EXPECT_EQ(config->configs[0].category_preset,
259 BackgroundTracingConfig::BENCHMARK_DEEP);
260 EXPECT_EQ(config->configs[1].type,
261 BackgroundTracingReactiveConfig::
262 TRACE_ON_MANUAL_TRIGGER_UNTIL_10S_OR_NEXT_TRIGGER_OR_FULL);
263 EXPECT_EQ(config->configs[1].trigger_name, "foo2");
264 EXPECT_EQ(config->configs[1].category_preset,
265 BackgroundTracingConfig::BENCHMARK_DEEP);
266 }
267
268 TEST_F(BackgroundTracingConfigTest, ValidPreemptiveConfigToString) {
269 scoped_ptr<BackgroundTracingPreemptiveConfig> config(
270 new BackgroundTracingPreemptiveConfig());
271
272 // Default values
273 EXPECT_EQ(
274 ConfigToString(config.get()),
275 "{\"category\":\"benchmark\",\"configs\":[],\"mode\":\"preemptive\"}");
276
277 // Change category_preset
278 config->category_preset = BackgroundTracingConfig::BENCHMARK_DEEP;
279 EXPECT_EQ(ConfigToString(config.get()),
280 "{\"category\":\"benchmark-deep\",\"configs\":[],\"mode\":"
281 "\"preemptive\"}");
282
283 {
284 config.reset(new BackgroundTracingPreemptiveConfig());
285 config->category_preset = BackgroundTracingConfig::BENCHMARK_DEEP;
286
287 BackgroundTracingPreemptiveConfig::MonitoringRule rule;
288 rule.type =
289 BackgroundTracingPreemptiveConfig::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED;
290 rule.named_trigger_info.trigger_name = "foo";
291 config->configs.push_back(rule);
292 EXPECT_EQ(ConfigToString(config.get()),
293 "{\"category\":\"benchmark-deep\",\"configs\":[{\"rule\":"
294 "\"monitor_named\",\"trigger_name\":\"foo\"}],\"mode\":"
295 "\"preemptive\"}");
296 }
297
298 {
299 config.reset(new BackgroundTracingPreemptiveConfig());
300 config->category_preset = BackgroundTracingConfig::BENCHMARK_DEEP;
301
302 BackgroundTracingPreemptiveConfig::MonitoringRule rule;
303 rule.type =
304 BackgroundTracingPreemptiveConfig::MONITOR_AND_DUMP_WHEN_TRIGGER_NAMED;
305 rule.named_trigger_info.trigger_name = "foo1";
306 config->configs.push_back(rule);
307 rule.named_trigger_info.trigger_name = "foo2";
308 config->configs.push_back(rule);
309 EXPECT_EQ(ConfigToString(config.get()),
310 "{\"category\":\"benchmark-deep\",\"configs\":[{\"rule\":"
311 "\"monitor_named\",\"trigger_name\":\"foo1\"},{\"rule\":"
312 "\"monitor_named\",\"trigger_name\":\"foo2\"}],\"mode\":"
313 "\"preemptive\"}");
314 }
315 }
316
317 TEST_F(BackgroundTracingConfigTest, InvalidPreemptiveConfigToString) {
318 scoped_ptr<BackgroundTracingPreemptiveConfig> config;
319
320 {
321 config.reset(new BackgroundTracingPreemptiveConfig());
322
323 BackgroundTracingPreemptiveConfig::MonitoringRule rule;
324 rule.type = BackgroundTracingPreemptiveConfig::
325 MONITOR_AND_DUMP_WHEN_SPECIFIC_HISTOGRAM_AND_VALUE;
326 config->configs.push_back(rule);
327 EXPECT_EQ(ConfigToString(config.get()), "{}");
328 }
329
330 {
331 config.reset(new BackgroundTracingPreemptiveConfig());
332
333 BackgroundTracingPreemptiveConfig::MonitoringRule rule;
334 rule.type = BackgroundTracingPreemptiveConfig::
335 MONITOR_AND_DUMP_WHEN_BROWSER_STARTUP_COMPLETE;
336 config->configs.push_back(rule);
337 EXPECT_EQ(ConfigToString(config.get()), "{}");
338 }
339 }
340
341 TEST_F(BackgroundTracingConfigTest, ValidReactiveConfigToString) {
342 scoped_ptr<BackgroundTracingReactiveConfig> config(
343 new BackgroundTracingReactiveConfig());
344
345 // Default values
346 EXPECT_EQ(ConfigToString(config.get()),
347 "{\"configs\":[],\"mode\":\"reactive\"}");
348
349 {
350 config.reset(new BackgroundTracingReactiveConfig());
351
352 BackgroundTracingReactiveConfig::TracingRule rule;
353 rule.type = BackgroundTracingReactiveConfig::
354 TRACE_ON_MANUAL_TRIGGER_UNTIL_10S_OR_NEXT_TRIGGER_OR_FULL;
355 rule.trigger_name = "foo";
356 rule.category_preset = BackgroundTracingConfig::BENCHMARK_DEEP;
357 config->configs.push_back(rule);
358 EXPECT_EQ(ConfigToString(config.get()),
359 "{\"configs\":[{\"category\":\"benchmark-deep\",\"rule\":\"trace_"
360 "on_trigger_or_10s_or_trigger_or_full\",\"trigger_name\":\"foo\"}"
361 "],\"mode\":\"reactive\"}");
362 }
363
364 {
365 config.reset(new BackgroundTracingReactiveConfig());
366
367 BackgroundTracingReactiveConfig::TracingRule rule;
368 rule.type = BackgroundTracingReactiveConfig::
369 TRACE_ON_MANUAL_TRIGGER_UNTIL_10S_OR_NEXT_TRIGGER_OR_FULL;
370 rule.trigger_name = "foo1";
371 rule.category_preset = BackgroundTracingConfig::BENCHMARK_DEEP;
372 config->configs.push_back(rule);
373 rule.trigger_name = "foo2";
374 config->configs.push_back(rule);
375 EXPECT_EQ(ConfigToString(config.get()),
376 "{\"configs\":[{\"category\":\"benchmark-deep\",\"rule\":\"trace_"
377 "on_trigger_or_10s_or_trigger_or_full\",\"trigger_name\":"
378 "\"foo1\"},{\"category\":\"benchmark-deep\",\"rule\":\"trace_on_"
379 "trigger_or_10s_or_trigger_or_full\",\"trigger_name\":\"foo2\"}],"
380 "\"mode\":\"reactive\"}");
381 }
382 }
383
384 #if defined(GTEST_HAS_DEATH_TEST)
385 #endif
386
387 } // namspace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698