Index: content/browser/tracing/tracing_controller_browsertest.cc |
diff --git a/content/browser/tracing/tracing_controller_browsertest.cc b/content/browser/tracing/tracing_controller_browsertest.cc |
index 3da54e8b4dbf90a60742096b760024f2c93d9a5a..6ab44ca34c4cec39c9310a98e576e3cc9576def2 100644 |
--- a/content/browser/tracing/tracing_controller_browsertest.cc |
+++ b/content/browser/tracing/tracing_controller_browsertest.cc |
@@ -5,6 +5,7 @@ |
#include "base/files/file_util.h" |
#include "base/memory/ref_counted_memory.h" |
#include "base/run_loop.h" |
+#include "base/strings/pattern.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/tracing_controller.h" |
#include "content/public/test/browser_test_utils.h" |
@@ -18,6 +19,37 @@ using base::trace_event::TraceConfig; |
namespace content { |
+namespace { |
+ |
+const char* kMetadataWhitelist[] = { |
+ "cpu-brand", |
+ "network-type", |
+ "os-name", |
+ "user-agent" |
+}; |
+ |
+bool IsMetadataWhitelisted(const std::string& metadata_name) { |
+ for (auto key : kMetadataWhitelist) { |
+ if (base::MatchPattern(metadata_name, key)) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
+bool IsTraceEventArgsWhitelisted( |
+ const char* category_group_name, |
+ const char* event_name, |
+ base::trace_event::ArgumentNameFilterPredicate* arg_filter) { |
+ if (base::MatchPattern(category_group_name, "benchmark") && |
+ base::MatchPattern(event_name, "whitelisted")) { |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+} // namespace |
+ |
class TracingControllerTestEndpoint |
: public TracingController::TraceDataEndpoint { |
public: |
@@ -91,6 +123,7 @@ class TracingControllerTest : public ContentBrowserTest { |
base::RefCountedString* data) { |
disable_recording_done_callback_count_++; |
last_metadata_.reset(metadata.release()); |
+ last_data_ = data->data(); |
EXPECT_TRUE(data->size() > 0); |
quit_callback.Run(); |
} |
@@ -163,6 +196,10 @@ class TracingControllerTest : public ContentBrowserTest { |
return last_metadata_.get(); |
} |
+ const std::string& last_data() const { |
+ return last_data_; |
+ } |
+ |
void TestStartAndStopTracingString() { |
Navigate(shell()); |
@@ -196,6 +233,53 @@ class TracingControllerTest : public ContentBrowserTest { |
} |
} |
+ void TestStartAndStopTracingStringWithFilter() { |
+ Navigate(shell()); |
+ |
+ base::trace_event::TraceLog::GetInstance()->SetArgumentFilterPredicate( |
+ base::Bind(&IsTraceEventArgsWhitelisted)); |
+ TracingController* controller = TracingController::GetInstance(); |
+ |
+ { |
+ base::RunLoop run_loop; |
+ TracingController::StartTracingDoneCallback callback = |
+ base::Bind(&TracingControllerTest::StartTracingDoneCallbackTest, |
+ base::Unretained(this), |
+ run_loop.QuitClosure()); |
+ |
+ TraceConfig config = TraceConfig(); |
+ config.EnableArgumentFilter(); |
+ |
+ bool result = controller->StartTracing(config, callback); |
+ ASSERT_TRUE(result); |
+ run_loop.Run(); |
+ EXPECT_EQ(enable_recording_done_callback_count(), 1); |
+ } |
+ |
+ { |
+ base::RunLoop run_loop; |
+ base::Callback<void(scoped_ptr<const base::DictionaryValue>, |
+ base::RefCountedString*)> callback = base::Bind( |
+ &TracingControllerTest::StopTracingStringDoneCallbackTest, |
+ base::Unretained(this), |
+ run_loop.QuitClosure()); |
+ |
+ scoped_refptr<TracingController::TraceDataSink> trace_data_sink = |
+ TracingController::CreateStringSink(callback); |
+ |
+ trace_data_sink->SetMetadataFilterPredicate( |
+ base::Bind(&IsMetadataWhitelisted)); |
+ base::DictionaryValue metadata; |
+ metadata.SetString("not-whitelisted", "this_not_found"); |
+ trace_data_sink->AddMetadata(metadata); |
+ |
+ bool result = controller->StopTracing(trace_data_sink); |
+ ASSERT_TRUE(result); |
+ run_loop.Run(); |
+ EXPECT_EQ(disable_recording_done_callback_count(), 1); |
+ } |
+ } |
+ |
void TestStartAndStopTracingCompressed() { |
Navigate(shell()); |
@@ -383,6 +467,7 @@ class TracingControllerTest : public ContentBrowserTest { |
base::FilePath last_actual_recording_file_path_; |
base::FilePath last_actual_monitoring_file_path_; |
scoped_ptr<const base::DictionaryValue> last_metadata_; |
+ std::string last_data_; |
}; |
IN_PROC_BROWSER_TEST_F(TracingControllerTest, GetCategories) { |
@@ -423,6 +508,44 @@ IN_PROC_BROWSER_TEST_F(TracingControllerTest, DisableRecordingStoresMetadata) { |
EXPECT_TRUE(cpu_brand.length() > 0); |
} |
+IN_PROC_BROWSER_TEST_F(TracingControllerTest, NotWhitelistedMetadataStripped) { |
+ TestStartAndStopTracingStringWithFilter(); |
+ // Check that a number of important keys exist in the metadata dictionary. |
+ EXPECT_TRUE(last_metadata() != NULL); |
+ std::string cpu_brand; |
+ last_metadata()->GetString("cpu-brand", &cpu_brand); |
+ EXPECT_TRUE(cpu_brand.length() > 0); |
+ EXPECT_TRUE(cpu_brand != "__stripped__"); |
+ std::string network_type; |
+ last_metadata()->GetString("network-type", &network_type); |
+ EXPECT_TRUE(network_type.length() > 0); |
+ EXPECT_TRUE(network_type != "__stripped__"); |
+ std::string os_name; |
+ last_metadata()->GetString("os-name", &os_name); |
+ EXPECT_TRUE(os_name.length() > 0); |
+ EXPECT_TRUE(os_name != "__stripped__"); |
+ std::string user_agent; |
+ last_metadata()->GetString("user-agent", &user_agent); |
+ EXPECT_TRUE(user_agent.length() > 0); |
+ EXPECT_TRUE(user_agent != "__stripped__"); |
+ |
+ // Check that the not whitelisted metadata is stripped. |
+ std::string not_whitelisted; |
+ last_metadata()->GetString("not-whitelisted", ¬_whitelisted); |
+ EXPECT_TRUE(not_whitelisted.length() > 0); |
+ EXPECT_TRUE(not_whitelisted == "__stripped__"); |
+ |
+ // Also check the string data. |
+ EXPECT_TRUE(last_data().size() > 0); |
+ EXPECT_TRUE(last_data().find("cpu-brand") != std::string::npos); |
+ EXPECT_TRUE(last_data().find("network-type") != std::string::npos); |
+ EXPECT_TRUE(last_data().find("os-name") != std::string::npos); |
+ EXPECT_TRUE(last_data().find("user-agent") != std::string::npos); |
+ |
+ EXPECT_TRUE(last_data().find("not-whitelisted") != std::string::npos); |
+ EXPECT_TRUE(last_data().find("this_not_found") == std::string::npos); |
+} |
+ |
IN_PROC_BROWSER_TEST_F(TracingControllerTest, |
EnableAndStopTracingWithFilePath) { |
base::FilePath file_path; |