diff options
author | zhenw <zhenw@chromium.org> | 2016-03-17 21:59:02 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-03-18 05:00:14 +0000 |
commit | af6fe5172a632660bb0c2d70b6b7f3bbe08aa284 (patch) | |
tree | 3f0c80daa0e68c46ce7b138617a879f827ea7544 /base | |
parent | fcc3fbf1652285b2a89eabd092d35d0fdf199ac2 (diff) | |
download | chromium_src-af6fe5172a632660bb0c2d70b6b7f3bbe08aa284.zip chromium_src-af6fe5172a632660bb0c2d70b6b7f3bbe08aa284.tar.gz chromium_src-af6fe5172a632660bb0c2d70b6b7f3bbe08aa284.tar.bz2 |
Reland - Update DevTools Tracing.Start to accept trace config as a parameter
Original CL: https://crrev.com/1765153002
Forgot to decouple some statement from DCHECK, which was actually
pointed out by Primiano before. Should be fixed now.
--------------------
original description
--------------------
This CL updates Tracing.Start to accept trace config as
a parameter when starting tracing. It is backward compatible
with the old way.
Design doc: https://goo.gl/GxQ23k
BUG=579358
TBR=primiano@chromium.org,caseq@chromium.org,simonhatch@chromium.org,petrcermak@chromium.org,pfeldman@chromium.org
Review URL: https://codereview.chromium.org/1808353002
Cr-Commit-Position: refs/heads/master@{#381892}
Diffstat (limited to 'base')
-rw-r--r-- | base/trace_event/trace_config.cc | 49 | ||||
-rw-r--r-- | base/trace_event/trace_config.h | 9 | ||||
-rw-r--r-- | base/trace_event/trace_config_unittest.cc | 64 |
3 files changed, 102 insertions, 20 deletions
diff --git a/base/trace_event/trace_config.cc b/base/trace_event/trace_config.cc index d60c081..c2c7ad7 100644 --- a/base/trace_event/trace_config.cc +++ b/base/trace_event/trace_config.cc @@ -105,6 +105,10 @@ TraceConfig::TraceConfig(const std::string& category_filter_string, InitializeFromStrings(category_filter_string, trace_options_string); } +TraceConfig::TraceConfig(const DictionaryValue& config) { + InitializeFromConfigDict(config); +} + TraceConfig::TraceConfig(const std::string& config_string) { if (!config_string.empty()) InitializeFromConfigString(config_string); @@ -288,18 +292,10 @@ void TraceConfig::InitializeDefault() { excluded_categories_.push_back("*Test"); } -void TraceConfig::InitializeFromConfigString(const std::string& config_string) { - scoped_ptr<base::Value> value(base::JSONReader::Read(config_string)); - if (!value || !value->IsType(base::Value::TYPE_DICTIONARY)) { - InitializeDefault(); - return; - } - scoped_ptr<base::DictionaryValue> dict( - static_cast<base::DictionaryValue*>(value.release())); - +void TraceConfig::InitializeFromConfigDict(const DictionaryValue& dict) { record_mode_ = RECORD_UNTIL_FULL; std::string record_mode; - if (dict->GetString(kRecordModeParam, &record_mode)) { + if (dict.GetString(kRecordModeParam, &record_mode)) { if (record_mode == kRecordUntilFull) { record_mode_ = RECORD_UNTIL_FULL; } else if (record_mode == kRecordContinuously) { @@ -312,42 +308,57 @@ void TraceConfig::InitializeFromConfigString(const std::string& config_string) { } bool enable_sampling; - if (!dict->GetBoolean(kEnableSamplingParam, &enable_sampling)) + if (!dict.GetBoolean(kEnableSamplingParam, &enable_sampling)) enable_sampling_ = false; else enable_sampling_ = enable_sampling; bool enable_systrace; - if (!dict->GetBoolean(kEnableSystraceParam, &enable_systrace)) + if (!dict.GetBoolean(kEnableSystraceParam, &enable_systrace)) enable_systrace_ = false; else enable_systrace_ = enable_systrace; bool enable_argument_filter; - if (!dict->GetBoolean(kEnableArgumentFilterParam, &enable_argument_filter)) + if (!dict.GetBoolean(kEnableArgumentFilterParam, &enable_argument_filter)) enable_argument_filter_ = false; else enable_argument_filter_ = enable_argument_filter; - base::ListValue* category_list = nullptr; - if (dict->GetList(kIncludedCategoriesParam, &category_list)) + const base::ListValue* category_list = nullptr; + if (dict.GetList(kIncludedCategoriesParam, &category_list)) SetCategoriesFromIncludedList(*category_list); - if (dict->GetList(kExcludedCategoriesParam, &category_list)) + if (dict.GetList(kExcludedCategoriesParam, &category_list)) SetCategoriesFromExcludedList(*category_list); - if (dict->GetList(kSyntheticDelaysParam, &category_list)) + if (dict.GetList(kSyntheticDelaysParam, &category_list)) SetSyntheticDelaysFromList(*category_list); if (IsCategoryEnabled(MemoryDumpManager::kTraceCategory)) { // If dump triggers not set, the client is using the legacy with just // category enabled. So, use the default periodic dump config. - base::DictionaryValue* memory_dump_config = nullptr; - if (dict->GetDictionary(kMemoryDumpConfigParam, &memory_dump_config)) + const base::DictionaryValue* memory_dump_config = nullptr; + if (dict.GetDictionary(kMemoryDumpConfigParam, &memory_dump_config)) SetMemoryDumpConfig(*memory_dump_config); else SetDefaultMemoryDumpConfig(); } } +void TraceConfig::InitializeFromConfigString(const std::string& config_string) { + scoped_ptr<Value> value(JSONReader::Read(config_string)); + if (!value) + return InitializeDefault(); + + const DictionaryValue* dict = nullptr; + bool is_dict = value->GetAsDictionary(&dict); + + if (!is_dict) + return InitializeDefault(); + + DCHECK(dict); + InitializeFromConfigDict(*dict); +} + void TraceConfig::InitializeFromStrings( const std::string& category_filter_string, const std::string& trace_options_string) { diff --git a/base/trace_event/trace_config.h b/base/trace_event/trace_config.h index 81b7d51..75e001b 100644 --- a/base/trace_event/trace_config.h +++ b/base/trace_event/trace_config.h @@ -130,6 +130,10 @@ class BASE_EXPORT TraceConfig { // disabled-by-default-memory-infra category is enabled. explicit TraceConfig(const std::string& config_string); + // Functionally identical to the above, but takes a parsed dictionary as input + // instead of its JSON serialization. + explicit TraceConfig(const DictionaryValue& config); + TraceConfig(const TraceConfig& tc); ~TraceConfig(); @@ -190,7 +194,10 @@ class BASE_EXPORT TraceConfig { // in the suffix 'Debug' or 'Test'. void InitializeDefault(); - // Initialize from the config string + // Initialize from a config dictionary. + void InitializeFromConfigDict(const DictionaryValue& dict); + + // Initialize from a config string. void InitializeFromConfigString(const std::string& config_string); // Initialize from category filter and trace options strings diff --git a/base/trace_event/trace_config_unittest.cc b/base/trace_event/trace_config_unittest.cc index bd37880..1b49fdc 100644 --- a/base/trace_event/trace_config_unittest.cc +++ b/base/trace_event/trace_config_unittest.cc @@ -4,6 +4,7 @@ #include <stddef.h> +#include "base/json/json_reader.h" #include "base/macros.h" #include "base/trace_event/memory_dump_manager.h" #include "base/trace_event/trace_config.h" @@ -23,6 +24,27 @@ const char kDefaultTraceConfigString[] = "\"excluded_categories\":[\"*Debug\",\"*Test\"]," "\"record_mode\":\"record-until-full\"" "}"; + +const char kCustomTraceConfigString[] = + "{" + "\"enable_argument_filter\":true," + "\"enable_sampling\":true," + "\"enable_systrace\":true," + "\"excluded_categories\":[\"excluded\",\"exc_pattern*\"]," + "\"included_categories\":[\"included\"," + "\"inc_pattern*\"," + "\"disabled-by-default-cc\"," + "\"disabled-by-default-memory-infra\"]," + "\"memory_dump_config\":{" + "\"triggers\":[" + "{\"mode\":\"light\",\"periodic_interval_ms\":50}," + "{\"mode\":\"detailed\",\"periodic_interval_ms\":1000}" + "]" + "}," + "\"record_mode\":\"record-continuously\"," + "\"synthetic_delays\":[\"test.Delay1;16\",\"test.Delay2;32\"]" + "}"; + } // namespace TEST(TraceConfigTest, TraceConfigFromValidLegacyFormat) { @@ -259,6 +281,48 @@ TEST(TraceConfigTest, ConstructDefaultTraceConfig) { EXPECT_FALSE(tc.IsCategoryGroupEnabled("CategoryDebug,CategoryTest")); } +TEST(TraceConfigTest, TraceConfigFromDict) { + // Passing in empty dictionary will not result in default trace config. + DictionaryValue dict; + TraceConfig tc(dict); + EXPECT_STRNE(kDefaultTraceConfigString, tc.ToString().c_str()); + EXPECT_EQ(RECORD_UNTIL_FULL, tc.GetTraceRecordMode()); + EXPECT_FALSE(tc.IsSamplingEnabled()); + EXPECT_FALSE(tc.IsSystraceEnabled()); + EXPECT_FALSE(tc.IsArgumentFilterEnabled()); + EXPECT_STREQ("", tc.ToCategoryFilterString().c_str()); + + scoped_ptr<Value> default_value(JSONReader::Read(kDefaultTraceConfigString)); + DCHECK(default_value); + const DictionaryValue* default_dict = nullptr; + bool is_dict = default_value->GetAsDictionary(&default_dict); + DCHECK(is_dict); + TraceConfig default_tc(*default_dict); + EXPECT_STREQ(kDefaultTraceConfigString, default_tc.ToString().c_str()); + EXPECT_EQ(RECORD_UNTIL_FULL, default_tc.GetTraceRecordMode()); + EXPECT_FALSE(default_tc.IsSamplingEnabled()); + EXPECT_FALSE(default_tc.IsSystraceEnabled()); + EXPECT_FALSE(default_tc.IsArgumentFilterEnabled()); + EXPECT_STREQ("-*Debug,-*Test", default_tc.ToCategoryFilterString().c_str()); + + scoped_ptr<Value> custom_value(JSONReader::Read(kCustomTraceConfigString)); + DCHECK(custom_value); + const DictionaryValue* custom_dict = nullptr; + is_dict = custom_value->GetAsDictionary(&custom_dict); + DCHECK(is_dict); + TraceConfig custom_tc(*custom_dict); + EXPECT_STREQ(kCustomTraceConfigString, custom_tc.ToString().c_str()); + EXPECT_EQ(RECORD_CONTINUOUSLY, custom_tc.GetTraceRecordMode()); + EXPECT_TRUE(custom_tc.IsSamplingEnabled()); + EXPECT_TRUE(custom_tc.IsSystraceEnabled()); + EXPECT_TRUE(custom_tc.IsArgumentFilterEnabled()); + EXPECT_STREQ("included,inc_pattern*," + "disabled-by-default-cc,disabled-by-default-memory-infra," + "-excluded,-exc_pattern*," + "DELAY(test.Delay1;16),DELAY(test.Delay2;32)", + custom_tc.ToCategoryFilterString().c_str()); +} + TEST(TraceConfigTest, TraceConfigFromValidString) { // Using some non-empty config string. const char config_string[] = |