OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/files/file_util.h" | 5 #include "base/files/file_util.h" |
6 #include "base/memory/ref_counted_memory.h" | 6 #include "base/memory/ref_counted_memory.h" |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
| 8 #include "base/strings/pattern.h" |
8 #include "content/public/browser/browser_thread.h" | 9 #include "content/public/browser/browser_thread.h" |
9 #include "content/public/browser/tracing_controller.h" | 10 #include "content/public/browser/tracing_controller.h" |
10 #include "content/public/test/browser_test_utils.h" | 11 #include "content/public/test/browser_test_utils.h" |
11 #include "content/public/test/content_browser_test.h" | 12 #include "content/public/test/content_browser_test.h" |
12 #include "content/public/test/content_browser_test_utils.h" | 13 #include "content/public/test/content_browser_test_utils.h" |
13 #include "content/shell/browser/shell.h" | 14 #include "content/shell/browser/shell.h" |
14 | 15 |
15 using base::trace_event::RECORD_CONTINUOUSLY; | 16 using base::trace_event::RECORD_CONTINUOUSLY; |
16 using base::trace_event::RECORD_UNTIL_FULL; | 17 using base::trace_event::RECORD_UNTIL_FULL; |
17 using base::trace_event::TraceConfig; | 18 using base::trace_event::TraceConfig; |
18 | 19 |
19 namespace content { | 20 namespace content { |
20 | 21 |
| 22 namespace { |
| 23 |
| 24 bool IsTraceEventArgsWhitelisted( |
| 25 const char* category_group_name, |
| 26 const char* event_name, |
| 27 base::trace_event::ArgumentNameFilterPredicate* arg_filter) { |
| 28 if (base::MatchPattern(category_group_name, "benchmark") && |
| 29 base::MatchPattern(event_name, "whitelisted")) { |
| 30 return true; |
| 31 } |
| 32 return false; |
| 33 } |
| 34 |
| 35 } // namespace |
| 36 |
21 class TracingControllerTestEndpoint | 37 class TracingControllerTestEndpoint |
22 : public TracingController::TraceDataEndpoint { | 38 : public TracingController::TraceDataEndpoint { |
23 public: | 39 public: |
24 TracingControllerTestEndpoint( | 40 TracingControllerTestEndpoint( |
25 base::Callback<void(scoped_ptr<const base::DictionaryValue>, | 41 base::Callback<void(scoped_ptr<const base::DictionaryValue>, |
26 base::RefCountedString*)> done_callback) | 42 base::RefCountedString*)> done_callback) |
27 : done_callback_(done_callback) {} | 43 : done_callback_(done_callback) {} |
28 | 44 |
29 void ReceiveTraceChunk(const std::string& chunk) override { | 45 void ReceiveTraceChunk(const std::string& chunk) override { |
30 EXPECT_FALSE(chunk.empty()); | 46 EXPECT_FALSE(chunk.empty()); |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 enable_recording_done_callback_count_++; | 100 enable_recording_done_callback_count_++; |
85 quit_callback.Run(); | 101 quit_callback.Run(); |
86 } | 102 } |
87 | 103 |
88 void StopTracingStringDoneCallbackTest( | 104 void StopTracingStringDoneCallbackTest( |
89 base::Closure quit_callback, | 105 base::Closure quit_callback, |
90 scoped_ptr<const base::DictionaryValue> metadata, | 106 scoped_ptr<const base::DictionaryValue> metadata, |
91 base::RefCountedString* data) { | 107 base::RefCountedString* data) { |
92 disable_recording_done_callback_count_++; | 108 disable_recording_done_callback_count_++; |
93 last_metadata_.reset(metadata.release()); | 109 last_metadata_.reset(metadata.release()); |
| 110 last_data_ = data->data(); |
94 EXPECT_TRUE(data->size() > 0); | 111 EXPECT_TRUE(data->size() > 0); |
95 quit_callback.Run(); | 112 quit_callback.Run(); |
96 } | 113 } |
97 | 114 |
98 void StopTracingFileDoneCallbackTest(base::Closure quit_callback, | 115 void StopTracingFileDoneCallbackTest(base::Closure quit_callback, |
99 const base::FilePath& file_path) { | 116 const base::FilePath& file_path) { |
100 disable_recording_done_callback_count_++; | 117 disable_recording_done_callback_count_++; |
101 EXPECT_TRUE(PathExists(file_path)); | 118 EXPECT_TRUE(PathExists(file_path)); |
102 int64 file_size; | 119 int64 file_size; |
103 base::GetFileSize(file_path, &file_size); | 120 base::GetFileSize(file_path, &file_size); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
156 } | 173 } |
157 | 174 |
158 base::FilePath last_actual_monitoring_file_path() const { | 175 base::FilePath last_actual_monitoring_file_path() const { |
159 return last_actual_monitoring_file_path_; | 176 return last_actual_monitoring_file_path_; |
160 } | 177 } |
161 | 178 |
162 const base::DictionaryValue* last_metadata() const { | 179 const base::DictionaryValue* last_metadata() const { |
163 return last_metadata_.get(); | 180 return last_metadata_.get(); |
164 } | 181 } |
165 | 182 |
| 183 const std::string& last_data() const { |
| 184 return last_data_; |
| 185 } |
| 186 |
166 void TestStartAndStopTracingString() { | 187 void TestStartAndStopTracingString() { |
167 Navigate(shell()); | 188 Navigate(shell()); |
168 | 189 |
169 TracingController* controller = TracingController::GetInstance(); | 190 TracingController* controller = TracingController::GetInstance(); |
170 | 191 |
171 { | 192 { |
172 base::RunLoop run_loop; | 193 base::RunLoop run_loop; |
173 TracingController::StartTracingDoneCallback callback = | 194 TracingController::StartTracingDoneCallback callback = |
174 base::Bind(&TracingControllerTest::StartTracingDoneCallbackTest, | 195 base::Bind(&TracingControllerTest::StartTracingDoneCallbackTest, |
175 base::Unretained(this), | 196 base::Unretained(this), |
(...skipping 13 matching lines...) Expand all Loading... |
189 base::Unretained(this), | 210 base::Unretained(this), |
190 run_loop.QuitClosure()); | 211 run_loop.QuitClosure()); |
191 bool result = controller->StopTracing( | 212 bool result = controller->StopTracing( |
192 TracingController::CreateStringSink(callback)); | 213 TracingController::CreateStringSink(callback)); |
193 ASSERT_TRUE(result); | 214 ASSERT_TRUE(result); |
194 run_loop.Run(); | 215 run_loop.Run(); |
195 EXPECT_EQ(disable_recording_done_callback_count(), 1); | 216 EXPECT_EQ(disable_recording_done_callback_count(), 1); |
196 } | 217 } |
197 } | 218 } |
198 | 219 |
| 220 void TestStartAndStopTracingStringWithFilter() { |
| 221 Navigate(shell()); |
| 222 |
| 223 base::trace_event::TraceLog::GetInstance()->SetArgumentFilterPredicate( |
| 224 base::Bind(&IsTraceEventArgsWhitelisted)); |
| 225 TracingController* controller = TracingController::GetInstance(); |
| 226 |
| 227 { |
| 228 base::RunLoop run_loop; |
| 229 TracingController::StartTracingDoneCallback callback = |
| 230 base::Bind(&TracingControllerTest::StartTracingDoneCallbackTest, |
| 231 base::Unretained(this), |
| 232 run_loop.QuitClosure()); |
| 233 TraceConfig config = TraceConfig(); |
| 234 config.EnableArgumentFilter(); |
| 235 bool result = controller->StartTracing(config, callback); |
| 236 ASSERT_TRUE(result); |
| 237 run_loop.Run(); |
| 238 EXPECT_EQ(enable_recording_done_callback_count(), 1); |
| 239 } |
| 240 |
| 241 { |
| 242 base::RunLoop run_loop; |
| 243 base::Callback<void(scoped_ptr<const base::DictionaryValue>, |
| 244 base::RefCountedString*)> callback = base::Bind( |
| 245 &TracingControllerTest::StopTracingStringDoneCallbackTest, |
| 246 base::Unretained(this), |
| 247 run_loop.QuitClosure()); |
| 248 |
| 249 scoped_refptr<TracingController::TraceDataSink> trace_data_sink = |
| 250 TracingController::CreateStringSink(callback); |
| 251 base::DictionaryValue metadata; |
| 252 metadata.SetString("not-whitelisted", "this_not_found"); |
| 253 trace_data_sink->AddMetadata(metadata); |
| 254 |
| 255 bool result = controller->StopTracing(trace_data_sink); |
| 256 ASSERT_TRUE(result); |
| 257 run_loop.Run(); |
| 258 EXPECT_EQ(disable_recording_done_callback_count(), 1); |
| 259 } |
| 260 } |
| 261 |
199 void TestStartAndStopTracingCompressed() { | 262 void TestStartAndStopTracingCompressed() { |
200 Navigate(shell()); | 263 Navigate(shell()); |
201 | 264 |
202 TracingController* controller = TracingController::GetInstance(); | 265 TracingController* controller = TracingController::GetInstance(); |
203 | 266 |
204 { | 267 { |
205 base::RunLoop run_loop; | 268 base::RunLoop run_loop; |
206 TracingController::StartTracingDoneCallback callback = | 269 TracingController::StartTracingDoneCallback callback = |
207 base::Bind(&TracingControllerTest::StartTracingDoneCallbackTest, | 270 base::Bind(&TracingControllerTest::StartTracingDoneCallbackTest, |
208 base::Unretained(this), run_loop.QuitClosure()); | 271 base::Unretained(this), run_loop.QuitClosure()); |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 private: | 439 private: |
377 int get_categories_done_callback_count_; | 440 int get_categories_done_callback_count_; |
378 int enable_recording_done_callback_count_; | 441 int enable_recording_done_callback_count_; |
379 int disable_recording_done_callback_count_; | 442 int disable_recording_done_callback_count_; |
380 int enable_monitoring_done_callback_count_; | 443 int enable_monitoring_done_callback_count_; |
381 int disable_monitoring_done_callback_count_; | 444 int disable_monitoring_done_callback_count_; |
382 int capture_monitoring_snapshot_done_callback_count_; | 445 int capture_monitoring_snapshot_done_callback_count_; |
383 base::FilePath last_actual_recording_file_path_; | 446 base::FilePath last_actual_recording_file_path_; |
384 base::FilePath last_actual_monitoring_file_path_; | 447 base::FilePath last_actual_monitoring_file_path_; |
385 scoped_ptr<const base::DictionaryValue> last_metadata_; | 448 scoped_ptr<const base::DictionaryValue> last_metadata_; |
| 449 std::string last_data_; |
386 }; | 450 }; |
387 | 451 |
388 IN_PROC_BROWSER_TEST_F(TracingControllerTest, GetCategories) { | 452 IN_PROC_BROWSER_TEST_F(TracingControllerTest, GetCategories) { |
389 Navigate(shell()); | 453 Navigate(shell()); |
390 | 454 |
391 TracingController* controller = TracingController::GetInstance(); | 455 TracingController* controller = TracingController::GetInstance(); |
392 | 456 |
393 base::RunLoop run_loop; | 457 base::RunLoop run_loop; |
394 TracingController::GetCategoriesDoneCallback callback = | 458 TracingController::GetCategoriesDoneCallback callback = |
395 base::Bind(&TracingControllerTest::GetCategoriesDoneCallbackTest, | 459 base::Bind(&TracingControllerTest::GetCategoriesDoneCallbackTest, |
(...skipping 20 matching lines...) Expand all Loading... |
416 last_metadata()->GetString("user-agent", &user_agent); | 480 last_metadata()->GetString("user-agent", &user_agent); |
417 EXPECT_TRUE(user_agent.length() > 0); | 481 EXPECT_TRUE(user_agent.length() > 0); |
418 std::string os_name; | 482 std::string os_name; |
419 last_metadata()->GetString("os-name", &os_name); | 483 last_metadata()->GetString("os-name", &os_name); |
420 EXPECT_TRUE(os_name.length() > 0); | 484 EXPECT_TRUE(os_name.length() > 0); |
421 std::string cpu_brand; | 485 std::string cpu_brand; |
422 last_metadata()->GetString("cpu-brand", &cpu_brand); | 486 last_metadata()->GetString("cpu-brand", &cpu_brand); |
423 EXPECT_TRUE(cpu_brand.length() > 0); | 487 EXPECT_TRUE(cpu_brand.length() > 0); |
424 } | 488 } |
425 | 489 |
| 490 IN_PROC_BROWSER_TEST_F(TracingControllerTest, NotWhitelistedMetadataStripped) { |
| 491 TestStartAndStopTracingStringWithFilter(); |
| 492 // Check that a number of important keys exist in the metadata dictionary. |
| 493 EXPECT_TRUE(last_metadata() != NULL); |
| 494 std::string network_type; |
| 495 last_metadata()->GetString("network-type", &network_type); |
| 496 EXPECT_TRUE(network_type.length() > 0); |
| 497 EXPECT_TRUE(network_type != "__stripped__"); |
| 498 std::string user_agent; |
| 499 last_metadata()->GetString("user-agent", &user_agent); |
| 500 EXPECT_TRUE(user_agent.length() > 0); |
| 501 EXPECT_TRUE(user_agent != "__stripped__"); |
| 502 std::string os_name; |
| 503 last_metadata()->GetString("os-name", &os_name); |
| 504 EXPECT_TRUE(os_name.length() > 0); |
| 505 EXPECT_TRUE(os_name != "__stripped__"); |
| 506 std::string cpu_brand; |
| 507 last_metadata()->GetString("cpu-brand", &cpu_brand); |
| 508 EXPECT_TRUE(cpu_brand.length() > 0); |
| 509 EXPECT_TRUE(cpu_brand != "__stripped__"); |
| 510 |
| 511 // Check that the not whitelisted metadata is stripped. |
| 512 std::string not_whitelisted; |
| 513 last_metadata()->GetString("not-whitelisted", ¬_whitelisted); |
| 514 EXPECT_TRUE(not_whitelisted.length() > 0); |
| 515 EXPECT_TRUE(not_whitelisted == "__stripped__"); |
| 516 |
| 517 // Also check the string data. |
| 518 EXPECT_TRUE(last_data().size() > 0); |
| 519 EXPECT_TRUE(last_data().find("cpu-brand") != std::string::npos); |
| 520 EXPECT_TRUE(last_data().find("network-type") != std::string::npos); |
| 521 EXPECT_TRUE(last_data().find("os-name") != std::string::npos); |
| 522 EXPECT_TRUE(last_data().find("user-agent") != std::string::npos); |
| 523 |
| 524 EXPECT_TRUE(last_data().find("not-whitelisted") != std::string::npos); |
| 525 EXPECT_TRUE(last_data().find("this_not_found") == std::string::npos); |
| 526 } |
| 527 |
426 IN_PROC_BROWSER_TEST_F(TracingControllerTest, | 528 IN_PROC_BROWSER_TEST_F(TracingControllerTest, |
427 EnableAndStopTracingWithFilePath) { | 529 EnableAndStopTracingWithFilePath) { |
428 base::FilePath file_path; | 530 base::FilePath file_path; |
429 base::CreateTemporaryFile(&file_path); | 531 base::CreateTemporaryFile(&file_path); |
430 TestStartAndStopTracingFile(file_path); | 532 TestStartAndStopTracingFile(file_path); |
431 EXPECT_EQ(file_path.value(), last_actual_recording_file_path().value()); | 533 EXPECT_EQ(file_path.value(), last_actual_recording_file_path().value()); |
432 } | 534 } |
433 | 535 |
434 IN_PROC_BROWSER_TEST_F(TracingControllerTest, | 536 IN_PROC_BROWSER_TEST_F(TracingControllerTest, |
435 EnableAndStopTracingWithCompression) { | 537 EnableAndStopTracingWithCompression) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 trace_config, | 593 trace_config, |
492 TracingController::StartMonitoringDoneCallback())); | 594 TracingController::StartMonitoringDoneCallback())); |
493 controller->CaptureMonitoringSnapshot(NULL); | 595 controller->CaptureMonitoringSnapshot(NULL); |
494 base::RunLoop().RunUntilIdle(); | 596 base::RunLoop().RunUntilIdle(); |
495 EXPECT_TRUE(controller->StopMonitoring( | 597 EXPECT_TRUE(controller->StopMonitoring( |
496 TracingController::StopMonitoringDoneCallback())); | 598 TracingController::StopMonitoringDoneCallback())); |
497 base::RunLoop().RunUntilIdle(); | 599 base::RunLoop().RunUntilIdle(); |
498 } | 600 } |
499 | 601 |
500 } // namespace content | 602 } // namespace content |
OLD | NEW |